From d63f79325f85e014361eb8cf1e41eaebedb1ae71 Mon Sep 17 00:00:00 2001 From: void_17 Date: Mon, 2 Mar 2026 15:53:32 +0700 Subject: Get rid of MSVC's __int64 Use either int64_t, uint64_t or long long and unsigned long long, defined as per C++11 standard --- Minecraft.World/ConsoleSaveFileOriginal.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'Minecraft.World/ConsoleSaveFileOriginal.cpp') diff --git a/Minecraft.World/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleSaveFileOriginal.cpp index 139d99ac..58765a4c 100644 --- a/Minecraft.World/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/ConsoleSaveFileOriginal.cpp @@ -35,7 +35,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID // 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. - // AP - The Vita doesn't have virtual memory so a pretend system has been implemented in PSVitaStubs.cpp. + // AP - The Vita doesn't have virtual memory so a pretend system has been implemented in PSVitaStubs.cpp. // All access to the memory must be done via the access function as the pointer returned from VirtualAlloc // can't be used directly. pvHeap = VirtualAlloc(NULL, MAX_PAGE_COUNT * CSF_PAGE_SIZE, RESERVE_ALLOCATION, PAGE_READWRITE ); @@ -116,7 +116,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID #endif app.DebugPrintf("Filesize - %d, Adjusted size - %d\n",fileSize,storageLength); fileSize = storageLength; - } + } #ifdef __PSVITA__ if(plat == SAVE_FILE_PLATFORM_PSVITA) @@ -202,7 +202,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID } else - { + { // Clear the first 8 bytes that reference the header header.WriteHeader( pvSaveMem ); } @@ -213,7 +213,7 @@ ConsoleSaveFileOriginal::~ConsoleSaveFileOriginal() 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 +#if defined _XBOX app.GetSaveThumbnail(NULL,NULL); #elif defined __PS3__ app.GetSaveThumbnail(NULL,NULL, NULL,NULL); @@ -548,7 +548,7 @@ void ConsoleSaveFileOriginal::MoveDataBeyond(FileEntry *file, DWORD nNumberOfByt if ( uiCopyEnd > uiFromEnd ) { // Needs to be clamped to the end of our region - uiCopyEnd = uiFromEnd; + uiCopyEnd = uiFromEnd; } #ifdef __PSVITA__ // AP - use this to access the virtual memory @@ -749,7 +749,7 @@ void ConsoleSaveFileOriginal::Flush(bool autosave, bool updateThumbnail ) BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - __int64 seed = 0; + int64_t seed = 0; bool hasSeed = false; if(MinecraftServer::getInstance()!= NULL && MinecraftServer::getInstance()->levels[0]!=NULL) { @@ -765,7 +765,7 @@ void ConsoleSaveFileOriginal::Flush(bool autosave, bool updateThumbnail ) #ifdef _XBOX StorageManager.SaveSaveData( compLength+8,pbThumbnailData,dwThumbnailDataSize,bTextMetadata,iTextMetadataBytes ); - delete [] pbThumbnailData; + delete [] pbThumbnailData; #ifndef _CONTENT_PACKAGE if( app.DebugSettingsOn()) { -- cgit v1.2.3 From b9a2951901dac21b08589c9d8b4a7eae78757726 Mon Sep 17 00:00:00 2001 From: void_17 Date: Mon, 2 Mar 2026 17:39:35 +0700 Subject: Revert "Get rid of MSVC's __int64" This reverts commit d63f79325f85e014361eb8cf1e41eaebedb1ae71. --- Minecraft.Client/AchievementPopup.h | 2 +- Minecraft.Client/Common/Consoles_App.cpp | 620 ++++++++++----------- Minecraft.Client/Common/Consoles_App.h | 66 +-- .../GameRules/ApplySchematicRuleDefinition.h | 8 +- .../Common/GameRules/ConsoleSchematicFile.cpp | 34 +- .../Common/GameRules/ConsoleSchematicFile.h | 6 +- Minecraft.Client/Common/GameRules/GameRule.h | 4 +- .../Common/GameRules/GameRuleManager.cpp | 38 +- .../Common/GameRules/LevelGenerationOptions.cpp | 30 +- .../Common/GameRules/LevelGenerationOptions.h | 12 +- .../Common/Network/GameNetworkManager.cpp | 96 ++-- .../Common/Network/GameNetworkManager.h | 18 +- .../Common/Network/Sony/SonyRemoteStorage.cpp | 30 +- .../Common/Network/Sony/SonyRemoteStorage.h | 10 +- Minecraft.Client/Common/Tutorial/Tutorial.cpp | 30 +- .../Common/UI/UIComponent_Panorama.cpp | 6 +- .../Common/UI/UIControl_SpaceIndicatorBar.cpp | 12 +- .../Common/UI/UIControl_SpaceIndicatorBar.h | 16 +- Minecraft.Client/Common/UI/UIController.cpp | 60 +- Minecraft.Client/Common/UI/UIController.h | 16 +- Minecraft.Client/Common/UI/UIGroup.cpp | 16 +- Minecraft.Client/Common/UI/UIGroup.h | 12 +- Minecraft.Client/Common/UI/UILayer.cpp | 34 +- Minecraft.Client/Common/UI/UILayer.h | 8 +- Minecraft.Client/Common/UI/UIScene.cpp | 50 +- Minecraft.Client/Common/UI/UIScene.h | 16 +- .../Common/UI/UIScene_CreateWorldMenu.cpp | 68 +-- Minecraft.Client/Common/UI/UIScene_LoadMenu.h | 14 +- .../Common/UI/UIScene_LoadOrJoinMenu.cpp | 136 ++--- .../Common/XUI/XUI_MultiGameCreate.cpp | 94 ++-- .../Common/XUI/XUI_MultiGameJoinLoad.cpp | 180 +++--- Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp | 102 ++-- Minecraft.Client/Common/zlib/zconf.h | 2 +- Minecraft.Client/CreateWorldScreen.cpp | 4 +- Minecraft.Client/DemoLevel.h | 2 +- Minecraft.Client/DemoMode.cpp | 6 +- Minecraft.Client/Durango/Durango_App.cpp | 30 +- Minecraft.Client/Durango/Iggy/include/rrCore.h | 56 +- Minecraft.Client/Durango/Miles/include/mss.h | 428 +++++++------- Minecraft.Client/Durango/Miles/include/rrCore.h | 56 +- .../Durango/Network/DQRNetworkManager.cpp | 120 ++-- .../Durango/Network/DQRNetworkManager.h | 24 +- .../ServiceConfig/Events-XBLA.8-149E11AEEvents.h | 18 +- Minecraft.Client/Durango/XML/ATGXmlParser.cpp | 408 +++++++------- Minecraft.Client/GameRenderer.cpp | 52 +- Minecraft.Client/GameRenderer.h | 6 +- Minecraft.Client/Gui.cpp | 98 ++-- Minecraft.Client/Gui.h | 4 +- Minecraft.Client/LevelRenderer.cpp | 84 +-- Minecraft.Client/LevelRenderer.h | 6 +- Minecraft.Client/LocalPlayer.h | 12 +- Minecraft.Client/MinecartRenderer.cpp | 4 +- Minecraft.Client/Minecraft.cpp | 70 +-- Minecraft.Client/Minecraft.h | 16 +- Minecraft.Client/MinecraftServer.cpp | 106 ++-- Minecraft.Client/MinecraftServer.h | 26 +- Minecraft.Client/Orbis/Iggy/include/rrCore.h | 56 +- Minecraft.Client/Orbis/Miles/include/mss.h | 428 +++++++------- Minecraft.Client/Orbis/Miles/include/rrCore.h | 56 +- .../Orbis/Network/SQRNetworkManager_Orbis.cpp | 166 +++--- .../Orbis/Network/SQRNetworkManager_Orbis.h | 14 +- Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp | 154 ++--- Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.h | 90 +-- Minecraft.Client/Orbis/OrbisExtras/OrbisTypes.h | 2 + Minecraft.Client/Orbis/Orbis_App.cpp | 70 +-- Minecraft.Client/Orbis/user_malloc.cpp | 6 +- Minecraft.Client/PS3/Iggy/include/rrCore.h | 56 +- Minecraft.Client/PS3/Miles/include/mss.h | 428 +++++++------- Minecraft.Client/PS3/Miles/include/rrCore.h | 56 +- .../PS3/Network/SonyRemoteStorage_PS3.cpp | 72 +-- .../Server/HeapInspectorServerTypes.h | 4 +- Minecraft.Client/PS3/PS3Extras/Ps3Stubs.cpp | 192 +++---- Minecraft.Client/PS3/PS3Extras/Ps3Stubs.h | 90 +-- Minecraft.Client/PS3/PS3Extras/Ps3Types.h | 28 +- .../archive/detail/polymorphic_iarchive_route.hpp | 6 +- .../boost/archive/polymorphic_iarchive.hpp | 10 +- .../boost/archive/polymorphic_oarchive.hpp | 8 +- .../boost/asio/detail/old_win_sdk_compat.hpp | 4 +- .../boost/atomic/detail/interlocked.hpp | 30 +- .../boost/chrono/detail/inlined/win/chrono.hpp | 8 +- .../PS3Extras/boost_1_53_0/boost/concept_check.hpp | 8 +- .../boost_1_53_0/boost/config/compiler/borland.hpp | 6 +- .../boost_1_53_0/boost/config/compiler/clang.hpp | 6 +- .../boost/config/compiler/codegear.hpp | 4 +- .../boost_1_53_0/boost/config/compiler/comeau.hpp | 18 +- .../boost_1_53_0/boost/config/compiler/visualc.hpp | 42 +- .../boost_1_53_0/boost/config/stdlib/roguewave.hpp | 16 +- .../PS3Extras/boost_1_53_0/boost/config/suffix.hpp | 14 +- .../PS3/PS3Extras/boost_1_53_0/boost/cstdint.hpp | 198 +++---- .../boost_1_53_0/boost/detail/win/basic_types.hpp | 4 +- .../boost/detail/win/synchronization.hpp | 48 +- .../PS3/PS3Extras/boost_1_53_0/boost/integer.hpp | 28 +- .../boost_1_53_0/boost/integer/integer_mask.hpp | 4 +- .../PS3Extras/boost_1_53_0/boost/integer_fwd.hpp | 4 +- .../boost_1_53_0/boost/integer_traits.hpp | 12 +- .../boost/interprocess/detail/win32_api.hpp | 30 +- .../sync/windows/named_condition_any.hpp | 2 +- .../interprocess/sync/windows/named_semaphore.hpp | 2 +- .../boost/interprocess/sync/windows/named_sync.hpp | 4 +- .../boost/interprocess/sync/windows/sync_utils.hpp | 2 +- .../boost/iostreams/detail/config/rtl.hpp | 14 +- .../PS3Extras/boost_1_53_0/boost/lexical_cast.hpp | 190 +++---- .../PS3/PS3Extras/boost_1_53_0/boost/limits.hpp | 16 +- .../boost_1_53_0/boost/math/common_factor_rt.hpp | 8 +- .../boost/math/concepts/real_concept.hpp | 8 +- .../PS3Extras/boost_1_53_0/boost/mpi/datatype.hpp | 20 +- .../boost/multi_index/detail/uintptr_type.hpp | 2 +- .../numeric/conversion/detail/old_numeric_cast.hpp | 8 +- .../boost/signals2/detail/lwm_win32_cs.hpp | 2 +- .../boost/smart_ptr/detail/lwm_win32_cs.hpp | 2 +- .../PS3Extras/boost_1_53_0/boost/tr1/complex.hpp | 14 +- .../boost/type_traits/integral_promotion.hpp | 18 +- .../boost_1_53_0/boost/type_traits/is_integral.hpp | 10 +- .../boost_1_53_0/boost/type_traits/make_signed.hpp | 20 +- .../boost/type_traits/make_unsigned.hpp | 20 +- .../boost/typeof/register_fundamental.hpp | 8 +- .../boost_1_53_0/boost/wave/wave_config.hpp | 144 ++--- Minecraft.Client/PS3/PS3_App.cpp | 68 +-- .../CompressedTile/SparseDataStorage_SPU.h | 6 +- .../CompressedTile/SparseLightStorage_SPU.h | 6 +- Minecraft.Client/PSVita/Iggy/include/rrCore.h | 56 +- Minecraft.Client/PSVita/Miles/include/mss.h | 428 +++++++------- Minecraft.Client/PSVita/Miles/include/rrCore.h | 56 +- .../PSVita/Network/SonyRemoteStorage_Vita.cpp | 62 +-- Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h | 94 ++-- Minecraft.Client/PSVita/PSVitaExtras/PSVitaTypes.h | 4 +- .../PSVita/PSVitaExtras/PsVitaStubs.cpp | 174 +++--- Minecraft.Client/PSVita/PSVitaExtras/libdivide.h | 292 +++++----- Minecraft.Client/PSVita/PSVitaExtras/zconf.h | 2 +- Minecraft.Client/PSVita/PSVita_App.cpp | 96 ++-- Minecraft.Client/PlayerChunkMap.cpp | 28 +- Minecraft.Client/PlayerChunkMap.h | 2 +- Minecraft.Client/PlayerConnection.h | 10 +- Minecraft.Client/ProgressRenderer.cpp | 6 +- Minecraft.Client/ProgressRenderer.h | 2 +- Minecraft.Client/ScrolledSelectionList.h | 4 +- Minecraft.Client/SelectWorldScreen.cpp | 4 +- Minecraft.Client/ServerLevel.cpp | 38 +- Minecraft.Client/ServerLevel.h | 4 +- Minecraft.Client/ServerPlayer.cpp | 64 +-- Minecraft.Client/StringTable.cpp | 10 +- Minecraft.Client/TileRenderer.cpp | 8 +- Minecraft.Client/Timer.cpp | 16 +- Minecraft.Client/Timer.h | 6 +- Minecraft.Client/Windows64/4JLibs/inc/4J_Storage.h | 36 +- Minecraft.Client/Windows64/Iggy/include/rrCore.h | 56 +- Minecraft.Client/Windows64/Miles/include/mss.h | 428 +++++++------- Minecraft.Client/Windows64/Miles/include/rrcore.h | 56 +- Minecraft.Client/Windows64/Windows64_App.cpp | 2 +- Minecraft.Client/Xbox/4JLibs/inc/4J_Storage.h | 24 +- .../Xbox/Sentient/Include/SenClientUGCTypes.h | 20 +- Minecraft.Client/Xbox/XML/ATGXmlParser.cpp | 406 +++++++------- Minecraft.Client/stdafx.h | 20 +- Minecraft.World/AddIslandLayer.cpp | 2 +- Minecraft.World/AddIslandLayer.h | 2 +- Minecraft.World/AddMushroomIslandLayer.cpp | 2 +- Minecraft.World/AddMushroomIslandLayer.h | 2 +- Minecraft.World/AddSnowLayer.cpp | 2 +- Minecraft.World/AddSnowLayer.h | 2 +- Minecraft.World/BasicTree.cpp | 2 +- Minecraft.World/BasicTypeContainers.h | 6 +- Minecraft.World/BiomeCache.cpp | 10 +- Minecraft.World/BiomeCache.h | 6 +- Minecraft.World/BiomeInitLayer.cpp | 2 +- Minecraft.World/BiomeInitLayer.h | 2 +- Minecraft.World/BiomeSource.cpp | 30 +- Minecraft.World/BiomeSource.h | 16 +- Minecraft.World/ByteArrayInputStream.cpp | 4 +- Minecraft.World/ByteArrayInputStream.h | 2 +- Minecraft.World/ByteBuffer.cpp | 30 +- Minecraft.World/ByteBuffer.h | 4 +- Minecraft.World/C4JThread.h | 10 +- Minecraft.World/CanyonFeature.cpp | 2 +- Minecraft.World/CanyonFeature.h | 2 +- Minecraft.World/CaveFeature.cpp | 6 +- Minecraft.World/ChunkPos.cpp | 12 +- Minecraft.World/ChunkPos.h | 8 +- Minecraft.World/ChunkStorageProfileDecorator.cpp | 6 +- Minecraft.World/ChunkStorageProfileDecorator.h | 8 +- Minecraft.World/CompoundTag.h | 18 +- Minecraft.World/CompressedTileStorage.cpp | 46 +- Minecraft.World/ConsoleSaveFileInputStream.h | 2 +- Minecraft.World/ConsoleSaveFileOriginal.cpp | 14 +- Minecraft.World/ConsoleSaveFileSplit.cpp | 32 +- Minecraft.World/CustomLevelSource.cpp | 10 +- Minecraft.World/CustomLevelSource.h | 4 +- Minecraft.World/DataInput.h | 2 +- Minecraft.World/DataInputStream.cpp | 56 +- Minecraft.World/DataInputStream.h | 4 +- Minecraft.World/DataOutput.h | 2 +- Minecraft.World/DataOutputStream.cpp | 8 +- Minecraft.World/DataOutputStream.h | 4 +- Minecraft.World/DerivedLevelData.cpp | 14 +- Minecraft.World/DerivedLevelData.h | 14 +- Minecraft.World/Dimension.cpp | 26 +- Minecraft.World/Dimension.h | 6 +- Minecraft.World/DirectoryLevelStorage.cpp | 30 +- Minecraft.World/DirectoryLevelStorage.h | 8 +- Minecraft.World/EmptyLevelChunk.cpp | 2 +- Minecraft.World/EmptyLevelChunk.h | 2 +- Minecraft.World/EnchantmentMenu.h | 2 +- Minecraft.World/FileHeader.h | 8 +- Minecraft.World/FileInputStream.cpp | 6 +- Minecraft.World/FileInputStream.h | 2 +- Minecraft.World/FlatLevelSource.cpp | 48 +- Minecraft.World/FlatLevelSource.h | 8 +- Minecraft.World/FuzzyZoomLayer.cpp | 4 +- Minecraft.World/FuzzyZoomLayer.h | 4 +- Minecraft.World/GZIPInputStream.h | 2 +- Minecraft.World/GrowMushroomIslandLayer.cpp | 6 +- Minecraft.World/GrowMushroomIslandLayer.h | 2 +- Minecraft.World/HellDimension.cpp | 4 +- Minecraft.World/HellDimension.h | 2 +- Minecraft.World/HellFlatLevelSource.cpp | 16 +- Minecraft.World/HellFlatLevelSource.h | 2 +- Minecraft.World/HellRandomLevelSource.cpp | 10 +- Minecraft.World/HellRandomLevelSource.h | 4 +- Minecraft.World/InputStream.h | 2 +- Minecraft.World/IslandLayer.cpp | 2 +- Minecraft.World/IslandLayer.h | 2 +- Minecraft.World/JavaMath.cpp | 8 +- Minecraft.World/JavaMath.h | 2 +- Minecraft.World/LargeCaveFeature.cpp | 8 +- Minecraft.World/LargeCaveFeature.h | 4 +- Minecraft.World/LargeFeature.cpp | 8 +- Minecraft.World/Layer.cpp | 16 +- Minecraft.World/Layer.h | 14 +- Minecraft.World/Level.cpp | 94 ++-- Minecraft.World/Level.h | 28 +- Minecraft.World/LevelChunk.cpp | 46 +- Minecraft.World/LevelChunk.h | 14 +- Minecraft.World/LevelData.cpp | 66 +-- Minecraft.World/LevelData.h | 22 +- Minecraft.World/LevelSettings.cpp | 14 +- Minecraft.World/LevelSettings.h | 8 +- Minecraft.World/LevelSummary.cpp | 14 +- Minecraft.World/LevelSummary.h | 10 +- Minecraft.World/LightningBolt.h | 2 +- Minecraft.World/LoginPacket.cpp | 20 +- Minecraft.World/LoginPacket.h | 6 +- Minecraft.World/LongTag.h | 6 +- Minecraft.World/McRegionChunkStorage.cpp | 12 +- Minecraft.World/McRegionChunkStorage.h | 2 +- Minecraft.World/Mth.cpp | 4 +- Minecraft.World/Mth.h | 2 +- Minecraft.World/NbtSlotFile.cpp | 10 +- Minecraft.World/NbtSlotFile.h | 2 +- Minecraft.World/NotGateTile.cpp | 6 +- Minecraft.World/NotGateTile.h | 6 +- Minecraft.World/OldChunkStorage.cpp | 18 +- Minecraft.World/Packet.cpp | 26 +- Minecraft.World/Packet.h | 14 +- Minecraft.World/PerlinNoise.cpp | 4 +- Minecraft.World/Random.cpp | 18 +- Minecraft.World/Random.h | 8 +- Minecraft.World/RandomLevelSource.cpp | 18 +- Minecraft.World/RandomLevelSource.h | 4 +- Minecraft.World/RegionFile.cpp | 34 +- Minecraft.World/RegionFile.h | 6 +- Minecraft.World/RegionHillsLayer.cpp | 2 +- Minecraft.World/RegionHillsLayer.h | 2 +- Minecraft.World/RespawnPacket.cpp | 20 +- Minecraft.World/RespawnPacket.h | 4 +- Minecraft.World/RiverInitLayer.cpp | 2 +- Minecraft.World/RiverInitLayer.h | 2 +- Minecraft.World/RiverLayer.cpp | 2 +- Minecraft.World/RiverLayer.h | 2 +- Minecraft.World/RiverMixerLayer.cpp | 4 +- Minecraft.World/RiverMixerLayer.h | 4 +- Minecraft.World/SetTimePacket.cpp | 6 +- Minecraft.World/SetTimePacket.h | 4 +- Minecraft.World/ShoreLayer.cpp | 2 +- Minecraft.World/ShoreLayer.h | 2 +- Minecraft.World/SkyIslandDimension.cpp | 2 +- Minecraft.World/SmoothLayer.cpp | 2 +- Minecraft.World/SmoothLayer.h | 2 +- Minecraft.World/SmoothZoomLayer.cpp | 4 +- Minecraft.World/SmoothZoomLayer.h | 4 +- Minecraft.World/Socket.h | 10 +- Minecraft.World/SparseDataStorage.cpp | 56 +- Minecraft.World/SparseDataStorage.h | 8 +- Minecraft.World/SparseLightStorage.cpp | 54 +- Minecraft.World/SparseLightStorage.h | 8 +- Minecraft.World/StructureFeature.cpp | 34 +- Minecraft.World/StructureFeature.h | 8 +- Minecraft.World/SwampRiversLayer.cpp | 2 +- Minecraft.World/SwampRiversLayer.h | 2 +- Minecraft.World/System.h | 8 +- Minecraft.World/TheEndDimension.cpp | 2 +- Minecraft.World/TheEndDimension.h | 2 +- Minecraft.World/TheEndLevelRandomLevelSource.cpp | 12 +- Minecraft.World/TheEndLevelRandomLevelSource.h | 6 +- Minecraft.World/Tile.cpp | 46 +- Minecraft.World/Tile.h | 18 +- Minecraft.World/VoronoiZoom.cpp | 2 +- Minecraft.World/VoronoiZoom.h | 2 +- Minecraft.World/WaterLevelChunk.cpp | 2 +- Minecraft.World/WaterLevelChunk.h | 2 +- Minecraft.World/ZoneFile.cpp | 2 +- Minecraft.World/ZoneFile.h | 6 +- Minecraft.World/ZoneIo.cpp | 2 +- Minecraft.World/ZoneIo.h | 4 +- Minecraft.World/ZonedChunkStorage.cpp | 20 +- Minecraft.World/ZonedChunkStorage.h | 12 +- Minecraft.World/ZoomLayer.cpp | 4 +- Minecraft.World/ZoomLayer.h | 4 +- Minecraft.World/stdafx.h | 4 +- Minecraft.World/system.cpp | 28 +- 308 files changed, 5370 insertions(+), 5362 deletions(-) (limited to 'Minecraft.World/ConsoleSaveFileOriginal.cpp') diff --git a/Minecraft.Client/AchievementPopup.h b/Minecraft.Client/AchievementPopup.h index 4304a7e5..3085dc6e 100644 --- a/Minecraft.Client/AchievementPopup.h +++ b/Minecraft.Client/AchievementPopup.h @@ -13,7 +13,7 @@ private: wstring title; wstring desc; Achievement *ach; - int64_t startTime; + __int64 startTime; ItemRenderer *ir; bool isHelper; diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index 0e55ec9f..b047f58e 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -198,11 +198,11 @@ CMinecraftApp::CMinecraftApp() m_dwRequiredTexturePackID=0; m_bResetNether=false; - + #ifdef _XBOX // m_bTransferSavesToXboxOne=false; // m_uiTransferSlotC=5; -#endif +#endif #if (defined _CONTENT_PACAKGE) || (defined _XBOX) m_bUseDPadForDebug = false; @@ -219,7 +219,7 @@ CMinecraftApp::CMinecraftApp() for(int i=0;i; + m_vBannedListA[i] = new vector; } LocaleAndLanguageInit(); @@ -265,7 +265,7 @@ void CMinecraftApp::DebugPrintf(int user, const char *szFormat, ...) { SceUID tty2 = sceIoOpen("tty2:", SCE_O_WRONLY, 0); if(tty2>=0) - { + { std::string string1(buf); sceIoWrite(tty2, string1.c_str(), string1.length()); sceIoClose(tty2); @@ -276,7 +276,7 @@ void CMinecraftApp::DebugPrintf(int user, const char *szFormat, ...) { SceUID tty3 = sceIoOpen("tty3:", SCE_O_WRONLY, 0); if(tty3>=0) - { + { std::string string1(buf); sceIoWrite(tty3, string1.c_str(), string1.length()); sceIoClose(tty3); @@ -318,7 +318,7 @@ void CMinecraftApp::SetAction(int iPad, eXuiAction action, LPVOID param) m_eXuiAction[iPad]=action; m_eXuiActionParam[iPad] = param; } -} +} bool CMinecraftApp::IsAppPaused() { @@ -354,7 +354,7 @@ 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, CraftingPanelScreenInput* initData = new CraftingPanelScreenInput(); initData->player = player; - initData->iContainerType=RECIPE_TYPE_3x3; + initData->iContainerType=RECIPE_TYPE_3x3; initData->iPad = iPad; initData->x = x; initData->y = y; @@ -550,7 +550,7 @@ bool CMinecraftApp::LoadContainerMenu(int iPad,shared_ptr inventory, initData->container = container; initData->iPad = iPad; - // Load the scene. + // Load the scene. if(app.GetLocalPlayerCount()>1) { initData->bSplitscreen=true; @@ -780,7 +780,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(); @@ -834,7 +834,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat case PROFILE_VERSION_1: case PROFILE_VERSION_2: // need to fill in values for the new profile data. No need to save the profile - that'll happen if they get changed, or if the auto save for the profile kicks in - { + { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu @@ -880,7 +880,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat break; case PROFILE_VERSION_3: - { + { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; pGameSettings->uiBitmaskValues=0L; // reset pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on @@ -917,7 +917,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 @@ -1014,7 +1014,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat break; case PROFILE_VERSION_7: - { + { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; // reset the display new message counter pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) @@ -1037,7 +1037,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat break; #endif case PROFILE_VERSION_8: - { + { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; // reset the display new message counter //pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) @@ -1055,17 +1055,17 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat break; case PROFILE_VERSION_9: // PS3DEC13 - { + { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off - + // PS3 1.05 - added Greek pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language } break; case PROFILE_VERSION_10: - { + { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language @@ -1073,7 +1073,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat 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 @@ -1175,7 +1175,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) if(iPad==ProfileManager.GetPrimaryPad()) { pMinecraft->options->set(Options::Option::SOUND,((float)GameSettingsA[iPad]->ucSoundFXVolume)/100.0f); - } + } break; case eGameSetting_Gamma: if(iPad==ProfileManager.GetPrimaryPad()) @@ -1183,10 +1183,10 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) // ucGamma range is 0-100, UpdateGamma is 0 - 32768 float fVal=((float)GameSettingsA[iPad]->ucGamma)*327.68f; RenderManager.UpdateGamma((unsigned short)fVal); - } + } break; - case eGameSetting_Difficulty: + case eGameSetting_Difficulty: if(iPad==ProfileManager.GetPrimaryPad()) { pMinecraft->options->toggle(Options::Option::DIFFICULTY,GameSettingsA[iPad]->usBitmaskValues&0x03); @@ -1208,7 +1208,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 @@ -1335,7 +1335,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) //nothing to do here break; case eGameSetting_BedrockFog: - { + { bool bInGame=pMinecraft->level!=NULL; // Game Host only @@ -1414,8 +1414,8 @@ 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); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); if(Pack) { @@ -1518,7 +1518,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]; @@ -1539,7 +1539,7 @@ void CMinecraftApp::ValidateFavoriteSkins(int iPad) if( pDLCPack->hasPurchasedFile(DLCManager::e_DLCType_Skin, L"") || (pSkinFile && pSkinFile->isFree())) { - GameSettingsA[iPad]->uiFavoriteSkinA[uiValidSkin++]=GameSettingsA[iPad]->uiFavoriteSkinA[i]; + GameSettingsA[iPad]->uiFavoriteSkinA[uiValidSkin++]=GameSettingsA[iPad]->uiFavoriteSkinA[i]; } } } @@ -1560,7 +1560,7 @@ void CMinecraftApp::HideMashupPackWorld(int iPad, unsigned int iMashupPackID) void CMinecraftApp::SetMinecraftLanguage(int iPad, unsigned char ucLanguage) { - GameSettingsA[iPad]->ucLanguage = ucLanguage; + GameSettingsA[iPad]->ucLanguage = ucLanguage; GameSettingsA[iPad]->bSettingsChanged = true; } @@ -1612,7 +1612,7 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV if(iPad==ProfileManager.GetPrimaryPad()) { ActionGameSettings(iPad,eVal); - } + } GameSettingsA[iPad]->bSettingsChanged=true; } break; @@ -1627,7 +1627,7 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV GameSettingsA[iPad]->bSettingsChanged=true; } break; - case eGameSetting_Difficulty: + case eGameSetting_Difficulty: if((GameSettingsA[iPad]->usBitmaskValues&0x03)!=(ucVal&0x03)) { GameSettingsA[iPad]->usBitmaskValues&=~0x03; @@ -1972,9 +1972,9 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV } ActionGameSettings(iPad,eVal); GameSettingsA[iPad]->bSettingsChanged=true; - } - break; - case eGameSetting_UISize: + } + break; + case eGameSetting_UISize: if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE)!=((ucVal&0x03)<<11)) { GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_UISIZE; @@ -1986,7 +1986,7 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV GameSettingsA[iPad]->bSettingsChanged=true; } break; - case eGameSetting_UISizeSplitscreen: + case eGameSetting_UISizeSplitscreen: if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE_SPLITSCREEN)!=((ucVal&0x03)<<13)) { GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_UISIZE_SPLITSCREEN; @@ -2011,8 +2011,8 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV } ActionGameSettings(iPad,eVal); GameSettingsA[iPad]->bSettingsChanged=true; - } - break; + } + break; case eGameSetting_PS3_EULA_Read: if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PS3EULAREAD)!=(ucVal&0x01)<<16) { @@ -2026,8 +2026,8 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV } ActionGameSettings(iPad,eVal); GameSettingsA[iPad]->bSettingsChanged=true; - } - break; + } + break; case eGameSetting_PSVita_NetworkModeAdhoc: if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)!=(ucVal&0x01)<<17) { @@ -2041,8 +2041,8 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV } ActionGameSettings(iPad,eVal); GameSettingsA[iPad]->bSettingsChanged=true; - } - break; + } + break; } } @@ -2067,7 +2067,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_Gamma: return GameSettingsA[iPad]->ucGamma; break; - case eGameSetting_Difficulty: + case eGameSetting_Difficulty: return GameSettingsA[iPad]->usBitmaskValues&0x0003; break; case eGameSetting_Sensitivity_InGame: @@ -2116,7 +2116,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; @@ -2131,7 +2131,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) break; case eGameSetting_DisplayUpdateMessage: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYUPDATEMSG)>>4; - break; + break; case eGameSetting_BedrockFog: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_BEDROCKFOG)>>6; break; @@ -2457,13 +2457,13 @@ void CMinecraftApp::HandleXuiActions(void) param = m_eXuiActionParam[i]; if(eAction!=eAppAction_Idle) - { + { switch(eAction) { // the renderer will capture a screenshot case eAppAction_SocialPost: if(ProfileManager.IsFullVersion()) - { + { // Facebook Share if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() ) { @@ -2523,7 +2523,7 @@ void CMinecraftApp::HandleXuiActions(void) else { // ask the player if they would like to upgrade, or they'll lose the level - + UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; @@ -2533,7 +2533,7 @@ void CMinecraftApp::HandleXuiActions(void) break; case eAppAction_AutosaveSaveGame: - { + { // Need to run a check to see if the save exists in order to stop the dialog asking if we want to overwrite it coming up on an autosave bool bSaveExists; StorageManager.DoesSaveExist(&bSaveExists); @@ -2543,7 +2543,7 @@ void CMinecraftApp::HandleXuiActions(void) { // flag the render to capture the screenshot for the save - SetAction(i,eAppAction_AutosaveSaveGameCapturedThumbnail); + SetAction(i,eAppAction_AutosaveSaveGameCapturedThumbnail); } } @@ -2569,7 +2569,7 @@ void CMinecraftApp::HandleXuiActions(void) //INT saveOrCheckpointId = 0; //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); - + LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &UIScene_PauseMenu::SaveWorldThreadProc; loadingParams->lpParam = (LPVOID)false; @@ -2593,7 +2593,7 @@ void CMinecraftApp::HandleXuiActions(void) } loadingParams->completionData = completionData; - + // 4J Stu - Xbox only #ifdef _XBOX // Temporarily make this scene fullscreen @@ -2606,7 +2606,7 @@ void CMinecraftApp::HandleXuiActions(void) break; case eAppAction_AutosaveSaveGameCapturedThumbnail: - { + { app.SetAutosaveTimerTime(); SetAction(i,eAppAction_Idle); @@ -2624,12 +2624,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 +2642,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 @@ -2656,7 +2656,7 @@ void CMinecraftApp::HandleXuiActions(void) case eAppAction_ExitPlayer: // a secondary player has chosen to quit { - int iPlayerC=g_NetworkManager.GetPlayerCount(); + int iPlayerC=g_NetworkManager.GetPlayerCount(); // Since the player is exiting, let's flush any profile writes for them, and hope we're not breaking TCR 136... #if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) @@ -2677,7 +2677,7 @@ void CMinecraftApp::HandleXuiActions(void) // 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)); // } @@ -2716,9 +2716,9 @@ void CMinecraftApp::HandleXuiActions(void) if(iPlayerC>2) // one player is about to leave here - they'll be set to idle in the qnet manager player leave { for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) - { + { if(g_NetworkManager.IsLocalGame()) { ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); @@ -2733,9 +2733,9 @@ void CMinecraftApp::HandleXuiActions(void) else { for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) - { + { if(g_NetworkManager.IsLocalGame()) { ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); @@ -2747,11 +2747,11 @@ void CMinecraftApp::HandleXuiActions(void) } } } - + #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(i); -#endif - +#endif + SetAction(i,eAppAction_Idle); } break; @@ -2763,7 +2763,7 @@ void CMinecraftApp::HandleXuiActions(void) StorageManager.ForceQueuedProfileWrites(i); #else ProfileManager.ForceQueuedProfileWrites(i); -#endif +#endif // if there are any tips showing, we need to close them pMinecraft->gui->clearMessages(i); @@ -2798,9 +2798,9 @@ void CMinecraftApp::HandleXuiActions(void) if(iPlayerC>2) // one player is about to leave here - they'll be set to idle in the qnet manager player leave { for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) - { + { if(g_NetworkManager.IsLocalGame()) { ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); @@ -2815,9 +2815,9 @@ void CMinecraftApp::HandleXuiActions(void) else { for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) - { + { if(g_NetworkManager.IsLocalGame()) { ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); @@ -2872,7 +2872,7 @@ void CMinecraftApp::HandleXuiActions(void) SetAction(i,eAppAction_Idle); // If we're already leaving don't exit - if (g_NetworkManager.IsLeavingGame()) + if (g_NetworkManager.IsLeavingGame()) { break; } @@ -2903,7 +2903,7 @@ void CMinecraftApp::HandleXuiActions(void) Minecraft::GetInstance()->forceStatsSave(j); } } - LeaderboardManager::Instance()->CloseSession(); + LeaderboardManager::Instance()->CloseSession(); #elif (defined _XBOX) ProfileManager.ForceQueuedProfileWrites(); #endif @@ -2923,7 +2923,7 @@ void CMinecraftApp::HandleXuiActions(void) #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(i); -#endif +#endif SetAction(i,eAppAction_Idle); return; } @@ -2941,13 +2941,13 @@ void CMinecraftApp::HandleXuiActions(void) // Change the presence info // Are we offline or online, and how many players are there - + if(g_NetworkManager.GetPlayerCount()>1) { for(int j=0;jlocalplayers[j]) - { + { if(g_NetworkManager.IsLocalGame()) { app.SetRichPresenceContext(j,CONTEXT_GAME_STATE_BLANK); @@ -2966,7 +2966,7 @@ void CMinecraftApp::HandleXuiActions(void) { app.SetRichPresenceContext(i,CONTEXT_GAME_STATE_BLANK); if(g_NetworkManager.IsLocalGame()) - { + { ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); } else @@ -2987,14 +2987,14 @@ void CMinecraftApp::HandleXuiActions(void) // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen ui.HideAllGameUIElements(); - + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { #ifdef _XBOX app.TutorialSceneNavigateBack(idx,true); #endif - + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial // It doesn't matter if they were in the tutorial already pMinecraft->playerLeftTutorial( idx ); @@ -3002,7 +3002,7 @@ void CMinecraftApp::HandleXuiActions(void) LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &UIScene_PauseMenu::ExitWorldThreadProc; - loadingParams->lpParam = param; + loadingParams->lpParam = param; UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); // If param is non-null then this is a forced exit by the server, so make sure the player knows why @@ -3015,11 +3015,11 @@ void CMinecraftApp::HandleXuiActions(void) completionData->iPad = DEFAULT_XUI_MENU_USER; loadingParams->completionData = completionData; - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); } break; case eAppAction_ExitWorldTrial: - { + { SetAction(i,eAppAction_Idle); pMinecraft->gui->clearMessages(); @@ -3031,14 +3031,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 ); @@ -3046,7 +3046,7 @@ void CMinecraftApp::HandleXuiActions(void) LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &UIScene_PauseMenu::ExitWorldThreadProc; - loadingParams->lpParam = param; + loadingParams->lpParam = param; UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); completionData->bShowBackground=TRUE; @@ -3054,7 +3054,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 +3072,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 +3100,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(); @@ -3116,7 +3116,7 @@ void CMinecraftApp::HandleXuiActions(void) //app.NavigateToScene(i,eUIScene_FullscreenProgress, loadingParams, true); } - } + } break; case eAppAction_WaitForRespawnComplete: player = pMinecraft->localplayers[i]; @@ -3156,8 +3156,8 @@ void CMinecraftApp::HandleXuiActions(void) } break; case eAppAction_PrimaryPlayerSignedOut: - { - //SetAction(i,eAppAction_Idle); + { + //SetAction(i,eAppAction_Idle); // clear the autosavetimer that might be displayed ui.ShowAutosaveCountdownTimer(false); @@ -3175,10 +3175,10 @@ void CMinecraftApp::HandleXuiActions(void) // 4J-PB - the libs will display the Returned to Title screen // UINT uiIDA[1]; // uiIDA[0]=IDS_CONFIRM_OK; -// +// // ui.RequestMessageBox(IDS_RETURNEDTOMENU_TITLE, IDS_RETURNEDTOTITLESCREEN_TEXT, uiIDA, 1, i,&CMinecraftApp::PrimaryPlayerSignedOutReturned,this,app.GetStringTable()); if( g_NetworkManager.IsInSession() ) - { + { app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); } else @@ -3226,7 +3226,7 @@ void CMinecraftApp::HandleXuiActions(void) if (!gameStarted) { - // 1. Exit + // 1. Exit MinecraftServer::HaltServer(); // Fix for #12530 - TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. @@ -3294,21 +3294,21 @@ 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 ); } LoadingInputParams *loadingParams = new LoadingInputParams(); - loadingParams->func = &CMinecraftApp::SignoutExitWorldThreadProc; + loadingParams->func = &CMinecraftApp::SignoutExitWorldThreadProc; UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); completionData->bShowBackground=TRUE; @@ -3346,7 +3346,7 @@ void CMinecraftApp::HandleXuiActions(void) break; case eAppAction_TrialOver: - { + { SetAction(i,eAppAction_Idle); UINT uiIDA[2]; uiIDA[0]=IDS_UNLOCK_TITLE; @@ -3358,7 +3358,7 @@ void CMinecraftApp::HandleXuiActions(void) // INVITES case eAppAction_DashboardTrialJoinFromInvite: - { + { TelemetryManager->RecordUpsellPresented(i, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); SetAction(i,eAppAction_Idle); @@ -3370,7 +3370,7 @@ void CMinecraftApp::HandleXuiActions(void) } break; case eAppAction_ExitAndJoinFromInvite: - { + { UINT uiIDA[3]; SetAction(i,eAppAction_Idle); @@ -3379,7 +3379,7 @@ void CMinecraftApp::HandleXuiActions(void) #if defined(_XBOX_ONE) || defined(__ORBIS__) // Show save option is saves ARE disabled if(ProfileManager.IsFullVersion() && StorageManager.GetSaveDisabled() && i==ProfileManager.GetPrimaryPad() && g_NetworkManager.IsHost() && GetGameStarted() ) - { + { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_EXIT_GAME_SAVE; uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; @@ -3389,7 +3389,7 @@ void CMinecraftApp::HandleXuiActions(void) else #else if(ProfileManager.IsFullVersion() && !StorageManager.GetSaveDisabled() && i==ProfileManager.GetPrimaryPad() && g_NetworkManager.IsHost() && GetGameStarted() ) - { + { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_EXIT_GAME_SAVE; uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; @@ -3409,7 +3409,7 @@ void CMinecraftApp::HandleXuiActions(void) ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this,app.GetStringTable()); } else - { + { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 2,i,&CMinecraftApp::ExitAndJoinFromInvite,this,app.GetStringTable(), 0, 0, false); @@ -3430,14 +3430,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 ); @@ -3497,7 +3497,7 @@ void CMinecraftApp::HandleXuiActions(void) if(ProfileManager.IsSignedIn(index) ) { if(index==i || pMinecraft->localplayers[index]!=NULL ) - { + { m_InviteData.dwLocalUsersMask |= g_NetworkManager.GetLocalPlayerMask( index ); } } @@ -3506,7 +3506,7 @@ void CMinecraftApp::HandleXuiActions(void) LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &CGameNetworkManager::ExitAndJoinFromInviteThreadProc; - loadingParams->lpParam = (LPVOID)&m_InviteData; + loadingParams->lpParam = (LPVOID)&m_InviteData; UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); completionData->bShowBackground=TRUE; @@ -3544,7 +3544,7 @@ void CMinecraftApp::HandleXuiActions(void) if( index != inviteData->dwUserIndex && ProfileManager.IsSignedIn(index) ) { if( (m_InviteData.dwLocalUsersMask & g_NetworkManager.GetLocalPlayerMask( index ) ) == 0 ) - { + { ProfileManager.RemoveGamepadFromGame(index); } } @@ -3568,7 +3568,7 @@ void CMinecraftApp::HandleXuiActions(void) UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); - + ui.NavigateToHomeMenu(); ui.UpdatePlayerBasePositions(); } @@ -3580,12 +3580,12 @@ 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() ) { - SetGameStarted(false); + SetGameStarted(false); SetChangingSessionType(true); SetReallyChangingSessionType(true); @@ -3597,14 +3597,14 @@ 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; + loadingParams->lpParam = NULL; UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); #ifdef __PS3__ @@ -3626,7 +3626,7 @@ void CMinecraftApp::HandleXuiActions(void) } loadingParams->completionData = completionData; - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); } } else if( g_NetworkManager.IsLeavingGame() ) @@ -3653,9 +3653,9 @@ void CMinecraftApp::HandleXuiActions(void) case eAppAction_SetDefaultOptions: SetAction(i,eAppAction_Idle); #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) - SetDefaultOptions((C4JStorage::PROFILESETTINGS *)param,i); + SetDefaultOptions((C4JStorage::PROFILESETTINGS *)param,i); #else - SetDefaultOptions((C_4JProfile::PROFILESETTINGS *)param,i); + SetDefaultOptions((C_4JProfile::PROFILESETTINGS *)param,i); #endif // if the profile data has been changed, then force a profile write @@ -3663,7 +3663,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 +3674,7 @@ void CMinecraftApp::HandleXuiActions(void) } SetAction(i,eAppAction_WaitRemoteServerSaveComplete); - + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { ui.CloseUIScenes(i, true); @@ -3685,7 +3685,7 @@ void CMinecraftApp::HandleXuiActions(void) LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &CMinecraftApp::RemoteSaveThreadProc; - loadingParams->lpParam = NULL; + loadingParams->lpParam = NULL; UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); completionData->bRequiresUserAction=FALSE; @@ -3727,7 +3727,7 @@ void CMinecraftApp::HandleXuiActions(void) if(!app.GetGameStarted()) MinecraftServer::HaltServer(true); if( g_NetworkManager.IsInSession() ) - { + { app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); } else @@ -3736,7 +3736,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 @@ -3744,12 +3744,12 @@ void CMinecraftApp::HandleXuiActions(void) { TelemetryManager->RecordBanLevel(i); -#if defined _XBOX - INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); +#if defined _XBOX + INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); // write the level to the banned level list, and exit the world AddLevelToBannedLevelList(i,((NetworkPlayerXbox *)pHost)->GetUID(),GetUniqueMapName(),true); #elif defined _XBOX_ONE - INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); + INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); AddLevelToBannedLevelList(i,pHost->GetUID(),GetUniqueMapName(),true); #endif // primary player would exit the world, secondary would exit the player @@ -3765,7 +3765,7 @@ void CMinecraftApp::HandleXuiActions(void) } break; case eAppAction_LevelInBanLevelList: - { + { UINT uiIDA[2]; uiIDA[0]=IDS_BUTTON_REMOVE_FROM_BAN_LIST; uiIDA[1]=IDS_EXIT_GAME; @@ -3804,15 +3804,15 @@ void CMinecraftApp::HandleXuiActions(void) break; case eAppAction_ReloadTexturePack: - { + { SetAction(i,eAppAction_Idle); Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->textures->reloadAll(); pMinecraft->skins->updateUI(); - + if(!pMinecraft->skins->isUsingDefaultSkin()) { - TexturePack *pTexturePack = pMinecraft->skins->getSelected(); + TexturePack *pTexturePack = pMinecraft->skins->getSelected(); DLCPack *pDLCPack=pTexturePack->getDLCPack(); @@ -3830,7 +3830,7 @@ void CMinecraftApp::HandleXuiActions(void) // 4J-PB - If the texture pack has audio, we need to switch to this if(pMinecraft->skins->getSelected()->hasAudio()) { - Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); } } @@ -3863,7 +3863,7 @@ void CMinecraftApp::HandleXuiActions(void) eTMS = app.GetTMSAction(i); if(eTMS!=eTMSAction_Idle) - { + { switch(eTMS) { // TMS++ actions @@ -3888,7 +3888,7 @@ void CMinecraftApp::HandleXuiActions(void) #endif case eTMSAction_TMSPP_UserFileList: // retrieve the file list first -#if defined _XBOX +#if defined _XBOX SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,"\\",eTMSAction_TMSPP_XUIDSFile); #elif defined _XBOX_ONE @@ -3907,7 +3907,7 @@ void CMinecraftApp::HandleXuiActions(void) SetTMSAction(i,eTMSAction_TMSPP_DLCFile); #endif - break; + break; case eTMSAction_TMSPP_DLCFile: #if defined _XBOX || defined _XBOX_ONE SetTMSAction(i,eTMSAction_TMSPP_DLCFile_Waiting); @@ -3941,7 +3941,7 @@ void CMinecraftApp::HandleXuiActions(void) case eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions: case eTMSAction_TMSPP_RetrieveFiles_DLCMain: // retrieve the file list first -#if defined _XBOX +#if defined _XBOX // pass in the next app action on the call or callback completing SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile_Waiting); app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,"\\",eTMSAction_TMSPP_DLCFileOnly); @@ -3953,7 +3953,7 @@ void CMinecraftApp::HandleXuiActions(void) #endif break; case eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly: -#if defined _XBOX +#if defined _XBOX SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,"\\",eTMSAction_TMSPP_XUIDSFile); #elif defined _XBOX_ONE @@ -4095,7 +4095,7 @@ void CMinecraftApp::loadMediaArchive() mediapath = L"Common\\Media\\MediaPSVita.arc"; #endif - if (!mediapath.empty()) + if (!mediapath.empty()) { m_mediaArchive = new ArchiveFile( File(mediapath) ); } @@ -4176,7 +4176,7 @@ int CMinecraftApp::PrimaryPlayerSignedOutReturned(void *pParam,int iPad,const C4 // We always create a session before kicking of any of the game code, so even though we may still be joining/creating a game // at this point we want to handle it differently from just being in a menu if( g_NetworkManager.IsInSession() ) - { + { app.SetAction(iPad,eAppAction_PrimaryPlayerSignedOutReturned); } else @@ -4193,7 +4193,7 @@ int CMinecraftApp::EthernetDisconnectReturned(void *pParam,int iPad,const C4JSto // if the player is null, we're in the menus if(Minecraft::GetInstance()->player!=NULL) - { + { app.SetAction(pMinecraft->player->GetXboxPad(),eAppAction_EthernetDisconnectedReturned); } else @@ -4323,10 +4323,10 @@ int CMinecraftApp::SignoutExitWorldThreadProc( void* lpParameter ) // 4J-JEV: Fix for #106402 - TCR #014 BAS Debug Output: // TU12: Mass Effect Mash-UP: Save file "Default_DisplayName" is created on all storage devices after signing out from a re-launched pre-generated world - app.m_gameRules.unloadCurrentGameRules(); // + 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() ) { @@ -4426,7 +4426,7 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes } #elif defined(__ORBIS__) else - { + { // Determine why they're not "signed in live" if (ProfileManager.isSignedInPSN(iPad)) { @@ -4438,7 +4438,7 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); } else - { + { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; @@ -4495,7 +4495,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes } #elif defined(__ORBIS__) else - { + { // Determine why they're not "signed in live" if (ProfileManager.isSignedInPSN(iPad)) { @@ -4509,7 +4509,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); } else - { + { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; @@ -4594,7 +4594,7 @@ void CMinecraftApp::ProfileReadErrorCallback(void *pParam) void CMinecraftApp::ClearSignInChangeUsersMask() { - // 4J-PB - When in the main menu, the user is on pad 0, and any change they make to their profile will be to pad 0 data + // 4J-PB - When in the main menu, the user is on pad 0, and any change they make to their profile will be to pad 0 data // If they then go in as a secondary player to a splitscreen game, their profile will not be read again on pad 1 if they were previously in a splitscreen game // This is because m_uiLastSignInData remembers they were in previously, and doesn't read the profile data for them again // Fix this by resetting the m_uiLastSignInData on pressing play game for secondary users. The Primary user does a read profile on play game anyway @@ -4629,7 +4629,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); @@ -4700,7 +4700,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange bool bPlayerChanged=(uiChangedPlayers&(1<m_currentSigninInfo[i].xuid, info.xuid) ) )) + if( bPlayerChanged && (!bPlayerSignedIn || (bPlayerSignedIn && !ProfileManager.AreXUIDSEqual(pApp->m_currentSigninInfo[i].xuid, info.xuid) ) )) { // 4J-PB - invalidate their banned level list pApp->DebugPrintf("Player at index %d Left - invalidating their banned list\n",i); @@ -4735,7 +4735,7 @@ 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 @@ -4749,7 +4749,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange // 4J-JEV: Need to kick of loading of profile data for sub-sign in players. for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { - if( i != iPrimaryPlayer + if( i != iPrimaryPlayer && ( uiChangedPlayers & (1<RecordUpsellResponded(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, senResponse); } @@ -4977,7 +4977,7 @@ int CMinecraftApp::DebugInputCallback(LPVOID pParam) { if(app.DebugSettingsOn()) { - app.ActionDebugMask(i); + app.ActionDebugMask(i); } else { @@ -5069,7 +5069,7 @@ void CMinecraftApp::MountNextDLC(int iPad) if(StorageManager.MountInstalledDLC(iPad,m_iTotalDLCInstalled,&CMinecraftApp::DLCMountedCallback,this)!=ERROR_IO_PENDING ) { // corrupt DLC - app.DebugPrintf("Failed to mount DLC %d for pad %d\n",m_iTotalDLCInstalled,iPad); + app.DebugPrintf("Failed to mount DLC %d for pad %d\n",m_iTotalDLCInstalled,iPad); ++m_iTotalDLCInstalled; app.MountNextDLC(iPad); } @@ -5142,7 +5142,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)); @@ -5187,15 +5187,15 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // void CMinecraftApp::InstallDefaultCape() // { // if(!m_bDefaultCapeInstallAttempted) -// { +// { // // we only attempt to install the cape once per launch of the game // m_bDefaultCapeInstallAttempted=true; -// +// // wstring wTemp=L"Default_Cape.png"; // bool bRes=app.IsFileInMemoryTextures(wTemp); // // if the file is not already in the memory textures, then read it from TMS // if(!bRes) -// { +// { // BYTE *pBuffer=NULL; // DWORD dwSize=0; // // 4J-PB - out for now for DaveK so he doesn't get the birthday cape @@ -5205,13 +5205,13 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // if(eTMSStatus==C4JStorage::ETMSStatus_Idle) // { // app.AddMemoryTextureFile(wTemp,pBuffer,dwSize); -// } +// } // #endif // } // } // } - void CMinecraftApp::HandleDLC(DLCPack *pack) + void CMinecraftApp::HandleDLC(DLCPack *pack) { DWORD dwFilesProcessed = 0; #ifndef _XBOX @@ -5248,7 +5248,7 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d { strcpy(szFullFilename,szPath); strcat(szFullFilename,wfd.cFileName); - + if(( GetFileAttributes( szFullFilename ) & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) { #ifdef _XBOX @@ -5259,9 +5259,9 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d File texturePCKPath(wsTemp ); if(texturePCKPath.exists()) { - app.DebugPrintf("Found a replacement .pck\n"); + app.DebugPrintf("Found a replacement .pck\n"); m_dlcManager.readDLCDataFile(dwFilesProcessed, wsTemp,pack); - } + } else { m_dlcManager.readDLCDataFile(dwFilesProcessed, szFullFilename,pack); @@ -5271,7 +5271,7 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d #endif } - } + } while( FindNextFile( hFind, &wfd ) ); // Close the find handle. @@ -5284,8 +5284,8 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // int CMinecraftApp::DLCReadCallback(LPVOID pParam,C4JStorage::DLC_FILE_DETAILS *pDLCData) // { -// -// +// +// // return 0; // } @@ -5294,7 +5294,7 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // Desc: Initializes the timer variables //------------------------------------------------------------------------------------- void CMinecraftApp::InitTime() - { + { // Get the frequency of the timer LARGE_INTEGER qwTicksPerSec; @@ -5306,8 +5306,8 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // Zero out the elapsed and total time m_Time.qwAppTime.QuadPart = 0; - m_Time.fAppTime = 0.0f; - m_Time.fElapsedTime = 0.0f; + m_Time.fAppTime = 0.0f; + m_Time.fElapsedTime = 0.0f; } //------------------------------------------------------------------------------------- @@ -5319,14 +5319,14 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d LARGE_INTEGER qwNewTime; LARGE_INTEGER qwDeltaTime; - QueryPerformanceCounter( &qwNewTime ); + QueryPerformanceCounter( &qwNewTime ); qwDeltaTime.QuadPart = qwNewTime.QuadPart - m_Time.qwTime.QuadPart; - m_Time.qwAppTime.QuadPart += qwDeltaTime.QuadPart; + m_Time.qwAppTime.QuadPart += qwDeltaTime.QuadPart; m_Time.qwTime.QuadPart = qwNewTime.QuadPart; m_Time.fElapsedTime = m_Time.fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); - m_Time.fAppTime = m_Time.fSecsPerTick * ((FLOAT)(m_Time.qwAppTime.QuadPart)); + m_Time.fAppTime = m_Time.fSecsPerTick * ((FLOAT)(m_Time.qwAppTime.QuadPart)); } @@ -5359,8 +5359,8 @@ bool CMinecraftApp::isXuidDeadmau5(PlayerUID xuid) return false; } -void CMinecraftApp::AddMemoryTextureFile(const wstring &wName,PBYTE pbData,DWORD dwBytes) -{ +void CMinecraftApp::AddMemoryTextureFile(const wstring &wName,PBYTE pbData,DWORD dwBytes) +{ EnterCriticalSection(&csMemFilesLock); // check it's not already in PMEMDATA pData=NULL; @@ -5408,7 +5408,7 @@ void CMinecraftApp::AddMemoryTextureFile(const wstring &wName,PBYTE pbData,DWORD void CMinecraftApp::RemoveMemoryTextureFile(const wstring &wName) { EnterCriticalSection(&csMemFilesLock); - + AUTO_VAR(it, m_MEM_Files.find(wName)); if(it != m_MEM_Files.end()) { @@ -5436,7 +5436,7 @@ bool CMinecraftApp::DefaultCapeExists() EnterCriticalSection(&csMemFilesLock); AUTO_VAR(it, m_MEM_Files.find(wTex)); - if(it != m_MEM_Files.end()) val = true; + if(it != m_MEM_Files.end()) val = true; LeaveCriticalSection(&csMemFilesLock); return val; @@ -5448,7 +5448,7 @@ bool CMinecraftApp::IsFileInMemoryTextures(const wstring &wName) EnterCriticalSection(&csMemFilesLock); AUTO_VAR(it, m_MEM_Files.find(wName)); - if(it != m_MEM_Files.end()) val = true; + if(it != m_MEM_Files.end()) val = true; LeaveCriticalSection(&csMemFilesLock); return val; @@ -5467,14 +5467,14 @@ void CMinecraftApp::GetMemFileDetails(const wstring &wName,PBYTE *ppbData,DWORD LeaveCriticalSection(&csMemFilesLock); } -void CMinecraftApp::AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes) -{ +void CMinecraftApp::AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes) +{ EnterCriticalSection(&csMemTPDLock); // check it's not already in PMEMDATA pData=NULL; AUTO_VAR(it, m_MEM_TPD.find(iConfig)); if(it == m_MEM_TPD.end()) - { + { pData = (PMEMDATA)new BYTE[sizeof(MEMDATA)]; ZeroMemory( pData, sizeof(MEMDATA) ); pData->pbData=pbData; @@ -5487,8 +5487,8 @@ void CMinecraftApp::AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes) LeaveCriticalSection(&csMemTPDLock); } -void CMinecraftApp::RemoveMemoryTPDFile(int iConfig) -{ +void CMinecraftApp::RemoveMemoryTPDFile(int iConfig) +{ EnterCriticalSection(&csMemTPDLock); // check it's not already in PMEMDATA pData=NULL; @@ -5550,7 +5550,7 @@ bool CMinecraftApp::IsFileInTPD(int iConfig) EnterCriticalSection(&csMemTPDLock); AUTO_VAR(it, m_MEM_TPD.find(iConfig)); - if(it != m_MEM_TPD.end()) val = true; + if(it != m_MEM_TPD.end()) val = true; LeaveCriticalSection(&csMemTPDLock); return val; @@ -5576,18 +5576,18 @@ void CMinecraftApp::GetTPD(int iConfig,PBYTE *ppbData,DWORD *pdwBytes) // #ifndef _CONTENT_PACKAGE // // read the local file // File gtsFile( wsFile->c_str() ); -// -// int64_t fileSize = gtsFile.length(); -// +// +// __int64 fileSize = gtsFile.length(); +// // if(fileSize!=0) // { // FileInputStream fis(gtsFile); // byteArray ba((int)fileSize); // fis.read(ba); // fis.close(); -// +// // bRes=StorageManager.WriteTMSFile(iQuadrant,eStorageFacility,(WCHAR *)wsFile->c_str(),ba.data, ba.length); -// +// // } // #endif // return bRes; @@ -5637,7 +5637,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad CMinecraftApp *pClass = (CMinecraftApp *)pParam; // Exit with or without saving // Decline means save in this dialog - if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) { if( result==C4JStorage::EMessage_ResultDecline ) // Save { @@ -5649,7 +5649,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad DLCPack * pDLCPack=tPack->getDLCPack(); if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) - { + { // upsell // get the dlc texture pack @@ -5669,7 +5669,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad // Give the player a warning about the trial version of the texture pack ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,pClass,app.GetStringTable()); - return S_OK; + return S_OK; } } #ifndef _XBOX_ONE @@ -5727,7 +5727,7 @@ int CMinecraftApp::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStor if(result==C4JStorage::EMessage_ResultAccept) { if(ProfileManager.IsSignedIn(iPad)) - { + { // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth... XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); @@ -5747,7 +5747,7 @@ int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4 //CMinecraftApp* pClass = (CMinecraftApp*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultDecline) + if(result==C4JStorage::EMessage_ResultDecline) { INT saveOrCheckpointId = 0; @@ -5759,7 +5759,7 @@ int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4 DLCPack * pDLCPack=tPack->getDLCPack(); if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) - { + { // upsell // get the dlc texture pack @@ -5779,7 +5779,7 @@ int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4 // Give the player a warning about the trial version of the texture pack ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,NULL,app.GetStringTable()); - return S_OK; + return S_OK; } } //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); @@ -5794,7 +5794,7 @@ int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4 int CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { // results switched for this dialog - if(result==C4JStorage::EMessage_ResultDecline) + if(result==C4JStorage::EMessage_ResultDecline) { #if defined(_XBOX_ONE) || defined(__ORBIS__) StorageManager.SetSaveDisabled(false); @@ -5921,7 +5921,7 @@ void CMinecraftApp::InitialiseTips() // Only randomise the content package build #ifdef _CONTENT_PACKAGE - + for(int i=1;inextInt(); @@ -5983,7 +5983,7 @@ UINT CMinecraftApp::GetNextTip() } else { - if(bShowSkinDLCTip && ProfileManager.IsFullVersion()) + if(bShowSkinDLCTip && ProfileManager.IsFullVersion()) { bShowSkinDLCTip=false; if( app.DLCInstallProcessCompleted() ) @@ -6019,7 +6019,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"
" ); @@ -6108,7 +6108,7 @@ wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shado text = replaceAll(text, L"{*ICON_SHANK_03*}", GetIconReplacement(XZP_ICON_SHANK_03) ); text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_UP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_UP ) ); text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_DOWN*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_DOWN ) ); - text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_RIGHT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_RIGHT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_RIGHT ) ); text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_LEFT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_LEFT ) ); #if defined _XBOX_ONE || defined __PSVITA__ text = replaceAll(text, L"{*CONTROLLER_VK_START*}", GetVKReplacement(VK_PAD_START ) ); @@ -6124,13 +6124,13 @@ wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shado text = replaceAll(text, L"{*IMAGEROOT*}", imageRoot); #endif // _XBOX - // Fix for #8903 - UI: Localization: KOR/JPN/CHT: Button Icons are rendered with padding space, which looks no good + // Fix for #8903 - UI: Localization: KOR/JPN/CHT: Button Icons are rendered with padding space, which looks no good DWORD dwLanguage = XGetLanguage( ); switch(dwLanguage) { - case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_KOREAN: case XC_LANGUAGE_JAPANESE: - case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_TCHINESE: text = replaceAll(text, L" ", L"" ); break; } @@ -6273,7 +6273,7 @@ wstring CMinecraftApp::GetVKReplacement(unsigned int uiVKey) case VK_PAD_LTHUMB_UPLEFT : case VK_PAD_LTHUMB_UPRIGHT : case VK_PAD_LTHUMB_DOWNRIGHT: - case VK_PAD_LTHUMB_DOWNLEFT : + case VK_PAD_LTHUMB_DOWNLEFT : return app.GetString( IDS_CONTROLLER_LEFT_STICK ); case VK_PAD_RTHUMB_UP : case VK_PAD_RTHUMB_DOWN : @@ -6282,7 +6282,7 @@ wstring CMinecraftApp::GetVKReplacement(unsigned int uiVKey) case VK_PAD_RTHUMB_UPLEFT : case VK_PAD_RTHUMB_UPRIGHT : case VK_PAD_RTHUMB_DOWNRIGHT: - case VK_PAD_RTHUMB_DOWNLEFT : + case VK_PAD_RTHUMB_DOWNLEFT : return app.GetString( IDS_CONTROLLER_RIGHT_STICK ); default: break; @@ -6445,7 +6445,7 @@ HRESULT CMinecraftApp::RegisterMojangData(WCHAR *pXuidName, PlayerUID xuid, WCHA // ignore the names if we don't recognize them if(pXuidName!=NULL) - { + { if( wcscmp( pXuidName, L"XUID_NOTCH" ) == 0 ) { eTempXuid = eXUID_Notch; // might be needed for the apple at some point @@ -6465,7 +6465,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; @@ -6485,7 +6485,7 @@ HRESULT CMinecraftApp::RegisterConfigValues(WCHAR *pType, int iValue) // #ifdef _XBOX // if(pType!=NULL) -// { +// { // if(wcscmp(pType,L"XboxOneTransfer")==0) // { // if(iValue>0) @@ -6501,7 +6501,7 @@ HRESULT CMinecraftApp::RegisterConfigValues(WCHAR *pType, int iValue) // { // app.m_uiTransferSlotC=iValue; // } -// +// // } // #endif @@ -6510,7 +6510,7 @@ HRESULT CMinecraftApp::RegisterConfigValues(WCHAR *pType, int iValue) } #if (defined _XBOX || defined _WINDOWS64) -HRESULT CMinecraftApp::RegisterDLCData(WCHAR *pType, WCHAR *pBannerName, int iGender, uint64_t ullOfferID_Full, uint64_t ullOfferID_Trial, WCHAR *pFirstSkin, unsigned int uiSortIndex, int iConfig, WCHAR *pDataFile) +HRESULT CMinecraftApp::RegisterDLCData(WCHAR *pType, WCHAR *pBannerName, int iGender, __uint64 ullOfferID_Full, __uint64 ullOfferID_Trial, WCHAR *pFirstSkin, unsigned int uiSortIndex, int iConfig, WCHAR *pDataFile) { HRESULT hr=S_OK; DLC_INFO *pDLCData=new DLC_INFO; @@ -6525,18 +6525,18 @@ HRESULT CMinecraftApp::RegisterDLCData(WCHAR *pType, WCHAR *pBannerName, int iGe #ifndef __ORBIS__ // ignore the names if we don't recognize them if(pBannerName!=L"") - { + { wcsncpy_s( pDLCData->wchBanner, pBannerName, MAX_BANNERNAME_SIZE); } if(pDataFile[0]!=0) - { + { wcsncpy_s( pDLCData->wchDataFile, pDataFile, MAX_BANNERNAME_SIZE); } #endif if(pType!=NULL) - { + { if(wcscmp(pType,L"Skin")==0) { pDLCData->eDLCType=e_DLC_SkinPack; @@ -6615,12 +6615,12 @@ HRESULT CMinecraftApp::RegisterDLCData(eDLCContentType eType, WCHAR *pwchBannerN // ignore the names if we don't recognize them if(pwchBannerName!=L"") - { + { wcsncpy_s( pDLCData->wchBanner, pwchBannerName, MAX_BANNERNAME_SIZE); } if(pwchProductName[0]!=0) - { + { pDLCData->wsDisplayName=pwchProductName; } @@ -6662,7 +6662,7 @@ HRESULT CMinecraftApp::RegisterDLCData(char *pchDLCName, unsigned int uiSortInde pDLCData->iConfig = app.GetiConfigFromName(pchDLCName); pDLCData->uiSortIndex=uiSortIndex; - pDLCData->eDLCType = app.GetDLCTypeFromName(pchDLCName); + pDLCData->eDLCType = app.GetDLCTypeFromName(pchDLCName); strcpy(pDLCData->chImageURL,pchImageURL); //bool bIsTrialDLC = app.GetTrialFromName(pchDLCName); @@ -6734,7 +6734,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfo(char *pchDLCName) string tempString=pchDLCName; if(DLCInfo.size()>0) - { + { AUTO_VAR(it, DLCInfo.find(tempString)); if( it == DLCInfo.end() ) @@ -6807,7 +6807,7 @@ bool CMinecraftApp::GetDLCFullOfferIDForPackID(const int iPackID,wstring &Produc { AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); if( it == DLCTextures_PackID.end() ) - { + { return false; } else @@ -6879,7 +6879,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial) { //DLC_INFO *pDLCInfo=NULL; if(DLCInfo_Trial.size()>0) - { + { AUTO_VAR(it, DLCInfo_Trial.find(ullOfferID_Trial)); if( it == DLCInfo_Trial.end() ) @@ -6936,7 +6936,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForFullOfferID(WCHAR *pwchProductID) { wstring wsTemp = pwchProductID; if(DLCInfo_Full.size()>0) - { + { AUTO_VAR(it, DLCInfo_Full.find(wsTemp)); if( it == DLCInfo_Full.end() ) @@ -6965,7 +6965,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForProductName(WCHAR *pwchProductName) } ++it; } - + return NULL; } @@ -6976,7 +6976,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full) { if(DLCInfo_Full.size()>0) - { + { AUTO_VAR(it, DLCInfo_Full.find(ullOfferID_Full)); if( it == DLCInfo_Full.end() ) @@ -7069,7 +7069,7 @@ 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; @@ -7082,11 +7082,11 @@ int CMinecraftApp::ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4 //CScene_Pause* pClass = (CScene_Pause*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultDecline) + if(result==C4JStorage::EMessage_ResultDecline) { app.SetAction(iPad,eAppAction_ExitWorld); } - else + else { #ifndef _XBOX // Inform fullscreen progress scene that it's not being cancelled after all @@ -7167,7 +7167,7 @@ void CMinecraftApp::AddLevelToBannedLevelList(int iPad, PlayerUID xuid, char *ps m_vBannedListA[iPad]->push_back(pBannedListData); if(bWriteToTMS) - { + { DWORD dwDataBytes=(DWORD)(sizeof(BANNEDLISTDATA)*m_vBannedListA[iPad]->size()); PBANNEDLISTDATA pBannedList = (BANNEDLISTDATA *)(new CHAR [dwDataBytes]); int iCount=0; @@ -7197,7 +7197,7 @@ bool CMinecraftApp::IsInBannedLevelList(int iPad, PlayerUID xuid, char *pszLevel #ifdef _XBOX_ONE PlayerUID bannedPlayerUID = pData->wchPlayerUID; if(IsEqualXUID (bannedPlayerUID,xuid) && (strcmp(pData->pszLevelName,pszLevelName)==0)) -#else +#else if(IsEqualXUID (pData->xuid,xuid) && (strcmp(pData->pszLevelName,pszLevelName)==0)) #endif { @@ -7212,12 +7212,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 @@ -7298,7 +7298,7 @@ bool CMinecraftApp::AlreadySeenCreditText(const wstring &wstemp) wstring temp=m_vCreditText.at(i); // if they are the same, break out of the case - if(temp.compare(wstemp)==0) + if(temp.compare(wstemp)==0) { return true; } @@ -7588,7 +7588,7 @@ unsigned int CMinecraftApp::GetGameHostOption(unsigned int uiHostSettings, eGame break; case eGameHostOption_FireSpreads: return (uiHostSettings&GAME_HOST_OPTION_BITMASK_FIRESPREADS); - break; + break; case eGameHostOption_CheatsEnabled: return (uiHostSettings&(GAME_HOST_OPTION_BITMASK_HOSTFLY|GAME_HOST_OPTION_BITMASK_HOSTHUNGER|GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE)); break; @@ -7606,7 +7606,7 @@ unsigned int CMinecraftApp::GetGameHostOption(unsigned int uiHostSettings, eGame break; case eGameHostOption_DisableSaving: return (uiHostSettings&GAME_HOST_OPTION_BITMASK_DISABLESAVE); - break; + break; } return false; @@ -7659,7 +7659,7 @@ unsigned int CMinecraftApp::FromBigEndian(unsigned int uiValue) // Keep it in big endian return uiValue; #else - unsigned int uiReturn = ( ( uiValue >> 24 ) & 0x000000ff ) | + unsigned int uiReturn = ( ( uiValue >> 24 ) & 0x000000ff ) | ( ( uiValue >> 8 ) & 0x0000ff00 ) | ( ( uiValue << 8 ) & 0x00ff0000 ) | ( ( uiValue << 24 ) & 0xff000000 ); @@ -7685,7 +7685,7 @@ void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsig uiCount+=8; while(uiCounteTerrainFeature==eType) { *pX=pFeatureData->x; *pZ=pFeatureData->z; return true; - } + } } return false; @@ -7976,7 +7976,7 @@ unsigned int CMinecraftApp::AddDLCRequest(eDLCMarketplaceType eType, bool bPromo { // promote if(bPromote) - { + { m_DLCDownloadQueue.erase(m_DLCDownloadQueue.begin()+iPosition); m_DLCDownloadQueue.insert(m_DLCDownloadQueue.begin(),pCurrent); } @@ -7988,10 +7988,10 @@ unsigned int CMinecraftApp::AddDLCRequest(eDLCMarketplaceType eType, bool bPromo } DLCRequest *pDLCreq = new DLCRequest; - pDLCreq->dwType=m_dwContentTypeA[eType]; + pDLCreq->dwType=m_dwContentTypeA[eType]; pDLCreq->eState=e_DLC_ContentState_Idle; - m_DLCDownloadQueue.push_back(pDLCreq); + m_DLCDownloadQueue.push_back(pDLCreq); m_bAllDLCContentRetrieved=false; LeaveCriticalSection(&csDLCDownloadQueue); @@ -8023,7 +8023,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool { // promote if(bPromote) - { + { m_TMSPPDownloadQueue.erase(m_TMSPPDownloadQueue.begin()+iPosition); m_TMSPPDownloadQueue.insert(m_TMSPPDownloadQueue.begin(),pCurrent); bPromoted=true; @@ -8057,17 +8057,17 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool { // first check if the image is already in the memory textures, since we might be loading some from the Title Update partition if(pDLC->wchDataFile[0]!=0) - { + { //WCHAR *cString = pDLC->wchDataFile; // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first //int iIndex = app.GetLocalTMSFileIndex(pDLC->wchDataFile,true); //if(iIndex!=-1) - { + { bool bPresent = app.IsFileInTPD(pDLC->iConfig); if(!bPresent) - { + { // this may already be present in the vector because of a previous trial/full offer bool bAlreadyInQueue=false; @@ -8083,7 +8083,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool } if(!bAlreadyInQueue) - { + { TMSPPRequest *pTMSPPreq = new TMSPPRequest; pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; @@ -8095,7 +8095,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool pTMSPPreq->eState=e_TMS_ContentState_Queued; m_bAllTMSContentRetrieved=false; m_TMSPPDownloadQueue.push_back(pTMSPPreq); - } + } } else { @@ -8119,20 +8119,20 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool // is this the right type? if(pDLC->eDLCType==eType) - { + { WCHAR *cString = pDLC->wchBanner; // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first - // is the file in the TMS XZP? + // is the file in the TMS XZP? //int iIndex = app.GetLocalTMSFileIndex(cString,true); //if(iIndex!=-1) - { - bool bPresent = app.IsFileInMemoryTextures(cString); + { + bool bPresent = app.IsFileInMemoryTextures(cString); if(!bPresent) // retrieve it from TMSPP - { + { bool bAlreadyInQueue=false; for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) { @@ -8146,7 +8146,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool } if(!bAlreadyInQueue) - { + { TMSPPRequest *pTMSPPreq = new TMSPPRequest; pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; @@ -8159,7 +8159,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool pTMSPPreq->eState=e_TMS_ContentState_Queued; m_bAllTMSContentRetrieved=false; - m_TMSPPDownloadQueue.push_back(pTMSPPreq); + m_TMSPPDownloadQueue.push_back(pTMSPPreq); app.DebugPrintf("===m_TMSPPDownloadQueue Adding %ls, q size is %d\n",pTMSPPreq->wchFilename,m_TMSPPDownloadQueue.size()); } } @@ -8183,11 +8183,11 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool //int iIndex = app.GetLocalTMSFileIndex(cString,true); //if(iIndex!=-1) - { + { bool bPresent = app.IsFileInMemoryTextures(cString); - + if(!bPresent) - { + { // this may already be present in the vector because of a previous trial/full offer bool bAlreadyInQueue=false; @@ -8203,7 +8203,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool } if(!bAlreadyInQueue) - { + { //app.DebugPrintf("Adding a request to the TMSPP download queue - %ls\n",pDLC->wchBanner); TMSPPRequest *pTMSPPreq = new TMSPPRequest; ZeroMemory(pTMSPPreq,sizeof(TMSPPRequest)); @@ -8222,7 +8222,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool m_bAllTMSContentRetrieved=false; m_TMSPPDownloadQueue.push_back(pTMSPPreq); app.DebugPrintf("===m_TMSPPDownloadQueue Adding %ls, q size is %d\n",pTMSPPreq->wchFilename,m_TMSPPDownloadQueue.size()); - } + } } } } @@ -8329,7 +8329,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 @@ -8340,15 +8340,15 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto pCurrent->eState=e_TMS_ContentState_Retrieved; if(pFileData!=NULL) - { + { #ifdef _XBOX_ONE - + switch(pCurrent->eType) { case e_DLC_TexturePackData: - { + { // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory PBYTE pbData = new BYTE [pFileData->dwSize]; memcpy(pbData,pFileData->pbData,pFileData->dwSize); @@ -8357,17 +8357,17 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto app.DebugPrintf("Got texturepack data\n"); // get the config value for the texture pack int iConfig=app.GetTPConfigVal(pCurrent->wchFilename); - app.AddMemoryTPDFile(iConfig, pbData, pFileData->dwSize); + app.AddMemoryTPDFile(iConfig, pbData, pFileData->dwSize); } break; default: // 4J-PB - check the data is an image if(pFileData->pbData[0]==0x89) - { + { // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory PBYTE pbData = new BYTE [pFileData->dwSize]; memcpy(pbData,pFileData->pbData,pFileData->dwSize); - + pClass->m_vTMSPPData.push_back(pbData); app.DebugPrintf("Got image data - %ls\n",pCurrent->wchFilename); app.AddMemoryTextureFile(pCurrent->wchFilename, pbData, pFileData->dwSize); @@ -8383,11 +8383,11 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto switch(pCurrent->eType) { case e_DLC_TexturePackData: - { + { app.DebugPrintf("--- Got texturepack data %ls\n",pCurrent->wchFilename); // get the config value for the texture pack int iConfig=app.GetTPConfigVal(pCurrent->wchFilename); - app.AddMemoryTPDFile(iConfig, pFileData->pbData, pFileData->dwSize); + app.AddMemoryTPDFile(iConfig, pFileData->pbData, pFileData->dwSize); } break; default: @@ -8407,7 +8407,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto } break; } - + } LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); @@ -8651,7 +8651,7 @@ void CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, D for(unsigned int i=0;iAddOrRetrievePart(&SkinBoxA[i]); pvModelPart->push_back(pModelPart); pvSkinBoxes->push_back(&SkinBoxA[i]); @@ -8661,7 +8661,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 ); @@ -8681,7 +8681,7 @@ vector * CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, vect for(AUTO_VAR(it, pvSkinBoxA->begin());it != pvSkinBoxA->end(); ++it) { if(pModel) - { + { ModelPart *pModelPart=pModel->AddOrRetrievePart(*it); pvModelPart->push_back(pModelPart); } @@ -8725,7 +8725,7 @@ vector *CMinecraftApp::GetAdditionalSkinBoxes(DWORD dwSkinID) pvSkinBoxes = (*it).second; } } - + LeaveCriticalSection( &csAdditionalSkinBoxes ); return pvSkinBoxes; } @@ -8768,16 +8768,16 @@ void CMinecraftApp::SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOve DWORD CMinecraftApp::getSkinIdFromPath(const wstring &skin) { - bool dlcSkin = false; + 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 +8801,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 { @@ -8826,7 +8826,7 @@ int CMinecraftApp::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::E if(result!=C4JStorage::EMessage_Cancelled) { if(app.GetRequiredTexturePackID()!=0) - { + { // we need to enable background downloading for the DLC XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); @@ -8844,7 +8844,7 @@ int CMinecraftApp::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::E DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); ullIndexA[0]=pDLCInfo->ullOfferID_Trial; StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); - } + } } } #endif @@ -8887,39 +8887,39 @@ byteArray CMinecraftApp::getArchiveFile(const wstring &filename) // DLC #if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) -int CMinecraftApp::GetDLCInfoCount() -{ +int CMinecraftApp::GetDLCInfoCount() +{ return (int)DLCInfo.size(); } #elif defined _XBOX_ONE -int CMinecraftApp::GetDLCInfoTrialOffersCount() -{ +int CMinecraftApp::GetDLCInfoTrialOffersCount() +{ return 0; } -int CMinecraftApp::GetDLCInfoFullOffersCount() -{ +int CMinecraftApp::GetDLCInfoFullOffersCount() +{ return (int)DLCInfo_Full.size(); } #else -int CMinecraftApp::GetDLCInfoTrialOffersCount() -{ +int CMinecraftApp::GetDLCInfoTrialOffersCount() +{ return (int)DLCInfo_Trial.size(); } -int CMinecraftApp::GetDLCInfoFullOffersCount() -{ +int CMinecraftApp::GetDLCInfoFullOffersCount() +{ return (int)DLCInfo_Full.size(); } #endif -int CMinecraftApp::GetDLCInfoTexturesOffersCount() -{ +int CMinecraftApp::GetDLCInfoTexturesOffersCount() +{ return (int)DLCTextures_PackID.size(); } // AUTOSAVE -void CMinecraftApp::SetAutosaveTimerTime(void) +void CMinecraftApp::SetAutosaveTimerTime(void) { #if defined(_XBOX_ONE) || defined(__ORBIS__) m_uiAutosaveTimer= GetTickCount()+1000*60; @@ -8928,23 +8928,23 @@ void CMinecraftApp::SetAutosaveTimerTime(void) #endif }// value x 15 to get mins, x60 for secs -bool CMinecraftApp::AutosaveDue(void) -{ +bool CMinecraftApp::AutosaveDue(void) +{ return (GetTickCount()>m_uiAutosaveTimer); } -unsigned int CMinecraftApp::SecondsToAutosave() -{ - return (m_uiAutosaveTimer - GetTickCount() ) / 1000; +unsigned int CMinecraftApp::SecondsToAutosave() +{ + return (m_uiAutosaveTimer - GetTickCount() ) / 1000; } -void CMinecraftApp::SetTrialTimerStart(void) +void CMinecraftApp::SetTrialTimerStart(void) { m_fTrialTimerStart=m_Time.fAppTime; mfTrialPausedTime=0.0f; } -float CMinecraftApp::getTrialTimer(void) -{ +float CMinecraftApp::getTrialTimer(void) +{ return m_Time.fAppTime-m_fTrialTimerStart-mfTrialPausedTime; } @@ -8979,7 +8979,7 @@ bool CMinecraftApp::IsLocalMultiplayerAvailable() //#else // for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) // { - // if( (i!=userIndex) && (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + // if( (i!=userIndex) && (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) // { // iOtherConnectedControllers++; // } @@ -8993,7 +8993,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 @@ -9054,7 +9054,7 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) case XC_LOCALE_UNITED_ARAB_EMIRATES: case XC_LOCALE_GREAT_BRITAIN: locales.push_back(eMCLang_enGB); - break; + break; default: //XC_LOCALE_UNITED_STATES break; } @@ -9151,7 +9151,7 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) break; case XC_LANGUAGE_BNORWEGIAN : locales.push_back(eMCLang_nbNO); - locales.push_back(eMCLang_noNO); + locales.push_back(eMCLang_noNO); locales.push_back(eMCLang_nnNO); break; case XC_LANGUAGE_DUTCH : @@ -9294,7 +9294,7 @@ 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"; diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h index 68f4ccd4..110054f2 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -28,7 +28,7 @@ typedef struct _JoinFromInviteData DWORD dwUserIndex; // dwUserIndex DWORD dwLocalUsersMask; // dwUserMask const INVITE_INFO *pInviteInfo; // pInviteInfo -} +} JoinFromInviteData; class Player; @@ -50,7 +50,7 @@ class Merchant; class CMinecraftAudio; -class CMinecraftApp +class CMinecraftApp #ifdef _XBOX : public CXuiModule @@ -87,7 +87,7 @@ public: #ifdef _EXTENDED_ACHIEVEMENTS /* 4J-JEV: - * We need more space in the profile data because of the new achievements and statistics + * 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 @@ -108,7 +108,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;} @@ -152,14 +152,14 @@ public: void SetGlobalXuiAction(eXuiAction action) {m_eGlobalXuiAction=action;} eXuiAction GetXuiAction(int iPad) {return m_eXuiAction[iPad];} void SetAction(int iPad, eXuiAction action, LPVOID param = NULL); - void SetTMSAction(int iPad, eTMSAction action) {m_eTMSAction[iPad]=action; } + void SetTMSAction(int iPad, eTMSAction action) {m_eTMSAction[iPad]=action; } eTMSAction GetTMSAction(int iPad) {return m_eTMSAction[iPad];} eXuiServerAction GetXuiServerAction(int iPad) {return m_eXuiServerAction[iPad];} LPVOID GetXuiServerActionParam(int iPad) {return m_eXuiServerActionParam[iPad];} void SetXuiServerAction(int iPad, eXuiServerAction action, LPVOID param = NULL) {m_eXuiServerAction[iPad]=action; m_eXuiServerActionParam[iPad] = param;} eXuiServerAction GetGlobalXuiServerAction() {return m_eGlobalXuiServerAction;} void SetGlobalXuiServerAction(eXuiServerAction action) {m_eGlobalXuiServerAction=action;} - + DisconnectPacket::eDisconnectReason GetDisconnectReason() { return m_disconnectReason; } void SetDisconnectReason(DisconnectPacket::eDisconnectReason bVal) { m_disconnectReason = bVal; } @@ -224,7 +224,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 @@ -268,7 +268,7 @@ public: void SetGameSettingsDebugMask(int iPad, unsigned int uiVal); void ActionDebugMask(int iPad, bool bSetAllClear=false); - // + // bool IsLocalMultiplayerAvailable(); // for sign in change monitoring @@ -343,7 +343,7 @@ public: // Texture Pack Data files (icon, banner, comparison shot & text) void AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes); - void RemoveMemoryTPDFile(int iConfig); + void RemoveMemoryTPDFile(int iConfig); bool IsFileInTPD(int iConfig); void GetTPD(int iConfig,PBYTE *ppbData,DWORD *pdwBytes); int GetTPDSize() {return m_MEM_TPD.size();} @@ -424,11 +424,11 @@ 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]; + + VBANNEDLIST *m_vBannedListA[XUSER_MAX_COUNT]; void HandleButtonPresses(int iPad); @@ -456,7 +456,7 @@ private: static unsigned int m_uiLastSignInData; - // We've got sizeof(GAME_SETTINGS) bytes reserved at the start of the gamedefined data per player for settings + // We've got sizeof(GAME_SETTINGS) bytes reserved at the start of the gamedefined data per player for settings GAME_SETTINGS *GameSettingsA[XUSER_MAX_COUNT]; // For promo work @@ -489,7 +489,7 @@ public: // trial timer void SetTrialTimerStart(void); float getTrialTimer(void); - + // notifications from the game for qnet VNOTIFICATIONS *GetNotifications() {return &m_vNotifications;} @@ -501,7 +501,7 @@ private: eXuiAction m_eXuiAction[XUSER_MAX_COUNT]; eTMSAction m_eTMSAction[XUSER_MAX_COUNT]; LPVOID m_eXuiActionParam[XUSER_MAX_COUNT]; - eXuiAction m_eGlobalXuiAction; + eXuiAction m_eGlobalXuiAction; eXuiServerAction m_eXuiServerAction[XUSER_MAX_COUNT]; LPVOID m_eXuiServerActionParam[XUSER_MAX_COUNT]; eXuiServerAction m_eGlobalXuiServerAction; @@ -525,20 +525,20 @@ private: // Trial timer float m_fTrialTimerStart,mfTrialPausedTime; typedef struct TimeInfo - { - LARGE_INTEGER qwTime; - LARGE_INTEGER qwAppTime; + { + LARGE_INTEGER qwTime; + LARGE_INTEGER qwAppTime; - float fAppTime; - float fElapsedTime; - float fSecsPerTick; - } TIMEINFO; + float fAppTime; + float fElapsedTime; + float fSecsPerTick; + } TIMEINFO; TimeInfo m_Time; protected: - static const int MAX_TIPS_GAMETIP = 50; - static const int MAX_TIPS_TRIVIATIP = 20; + static const int MAX_TIPS_GAMETIP = 50; + static const int MAX_TIPS_TRIVIATIP = 20; static TIPSTRUCT m_GameTipA[MAX_TIPS_GAMETIP]; static TIPSTRUCT m_TriviaTipA[MAX_TIPS_TRIVIATIP]; static Random *TipRandom; @@ -590,7 +590,7 @@ public: DLC_INFO *GetDLCInfoForFullOfferID(WCHAR *pwchProductId); DLC_INFO *GetDLCInfoForProductName(WCHAR *pwchProductName); #else - static HRESULT RegisterDLCData(WCHAR *, WCHAR *, int, uint64_t, uint64_t, WCHAR *, unsigned int, int, WCHAR *pDataFile); + static HRESULT RegisterDLCData(WCHAR *, WCHAR *, int, __uint64, __uint64, WCHAR *, unsigned int, int, WCHAR *pDataFile); bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal); DLC_INFO *GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial); DLC_INFO *GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full); @@ -618,7 +618,7 @@ private: #if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) static unordered_map MojangData; static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs - static unordered_map DLCInfo; + static unordered_map DLCInfo; static unordered_map DLCInfo_SkinName; // skin name, full offer id #elif defined(_DURANGO) static unordered_map MojangData; @@ -701,7 +701,7 @@ public: // World seed from png image void GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsigned char *pszSeed,unsigned int &uiHostOptions,bool &bHostOptionsRead,DWORD &uiTexturePack); - unsigned int CreateImageTextData(PBYTE bTextMetadata, int64_t seed, bool hasSeed, unsigned int uiHostOptions, unsigned int uiTexturePackId); + unsigned int CreateImageTextData(PBYTE bTextMetadata, __int64 seed, bool hasSeed, unsigned int uiHostOptions, unsigned int uiTexturePackId); // Game rules GameRuleManager m_gameRules; @@ -745,7 +745,7 @@ public: unsigned int AddTMSPPFileTypeRequest(eDLCContentType eType, bool bPromote=false); int GetDLCInfoTexturesOffersCount(); #if defined( __PS3__) || defined(__ORBIS__) || defined(__PSVITA__) - DLC_INFO *GetDLCInfo(int iIndex); + DLC_INFO *GetDLCInfo(int iIndex); DLC_INFO *GetDLCInfo(char *); DLC_INFO *GetDLCInfoFromTPackID(int iTPID); bool GetDLCNameForPackID(const int iPackID,char **ppchKeyID); @@ -887,15 +887,15 @@ public: #ifdef _XBOX // bool m_bTransferSavesToXboxOne; // unsigned int m_uiTransferSlotC; - + #elif defined (__PS3__) - + #elif defined _DURANGO - + #elif defined _WINDOWS64 //CMinecraftAudio audio; #else // PS4 - + #endif #ifdef _XBOX_ONE @@ -907,5 +907,5 @@ private: #endif }; -//singleton +//singleton //extern CMinecraftApp app; diff --git a/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h index e5dffb3c..21c42dea 100644 --- a/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h @@ -19,17 +19,17 @@ private: ConsoleSchematicFile::ESchematicRotation m_rotation; int m_dimension; - int64_t m_totalBlocksChanged; - int64_t m_totalBlocksChangedLighting; + __int64 m_totalBlocksChanged; + __int64 m_totalBlocksChangedLighting; bool m_completed; void updateLocationBox(); -public: +public: ApplySchematicRuleDefinition(LevelGenerationOptions *levelGenOptions); ~ApplySchematicRuleDefinition(); virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_ApplySchematic; } - + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp index 0eef096b..4a4e27b2 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -38,7 +38,7 @@ void ConsoleSchematicFile::save(DataOutputStream *dos) dos->writeInt(m_zSize); byteArray ba(new BYTE[ m_data.length ], m_data.length); - Compression::getCompression()->CompressLZXRLE( ba.data, &ba.length, + Compression::getCompression()->CompressLZXRLE( ba.data, &ba.length, m_data.data, m_data.length); dos->writeInt(ba.length); @@ -71,13 +71,13 @@ void ConsoleSchematicFile::load(DataInputStream *dis) m_ySize = dis->readInt(); m_zSize = dis->readInt(); - int compressedSize = dis->readInt(); + int compressedSize = dis->readInt(); byteArray compressedBuffer(compressedSize); dis->readFully(compressedBuffer); if(m_data.data != NULL) { - delete [] m_data.data; + delete [] m_data.data; m_data.data = NULL; } @@ -145,7 +145,7 @@ void ConsoleSchematicFile::load(DataInputStream *dis) double z = pos->get(2)->data; if( type == eTYPE_PAINTING || type == eTYPE_ITEM_FRAME ) - { + { x = ((IntTag *) eTag->get(L"TileX") )->data; y = ((IntTag *) eTag->get(L"TileY") )->data; z = ((IntTag *) eTag->get(L"TileZ") )->data; @@ -184,7 +184,7 @@ void ConsoleSchematicFile::save_tags(DataOutputStream *dos) delete tag; } -int64_t ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +__int64 ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) { int xStart = max(destinationBox->x0, (double)chunk->x*16); int xEnd = min(destinationBox->x1, (double)((xStart>>4)<<4) + 16); @@ -281,7 +281,7 @@ int64_t ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkB // blockData[i] = Tile::whiteStone_Id; // } //} - + PIXBeginNamedEvent(0,"Setting Block data"); chunk->setBlockData(blockData); PIXEndNamedEvent(); @@ -323,7 +323,7 @@ int64_t ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkB // At the point that this is called, we have all the neighbouring chunks loaded in (and generally post-processed, apart from this lighting pass), so // we can do the sort of lighting that might propagate out of the chunk. -int64_t ConsoleSchematicFile::applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +__int64 ConsoleSchematicFile::applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) { int xStart = max(destinationBox->x0, (double)chunk->x*16); int xEnd = min(destinationBox->x1, (double)((xStart>>4)<<4) + 16); @@ -447,7 +447,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, shared_ptr teCopy = chunk->getTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); if ( teCopy != NULL ) - { + { CompoundTag *teData = new CompoundTag(); te->save(teData); @@ -480,7 +480,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, for(AUTO_VAR(it, m_entities.begin()); it != m_entities.end();) { Vec3 *source = it->first; - + double targetX = source->x; double targetY = source->y + destinationBox->y0; double targetZ = source->z; @@ -500,7 +500,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, if( e->GetType() == eTYPE_PAINTING ) { shared_ptr painting = dynamic_pointer_cast(e); - + double tileX = painting->xTile; double tileZ = painting->zTile; schematicCoordToChunkCoord(destinationBox, painting->xTile, painting->zTile, rot, tileX, tileZ); @@ -513,7 +513,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, else if( e->GetType() == eTYPE_ITEM_FRAME ) { shared_ptr frame = dynamic_pointer_cast(e); - + double tileX = frame->xTile; double tileZ = frame->zTile; schematicCoordToChunkCoord(destinationBox, frame->xTile, frame->zTile, rot, tileX, tileZ); @@ -561,7 +561,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l zStart-=1; else if(zStart < 0 && zStart%2 !=0) zStart-=1; - + // We want the end to be odd to have a total size that is even if(xEnd > 0 && xEnd%2 == 0) xEnd+=1; @@ -615,7 +615,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l // Every x is a whole row for(int xPos = xStart; xPos < xStart + xSize; ++xPos) - { + { int xc = xPos >> 4; int x0 = xPos - xc * 16; @@ -624,7 +624,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l if (x1 > 16) x1 = 16; for(int zPos = zStart; zPos < zStart + zSize;) - { + { int zc = zPos >> 4; int z0 = zStart - zc * 16; @@ -718,7 +718,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l { CompoundTag *eTag = new CompoundTag(); if( e->save(eTag) ) - { + { ListTag *pos = (ListTag *) eTag->getList(L"Pos"); pos->get(0)->data -= xStart; @@ -726,7 +726,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l pos->get(2)->data -= zStart; if( e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME ) - { + { ((IntTag *) eTag->get(L"TileX") )->data -= xStart; ((IntTag *) eTag->get(L"TileY") )->data -= yStart; ((IntTag *) eTag->get(L"TileZ") )->data -= zStart; @@ -767,7 +767,7 @@ void ConsoleSchematicFile::getBlocksAndData(LevelChunk *chunk, byteArray *data, // skyLightP += skyLightData.length; // return; //} - + bool bHasLower, bHasUpper; bHasLower = bHasUpper = false; int lowerY0, lowerY1, upperY0, upperY1; diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h index b0eebf9e..f37a6058 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h @@ -58,7 +58,7 @@ private: vector > m_tileEntities; vector< pair > m_entities; -public: +public: byteArray m_data; public: @@ -72,8 +72,8 @@ public: void save(DataOutputStream *dos); void load(DataInputStream *dis); - int64_t applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); - int64_t applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + __int64 applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + __int64 applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); void applyTileEntities(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); static void generateSchematicFile(DataOutputStream *dos, Level *level, int xStart, int yStart, int zStart, int xEnd, int yEnd, int zEnd, bool bSaveMobs, Compression::ECompressionTypes); diff --git a/Minecraft.Client/Common/GameRules/GameRule.h b/Minecraft.Client/Common/GameRules/GameRule.h index 3b9dba7e..bdc2ceff 100644 --- a/Minecraft.Client/Common/GameRules/GameRule.h +++ b/Minecraft.Client/Common/GameRules/GameRule.h @@ -14,7 +14,7 @@ public: typedef struct _ValueType { union{ - int64_t i64; + __int64 i64; int i; char c; bool b; @@ -44,7 +44,7 @@ public: virtual ~GameRule(); Connection *getConnection() { return m_connection; } - + ValueType getParameter(const wstring ¶meterName); void setParameter(const wstring ¶meterName,ValueType value); GameRuleDefinition *getGameRuleDefinition(); diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp index 373030d4..0c6a7804 100644 --- a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -77,7 +77,7 @@ WCHAR *GameRuleManager::wchAttrNameA[] = L"spawnY", // eGameRuleAttr_spawnY L"spawnZ", // eGameRuleAttr_spawnZ L"orientation", - L"dimension", + L"dimension", L"topTileId", // eGameRuleAttr_topTileId L"biomeId", // eGameRuleAttr_biomeId L"feature", // eGameRuleAttr_feature @@ -114,7 +114,7 @@ void GameRuleManager::loadGameRules(DLCPack *pack) readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); - + //createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); dlcHeader->lgo = createdLevelGenerationOptions; @@ -130,12 +130,12 @@ void GameRuleManager::loadGameRules(DLCPack *pack) LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); // = loadGameRules(dData, dSize); //, strings); - + createdLevelGenerationOptions->setGrSource( new JustGrSource() ); readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_tutorial ); - + //createdLevelGenerationOptions->set_DLCGameRulesFile( dlcFile ); createdLevelGenerationOptions->setLoadedData(); @@ -169,7 +169,7 @@ void GameRuleManager::loadGameRules(LevelGenerationOptions *lgo, byte *dIn, UINT app.DebugPrintf("\tversion=%d.\n", version); for (int i = 0; i < 8; i++) dis.readByte(); - + BYTE compression_type = dis.readByte(); app.DebugPrintf("\tcompressionType=%d.\n", compression_type); @@ -179,11 +179,11 @@ void GameRuleManager::loadGameRules(LevelGenerationOptions *lgo, byte *dIn, UINT decomp_len = dis.readInt(); app.DebugPrintf("\tcompr_len=%d.\n\tdecomp_len=%d.\n", compr_len, decomp_len); - + // Decompress File Body - byteArray content(new BYTE[decomp_len], decomp_len), + byteArray content(new BYTE[decomp_len], decomp_len), compr_content(new BYTE[compr_len], compr_len); dis.read(compr_content); @@ -256,7 +256,7 @@ void GameRuleManager::saveGameRules(byte **dOut, UINT *dSize) // Initialise output stream. ByteArrayOutputStream baos; DataOutputStream dos(&baos); - + // Write header. // VERSION NUMBER @@ -284,7 +284,7 @@ void GameRuleManager::saveGameRules(byte **dOut, UINT *dSize) compr_dos.writeInt( 0 ); // XmlObjects.length } else - { + { StringTable *st = m_currentGameRuleDefinitions->getStringTable(); if (st == NULL) @@ -316,9 +316,9 @@ void GameRuleManager::saveGameRules(byte **dOut, UINT *dSize) dos.writeInt( compr_ba.length ); // Write length dos.writeInt( compr_baos.buf.length ); dos.write(compr_ba); - + delete [] compr_ba.data; - + compr_dos.close(); compr_baos.close(); // -- END COMPRESSED -- // @@ -328,7 +328,7 @@ void GameRuleManager::saveGameRules(byte **dOut, UINT *dSize) *dOut = baos.buf.data; baos.buf.data = NULL; - + dos.close(); baos.close(); } @@ -383,7 +383,7 @@ bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT //DWORD dwLen = 0; //PBYTE pbData = dlcFile->getData(dwLen); //byteArray data(pbData,dwLen); - + byteArray data(dIn, dSize); ByteArrayInputStream bais(data); DataInputStream dis(&bais); @@ -391,7 +391,7 @@ bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT // Read File. // version_number - int64_t version = dis.readShort(); + __int64 version = dis.readShort(); unsigned char compressionType = 0; if(version == 0) { @@ -502,7 +502,7 @@ bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT } }*/ - // subfile + // subfile UINT numFiles = contentDis->readInt(); for (UINT i = 0; i < numFiles; i++) { @@ -570,10 +570,10 @@ bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT LevelGenerationOptions *GameRuleManager::readHeader(DLCGameRulesHeader *grh) { - LevelGenerationOptions *out = + LevelGenerationOptions *out = new LevelGenerationOptions(); - + out->setSrc(LevelGenerationOptions::eSrc_fromDLC); out->setGrSource(grh); addLevelGenerationOptions(out); @@ -733,7 +733,7 @@ LPCWSTR GameRuleManager::GetGameRulesString(const wstring &key) LEVEL_GEN_ID GameRuleManager::addLevelGenerationOptions(LevelGenerationOptions *lgo) { vector *lgs = m_levelGenerators.getLevelGenerators(); - + for (int i = 0; isize(); i++) if (lgs->at(i) == lgo) return i; @@ -753,7 +753,7 @@ void GameRuleManager::unloadCurrentGameRules() if (m_currentLevelGenerationOptions->isFromSave()) { m_levelGenerators.removeLevelGenerator( m_currentLevelGenerationOptions ); - + delete m_currentLevelGenerationOptions; } else if (m_currentLevelGenerationOptions->isFromDLC()) diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp index a36d8549..717b066e 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -70,17 +70,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 +93,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 +110,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++) @@ -162,7 +162,7 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws { if(attributeName.compare(L"seed") == 0) { - m_seed = _fromString(attributeValue); + m_seed = _fromString<__int64>(attributeValue); app.DebugPrintf("LevelGenerationOptions: Adding parameter m_seed=%I64d\n",m_seed); } else if(attributeName.compare(L"spawnX") == 0) @@ -213,7 +213,7 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws app.DebugPrintf("LevelGenerationOptions: Adding parameter displayName=%ls\n", getDisplayName()); } else if(attributeName.compare(L"texturePackId") == 0) - { + { setRequiredTexturePackId( _fromString(attributeValue) ); setRequiresTexturePack( true ); app.DebugPrintf("LevelGenerationOptions: Adding parameter texturePackId=%0x\n", getRequiredTexturePackId()); @@ -290,14 +290,14 @@ bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) { - ConsoleGenerateStructure *structureStart = *it; + ConsoleGenerateStructure *structureStart = *it; int minY = structureStart->getMinY(); if(minY < m_minY) m_minY = minY; } m_bHaveMinY = true; } - + // 4J Stu - We DO NOT intersect if our upper bound is below the lower bound for all schematics if( y1 < m_minY ) return false; @@ -313,7 +313,7 @@ bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int { for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) { - ConsoleGenerateStructure *structureStart = *it; + ConsoleGenerateStructure *structureStart = *it; intersects = structureStart->checkIntersects(x0,y0,z0,x1,y1,z1); if(intersects) break; } @@ -438,12 +438,12 @@ unordered_map *LevelGenerationOptions::getUnfin usedFiles.insert( (*it)->getSchematicName() ); // Clean schematic files. - unordered_map *out + unordered_map *out = new unordered_map(); for (AUTO_VAR(it, usedFiles.begin()); it!=usedFiles.end(); it++) out->insert( pair(*it, getSchematicFile(*it)) ); - - return out; + + return out; } void LevelGenerationOptions::reset_start() @@ -505,7 +505,7 @@ void LevelGenerationOptions::deleteBaseSaveData() { if(m_pbBaseSaveData) delete bool LevelGenerationOptions::hasLoadedData() { return m_hasLoadedData; } void LevelGenerationOptions::setLoadedData() { m_hasLoadedData = true; } -int64_t LevelGenerationOptions::getLevelSeed() { return m_seed; } +__int64 LevelGenerationOptions::getLevelSeed() { return m_seed; } 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 6ae6f033..0cc9da79 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h @@ -19,7 +19,7 @@ class GrSource public: // 4J-JEV: // Moved all this here; I didn't like that all this header information - // was being mixed in with all the game information as they have + // was being mixed in with all the game information as they have // completely different lifespans. virtual bool requiresTexturePack()=0; @@ -146,7 +146,7 @@ public: private: // This should match the "MapOptionsRule" definition in the XML schema - int64_t m_seed; + __int64 m_seed; bool m_useFlatWorld; Pos *m_spawnPos; vector m_schematicRules; @@ -167,13 +167,13 @@ public: ~LevelGenerationOptions(); virtual ConsoleGameRules::EGameRuleType getActionType(); - + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); virtual void getChildren(vector *children); virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); - int64_t getLevelSeed(); + __int64 getLevelSeed(); Pos *getSpawnPos(); bool getuseFlatWorld(); @@ -185,7 +185,7 @@ public: private: void clearSchematics(); -public: +public: ConsoleSchematicFile *loadSchematicFile(const wstring &filename, PBYTE pbData, DWORD dwLen); public: @@ -203,7 +203,7 @@ public: LPCWSTR getString(const wstring &key); unordered_map *getUnfinishedSchematicFiles(); - + // 4J-JEV: // ApplySchematicRules contain limited state // which needs to be reset BEFORE a new game starts. diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp index 5fd72e40..2a80f80a 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -44,8 +44,8 @@ CGameNetworkManager g_NetworkManager; CPlatformNetworkManager *CGameNetworkManager::s_pPlatformNetworkManager; -int64_t CGameNetworkManager::messageQueue[512]; -int64_t CGameNetworkManager::byteQueue[512]; +__int64 CGameNetworkManager::messageQueue[512]; +__int64 CGameNetworkManager::byteQueue[512]; int CGameNetworkManager::messageQueuePos = 0; CGameNetworkManager::CGameNetworkManager() @@ -74,7 +74,7 @@ void CGameNetworkManager::Initialise() #else s_pPlatformNetworkManager = new CPlatformNetworkManagerStub(); #endif - s_pPlatformNetworkManager->Initialise( this, flagIndexSize ); + s_pPlatformNetworkManager->Initialise( this, flagIndexSize ); m_bNetworkThreadRunning = false; m_bInitialised = true; } @@ -104,7 +104,7 @@ void CGameNetworkManager::DoWork() if((g_NetworkManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1 && bConnected == false && g_NetworkManager.IsInSession() ) { app.SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); - } + } } break; case XN_LIVE_INVITE_ACCEPTED: @@ -161,12 +161,12 @@ bool CGameNetworkManager::_RunNetworkGame(LPVOID lpParameter) success = s_pPlatformNetworkManager->_RunNetworkGame(); if(!success) - { + { app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); return true; } } - + if( g_NetworkManager.IsLeavingGame() ) return false; app.SetGameStarted(true); @@ -188,12 +188,12 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame ProfileManager.SetDeferredSignoutEnabled(true); #endif - int64_t seed = 0; + __int64 seed = 0; if(lpParameter != NULL) { NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; seed = param->seed; - + app.setLevelGenerationOptions(param->levelGen); if(param->levelGen != NULL) { @@ -204,12 +204,12 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame } else { - param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); } } } - static int64_t sseed = seed; // Create static version so this will be valid until next call to this function & whilst thread is running + static __int64 sseed = seed; // Create static version so this will be valid until next call to this function & whilst thread is running ServerStoppedCreate(false); if( g_NetworkManager.IsHost() ) { @@ -227,7 +227,7 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame ServerReadyWait(); ServerReadyDestroy(); - if( MinecraftServer::serverHalted() ) + if( MinecraftServer::serverHalted() ) return false; // printf("Server ready to go!\n"); @@ -238,7 +238,7 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame } #ifndef _XBOX - Minecraft *pMinecraft = Minecraft::GetInstance(); + Minecraft *pMinecraft = Minecraft::GetInstance(); // Make sure that we have transitioned through any joining/creating stages and are actually playing the game, so that we know the players should be valid bool changedMessage = false; while(!IsReadyToPlayOrIdle()) @@ -458,7 +458,7 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame return false; } - + if(g_NetworkManager.IsLeavingGame() || !IsInSession() ) { for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it) @@ -754,7 +754,7 @@ int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContin ProfileManager.SetPrimaryPad(iPad); g_NetworkManager.SetLocalGame(false); - + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen ProfileManager.QuerySigninStatus(); @@ -770,7 +770,7 @@ int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContin pInviteInfo ); // pInviteInfo if( !success ) { - app.DebugPrintf( "Failed joining game from invite\n" ); + app.DebugPrintf( "Failed joining game from invite\n" ); } } } @@ -816,7 +816,7 @@ int CGameNetworkManager::RunNetworkGameThreadProc( void* lpParameter ) Compression::UseDefaultThreadStorage(); Tile::CreateNewThreadStorage(); IntCache::CreateNewThreadStorage(); - + g_NetworkManager.m_bNetworkThreadRunning = true; bool success = g_NetworkManager._RunNetworkGame(lpParameter); g_NetworkManager.m_bNetworkThreadRunning = false; @@ -828,7 +828,7 @@ int CGameNetworkManager::RunNetworkGameThreadProc( void* lpParameter ) Sleep(1); } ui.CleanUpSkinReload(); - if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) + if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) { app.SetDisconnectReason( DisconnectPacket::eDisconnect_ConnectionCreationFailed ); } @@ -850,7 +850,7 @@ int CGameNetworkManager::RunNetworkGameThreadProc( void* lpParameter ) int CGameNetworkManager::ServerThreadProc( void* lpParameter ) { - int64_t seed = 0; + __int64 seed = 0; if(lpParameter != NULL) { NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; @@ -861,7 +861,7 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) SetThreadName(-1, "Minecraft Server thread"); AABB::CreateNewThreadStorage(); Vec3::CreateNewThreadStorage(); - IntCache::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); Compression::UseDefaultThreadStorage(); OldChunkStorage::UseDefaultThreadStorage(); Entity::useSmallIds(); @@ -869,7 +869,7 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) Tile::CreateNewThreadStorage(); MinecraftServer::main(seed, lpParameter); //saveData, app.GetGameHostOption(eGameHostOption_All)); - + Tile::ReleaseThreadStorage(); AABB::ReleaseThreadStorage(); Vec3::ReleaseThreadStorage(); @@ -926,7 +926,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) // The pair of methods MustSignInReturned_0 & PSNSignInReturned_0 handle this int CGameNetworkManager::MustSignInReturned_0(void *pParam,int iPad,C4JStorage::EMessageResult result) { - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { #ifdef __PS3__ SQRNetworkManager_PS3::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); @@ -986,7 +986,7 @@ int CGameNetworkManager::PSNSignInReturned_0(void* pParam, bool bContinue, int i // The pair of methods MustSignInReturned_1 & PSNSignInReturned_1 handle this int CGameNetworkManager::MustSignInReturned_1(void *pParam,int iPad,C4JStorage::EMessageResult result) { - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { #ifdef __PS3__ SQRNetworkManager_PS3::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); @@ -1018,7 +1018,7 @@ int CGameNetworkManager::PSNSignInReturned_1(void* pParam, bool bContinue, int i #elif defined __ORBIS__ // TODO: No Orbis equivalent (should there be?) #endif - + } } @@ -1043,7 +1043,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) Vec3::UseDefaultThreadStorage(); Compression::UseDefaultThreadStorage(); - Minecraft *pMinecraft = Minecraft::GetInstance(); + Minecraft *pMinecraft = Minecraft::GetInstance(); MinecraftServer *pServer = MinecraftServer::getInstance(); #if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ @@ -1082,7 +1082,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); } - + #else pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); @@ -1096,7 +1096,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) // wait for the server to be in a non-ticking state pServer->m_serverPausedEvent->WaitForSignal(INFINITE); - + #if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ // Swap these two messages around as one is too long to display at 480 pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); @@ -1158,7 +1158,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) { Sleep(1); } - + // Reset this flag as the we don't need to know that we only lost the room only from this point onwards, the behaviour is exactly the same g_NetworkManager.m_bLastDisconnectWasLostRoomOnly = false; g_NetworkManager.m_bFullSessionMessageOnNextSessionChange = false; @@ -1189,7 +1189,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) { Sleep(1); } - + // Restore the network player of all the server players that are local if( pServer != NULL ) { @@ -1218,7 +1218,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) } } } - + pMinecraft->progressRenderer->progressStagePercentage(100); #ifndef _XBOX @@ -1240,7 +1240,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) #endif // Start the game again - app.SetGameStarted(true); + app.SetGameStarted(true); app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); app.SetChangingSessionType(false); app.SetReallyChangingSessionType(false); @@ -1294,7 +1294,7 @@ void CGameNetworkManager::StateChange_AnyToJoining() app.DebugPrintf("Disabling Guest Signin\n"); XEnableGuestSignin(FALSE); Minecraft::GetInstance()->clearPendingClientTextureRequests(); - + ConnectionProgressParams *param = new ConnectionProgressParams(); param->iPad = ProfileManager.GetPrimaryPad(); param->stringId = -1; @@ -1342,7 +1342,7 @@ void CGameNetworkManager::StateChange_AnyToStarting() completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; completionData->iPad = ProfileManager.GetPrimaryPad(); loadingParams->completionData = completionData; - + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); } } @@ -1463,7 +1463,7 @@ void CGameNetworkManager::PlayerJoining( INetworkPlayer *pNetworkPlayer ) bool multiplayer = g_NetworkManager.GetPlayerCount() > 1, localgame = g_NetworkManager.IsLocalGame(); for (int iPad=0; iPadIsHost() ) - { + { for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { if(Minecraft::GetInstance()->localplayers[idx] != NULL) @@ -1544,7 +1544,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * } // Need to check we're signed in to PSN - bool isSignedInLive = true; + bool isSignedInLive = true; bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); int iPadNotSignedInLive = -1; for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) @@ -1584,7 +1584,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); } else - { + { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; @@ -1601,10 +1601,10 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * { m_pInviteInfo = (INVITE_INFO *) pInviteInfo; m_iPlayerInvited = userIndex; - + m_pUpsell = new PsPlusUpsellWrapper(index); m_pUpsell->displayUpsell(); - + return; } } @@ -1612,7 +1612,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * #ifdef __PSVITA__ // Need to check we're signed in to PSN - bool isSignedInLive = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); + bool isSignedInLive = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); if (!isSignedInLive) { // Determine why they're not "signed in live" @@ -1625,7 +1625,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * // 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; @@ -1648,9 +1648,9 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * // 4J-PB we shouldn't bring any inactive players into the game, except for the invited player (who may be an inactive player) // 4J Stu - If we are not in a game, then bring in all players signed in if(index==userIndex || pMinecraft->localplayers[index]!=NULL ) - { + { ++joiningUsers; - if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; localUsersMask |= GetLocalPlayerMask( index ); } } @@ -1667,7 +1667,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); if(!pccAllowed && !pccFriendsAllowed) noUGC = true; #endif - + #if defined(_XBOX) || defined(__PS3__) if(joiningUsers > 1 && !RenderManager.IsHiDef() && userIndex != ProfileManager.GetPrimaryPad()) { @@ -1716,9 +1716,9 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * } #endif if( !g_NetworkManager.IsInSession() ) - { + { #ifndef __PS3__ - HandleInviteWhenInMenus(userIndex, pInviteInfo); + HandleInviteWhenInMenus(userIndex, pInviteInfo); #else // PS3 is more complicated here - we need to make sure that the player is online. If they are then we can do the same as the xbox, if not we need to try and get them online and then, if they do sign in, go down the same path if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) @@ -1771,7 +1771,7 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I if(!ProfileManager.IsFullVersion()) { // The marketplace will fail with the primary player set to -1 - ProfileManager.SetPrimaryPad(userIndex); + ProfileManager.SetPrimaryPad(userIndex); app.SetAction(userIndex,eAppAction_DashboardTrialJoinFromInvite); } @@ -1809,7 +1809,7 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I ProfileManager.QuerySigninStatus(); // 4J-PB - clear any previous connection errors - Minecraft::GetInstance()->clearConnectionFailed(); + Minecraft::GetInstance()->clearConnectionFailed(); g_NetworkManager.SetLocalGame(false); @@ -1819,7 +1819,7 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I bool success = g_NetworkManager.JoinGameFromInviteInfo( userIndex, localUsersMask, pInviteInfo ); if( !success ) { - app.DebugPrintf( "Failed joining game from invite\n" ); + app.DebugPrintf( "Failed joining game from invite\n" ); } } } diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h index 482cfd2a..1bb532da 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.h +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -99,11 +99,11 @@ public: void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); void ForceFriendsSessionRefresh(); - + // Session joining and leaving bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); - eJoinGameResult JoinGame(FriendSessionInfo *searchResult, int localUsersMask); + eJoinGameResult JoinGame(FriendSessionInfo *searchResult, int localUsersMask); static void CancelJoinGame(LPVOID lpParam); // Not part of the shared interface bool LeaveGame(bool bMigrateHost); static int JoinFromInvite_SignInReturned(void *pParam,bool bContinue, int iPad); @@ -112,13 +112,13 @@ public: void ResetLeavingGame(); // Threads - + bool IsNetworkThreadRunning(); static int RunNetworkGameThreadProc( void* lpParameter ); static int ServerThreadProc( void* lpParameter ); static int ExitAndJoinFromInviteThreadProc( void* lpParam ); -#if (defined __PS3__) || (defined __ORBIS__) || (defined __PSVITA__) +#if (defined __PS3__) || (defined __ORBIS__) || (defined __PSVITA__) static int MustSignInReturned_0(void *pParam,int iPad,C4JStorage::EMessageResult result); static int PSNSignInReturned_0(void* pParam, bool bContinue, int iPad); @@ -129,7 +129,7 @@ public: static void _LeaveGame(); static int ChangeSessionTypeThreadProc( void* lpParam ); - // System flags + // System flags void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); @@ -144,8 +144,8 @@ public: void ServerStoppedCreate(bool create); // Create the signal void ServerStopped(); // Signal that we are ready - void ServerStoppedWait(); // Wait for the signal - void ServerStoppedDestroy(); // Destroy signal + void ServerStoppedWait(); // Wait for the signal + void ServerStoppedDestroy(); // Destroy signal bool ServerStoppedValid(); // Is non-NULL #ifdef __PSVITA__ @@ -163,9 +163,9 @@ public: // Used for debugging output static const int messageQueue_length = 512; - static int64_t messageQueue[messageQueue_length]; + static __int64 messageQueue[messageQueue_length]; static const int byteQueue_length = 512; - static int64_t byteQueue[byteQueue_length]; + static __int64 byteQueue[byteQueue_length]; static int messageQueuePos; // Methods called from PlatformNetworkManager diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp index d745fb85..ccb1957d 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp @@ -25,11 +25,11 @@ static SceRemoteStorageStatus statParams; // { // app.DebugPrintf("remoteStorageGetCallback err : 0x%08x\n"); // } -// +// // void remoteStorageCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) // { // app.DebugPrintf("remoteStorageCallback err : 0x%08x\n"); -// +// // app.getRemoteStorage()->getRemoteFileInfo(&statParams, remoteStorageGetInfoCallback, NULL); // } @@ -161,17 +161,17 @@ ESavePlatform SonyRemoteStorage::getSavePlatform() } -int64_t SonyRemoteStorage::getSaveSeed() +__int64 SonyRemoteStorage::getSaveSeed() { if(m_getInfoStatus != e_infoFound) return 0; DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; char seedString[17]; - ZeroMemory(seedString,17); + ZeroMemory(seedString,17); memcpy(seedString, pDescData->m_seed,16); - uint64_t seed = 0; + __uint64 seed = 0; std::stringstream ss; ss << seedString; ss >> std::hex >> seed; @@ -185,7 +185,7 @@ unsigned int SonyRemoteStorage::getSaveHostOptions() DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; char optionsString[9]; - ZeroMemory(optionsString,9); + ZeroMemory(optionsString,9); memcpy(optionsString, pDescData->m_hostOptions,8); unsigned int uiHostOptions = 0; @@ -202,7 +202,7 @@ unsigned int SonyRemoteStorage::getSaveTexturePack() DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; char textureString[9]; - ZeroMemory(textureString,9); + ZeroMemory(textureString,9); memcpy(textureString, pDescData->m_texturePack,8); unsigned int uiTexturePack = 0; @@ -219,9 +219,9 @@ const char* SonyRemoteStorage::getRemoteSaveFilename() int SonyRemoteStorage::getSaveFilesize() { - if(m_getInfoStatus == e_infoFound) + if(m_getInfoStatus == e_infoFound) { - return m_remoteFileInfo->fileSize; + return m_remoteFileInfo->fileSize; } return 0; } @@ -284,9 +284,9 @@ bool SonyRemoteStorage::saveIsAvailable() if(m_getInfoStatus != e_infoFound) return false; #ifdef __PS3__ - return (getSavePlatform() == SAVE_FILE_PLATFORM_PSVITA); + return (getSavePlatform() == SAVE_FILE_PLATFORM_PSVITA); #elif defined __PSVITA__ - return (getSavePlatform() == SAVE_FILE_PLATFORM_PS3); + return (getSavePlatform() == SAVE_FILE_PLATFORM_PS3); #else // __ORBIS__ return true; #endif @@ -294,7 +294,7 @@ bool SonyRemoteStorage::saveIsAvailable() int SonyRemoteStorage::getDataProgress() { - int64_t time = System::currentTimeMillis(); + __int64 time = System::currentTimeMillis(); int elapsedSecs = (time - m_startTime) / 1000; int progVal = m_dataProgress + (elapsedSecs/3); if(progVal > 95) @@ -310,15 +310,15 @@ bool SonyRemoteStorage::shutdown() if(m_bInitialised) { int ret = sceRemoteStorageTerm(); - if(ret >= 0) + if(ret >= 0) { app.DebugPrintf("Term request done \n"); m_bInitialised = false; free(m_memPoolBuffer); m_memPoolBuffer = NULL; return true; - } - else + } + else { app.DebugPrintf("Error in Term request: 0x%x \n", ret); return false; diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h index 3967a109..f435848e 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "..\..\Common\Network\Sony\sceRemoteStorage\header\sceRemoteStorage.h" @@ -42,7 +42,7 @@ public: SceRemoteStorageData* m_remoteFileInfo; class DescriptionData - { + { // this stuff is read from a JSON query, so it all has to be text based, max 256 bytes public: char m_platform[4]; @@ -72,7 +72,7 @@ public: const char* getLocalFilename(); const char* getSaveNameUTF8(); ESavePlatform getSavePlatform(); - int64_t getSaveSeed(); + __int64 getSaveSeed(); unsigned int getSaveHostOptions(); unsigned int getSaveTexturePack(); @@ -97,7 +97,7 @@ public: static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); static int setDataThread(void* lpParam); - SonyRemoteStorage() : m_memPoolBuffer(NULL), m_bInitialised(false),m_getInfoStatus(e_noInfoFound) {} + SonyRemoteStorage() : m_memPoolBuffer(NULL), m_bInitialised(false),m_getInfoStatus(e_noInfoFound) {} protected: const char* getRemoteSaveFilename(); @@ -111,7 +111,7 @@ protected: unsigned int m_thumbnailDataSize; C4JThread* m_SetDataThread; PSAVE_INFO m_setDataSaveInfo; - int64_t m_startTime; + __int64 m_startTime; bool m_bAborting; bool m_bTransferStarted; diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp index f7e44b17..b0a0d665 100644 --- a/Minecraft.Client/Common/Tutorial/Tutorial.cpp +++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp @@ -41,7 +41,7 @@ bool Tutorial::PopupMessageDetails::isSameContent(PopupMessageDetails *other) void Tutorial::staticCtor() { - // + // /* ***** ***** @@ -72,7 +72,7 @@ void Tutorial::staticCtor() s_completableTasks.push_back( e_Tutorial_State_Enchanting ); s_completableTasks.push_back( e_Tutorial_Hint_Hold_To_Mine ); - s_completableTasks.push_back( e_Tutorial_Hint_Tool_Damaged ); + s_completableTasks.push_back( e_Tutorial_Hint_Tool_Damaged ); s_completableTasks.push_back( e_Tutorial_Hint_Swim_Up ); s_completableTasks.push_back( e_Tutorial_Hint_Unused_2 ); @@ -164,7 +164,7 @@ void Tutorial::staticCtor() s_completableTasks.push_back( e_Tutorial_Hint_Thin_Glass ); s_completableTasks.push_back( e_Tutorial_Hint_Melon ); s_completableTasks.push_back( e_Tutorial_Hint_Vine ); - s_completableTasks.push_back( e_Tutorial_Hint_Fence_Gate ); + s_completableTasks.push_back( e_Tutorial_Hint_Fence_Gate ); s_completableTasks.push_back( e_Tutorial_Hint_Mycel ); s_completableTasks.push_back( e_Tutorial_Hint_Water_Lily ); s_completableTasks.push_back( e_Tutorial_Hint_Nether_Brick ); @@ -448,7 +448,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) if(!isHintCompleted(e_Tutorial_Hint_Detector_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Detector_Rail, this, detectorRailItems, 1 ) ); int tallGrassItems[] = {Tile::tallgrass_Id}; - if(!isHintCompleted(e_Tutorial_Hint_Tall_Grass)) + if(!isHintCompleted(e_Tutorial_Hint_Tall_Grass)) { addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::DEAD_SHRUB ) ); addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::TALL_GRASS ) ); @@ -731,7 +731,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) int potatoItems[] = {Tile::potatoes_Id}; if(!isHintCompleted(e_Tutorial_Hint_Potato)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Potato, this, potatoItems, 1, -1, -1, 7 ) ); - + int carrotItems[] = {Tile::carrots_Id}; if(!isHintCompleted(e_Tutorial_Hint_Carrot)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Carrot, this, carrotItems, 1, -1, -1, 7 ) ); @@ -1208,7 +1208,7 @@ void Tutorial::tick() } else if(m_freezeTime && m_timeFrozen && m_fullTutorialComplete) { - int64_t currentTime = pMinecraft->level->getTime(); + __int64 currentTime = pMinecraft->level->getTime(); int currentDayTime = (currentTime % Level::TICKS_PER_DAY); int timeToAdd = 0; if(currentDayTime > m_iTutorialFreezeTimeValue) @@ -1219,7 +1219,7 @@ void Tutorial::tick() { timeToAdd = m_iTutorialFreezeTimeValue - currentDayTime; } - int64_t targetTime = currentTime + timeToAdd; + __int64 targetTime = currentTime + timeToAdd; MinecraftServer::SetTimeOfDay(-1); MinecraftServer::SetTime(targetTime); pMinecraft->level->setOverrideTimeOfDay(-1); @@ -1228,7 +1228,7 @@ void Tutorial::tick() } if(!m_allowShow) - { + { if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) { uiTempDisabled = true; @@ -1264,7 +1264,7 @@ void Tutorial::tick() app.TutorialSceneNavigateBack(m_iPad); m_bSceneIsSplitscreen=app.GetLocalPlayerCount()>1; if(m_bSceneIsSplitscreen) - { + { app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); } else @@ -1359,7 +1359,7 @@ void Tutorial::tick() { isCurrentTask = false; if( - ( !task->ShowMinimumTime() || ( task->hasBeenActivated() && (lastMessageTime + m_iTutorialMinimumDisplayMessageTime ) < GetTickCount() ) ) + ( !task->ShowMinimumTime() || ( task->hasBeenActivated() && (lastMessageTime + m_iTutorialMinimumDisplayMessageTime ) < GetTickCount() ) ) && task->isCompleted() ) { @@ -1503,7 +1503,7 @@ void Tutorial::tick() message->m_promptId = currentTask[m_CurrentState]->getPromptId(); message->m_allowFade = currentTask[m_CurrentState]->AllowFade(); setMessage( message ); - currentTask[m_CurrentState]->TaskReminders()? m_iTaskReminders = 1 : m_iTaskReminders = 0; + currentTask[m_CurrentState]->TaskReminders()? m_iTaskReminders = 1 : m_iTaskReminders = 0; } else { @@ -1636,7 +1636,7 @@ bool Tutorial::setMessage(TutorialHint *hint, PopupMessageDetails *message) bool messageShown = false; DWORD time = GetTickCount(); if(message != NULL && (message->m_forceDisplay || hintsOn) && - (!message->m_delay || + (!message->m_delay || ( (m_hintDisplayed && (time - m_lastHintDisplayedTime) > m_iTutorialHintDelayTime ) || (!m_hintDisplayed && (time - lastMessageTime) > m_iTutorialMinimumDisplayMessageTime ) @@ -1648,7 +1648,7 @@ bool Tutorial::setMessage(TutorialHint *hint, PopupMessageDetails *message) if(messageShown) { - m_lastHintDisplayedTime = time; + m_lastHintDisplayedTime = time; m_hintDisplayed = true; if(hint!=NULL) setHintCompleted( hint ); } @@ -1672,7 +1672,7 @@ void Tutorial::showTutorialPopup(bool show) m_allowShow = show; if(!show) - { + { if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) { uiTempDisabled = true; @@ -2099,7 +2099,7 @@ void Tutorial::changeTutorialState(eTutorial_State newState, UIScene *scene /*= // The action that caused the change of state may also have completed the current task if( currentTask[m_CurrentState] != NULL && currentTask[m_CurrentState]->isCompleted() ) { - activeTasks[m_CurrentState].erase( find( activeTasks[m_CurrentState].begin(), activeTasks[m_CurrentState].end(), currentTask[m_CurrentState]) ); + activeTasks[m_CurrentState].erase( find( activeTasks[m_CurrentState].begin(), activeTasks[m_CurrentState].end(), currentTask[m_CurrentState]) ); if( activeTasks[m_CurrentState].size() > 0 ) { diff --git a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp index bad12b3f..a418fcda 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp @@ -47,7 +47,7 @@ void UIComponent_Panorama::tick() EnterCriticalSection(&pMinecraft->m_setLevelCS); if(pMinecraft->level!=NULL) { - int64_t i64TimeOfDay =0; + __int64 i64TimeOfDay =0; // are we in the Nether? - Leave the time as 0 if we are, so we show daylight if(pMinecraft->level->dimension->id==0) { @@ -104,7 +104,7 @@ void UIComponent_Panorama::render(S32 width, S32 height, C4JRender::eViewportTyp IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); IggyPlayerDrawTilesStart ( getMovie() ); - + m_renderWidth = tileWidth; m_renderHeight = tileHeight; IggyPlayerDrawTile ( getMovie() , @@ -112,7 +112,7 @@ void UIComponent_Panorama::render(S32 width, S32 height, C4JRender::eViewportTyp tileYStart , tileXStart + tileWidth , tileYStart + tileHeight , - 0 ); + 0 ); IggyPlayerDrawTilesEnd ( getMovie() ); } else diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp index d6f81a60..dfdea93e 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_t min, int64_t max) +void UIControl_SpaceIndicatorBar::init(const wstring &label, int id, __int64 min, __int64 max) { m_label = label; m_id = id; @@ -61,11 +61,11 @@ void UIControl_SpaceIndicatorBar::reset() setSaveGameOffset(0.0f); } -void UIControl_SpaceIndicatorBar::addSave(int64_t size) +void UIControl_SpaceIndicatorBar::addSave(__int64 size) { float startPercent = (float)((m_currentTotal-m_min))/(m_max-m_min); - m_sizeAndOffsets.push_back( pair(size, startPercent) ); + m_sizeAndOffsets.push_back( pair<__int64, float>(size, startPercent) ); m_currentTotal += size; setTotalSize(m_currentTotal); @@ -75,7 +75,7 @@ void UIControl_SpaceIndicatorBar::selectSave(int index) { if(index >= 0 && index < m_sizeAndOffsets.size()) { - pair values = m_sizeAndOffsets[index]; + pair<__int64,float> values = m_sizeAndOffsets[index]; setSaveSize(values.first); setSaveGameOffset(values.second); } @@ -86,7 +86,7 @@ void UIControl_SpaceIndicatorBar::selectSave(int index) } } -void UIControl_SpaceIndicatorBar::setSaveSize(int64_t size) +void UIControl_SpaceIndicatorBar::setSaveSize(__int64 size) { m_currentSave = size; @@ -99,7 +99,7 @@ void UIControl_SpaceIndicatorBar::setSaveSize(int64_t size) IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setSaveSizeFunc , 1 , value ); } -void UIControl_SpaceIndicatorBar::setTotalSize(int64_t size) +void UIControl_SpaceIndicatorBar::setTotalSize(__int64 size) { float percent = (float)((m_currentTotal-m_min))/(m_max-m_min); diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h index 08e00da9..39f9a746 100644 --- a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h @@ -6,28 +6,28 @@ class UIControl_SpaceIndicatorBar : public UIControl_Base { private: IggyName m_setSaveSizeFunc, m_setTotalSizeFunc, m_setSaveGameOffsetFunc; - int64_t m_min; - int64_t m_max; - int64_t m_currentSave, m_currentTotal; + __int64 m_min; + __int64 m_max; + __int64 m_currentSave, m_currentTotal; float m_currentOffset; - vector > m_sizeAndOffsets; + vector > m_sizeAndOffsets; public: UIControl_SpaceIndicatorBar(); virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, int64_t min, int64_t max); + void init(const wstring &label, int id, __int64 min, __int64 max); virtual void ReInit(); void reset(); - void addSave(int64_t size); + void addSave(__int64 size); void selectSave(int index); private: - void setSaveSize(int64_t size); - void setTotalSize(int64_t totalSize); + void setSaveSize(__int64 size); + void setTotalSize(__int64 totalSize); void setSaveGameOffset(float offset); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp index 34afbc71..eb33b6b3 100644 --- a/Minecraft.Client/Common/UI/UIController.cpp +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -124,7 +124,7 @@ extern "C" void *__real_malloc(size_t t); extern "C" void __real_free(void *t); #endif -int64_t UIController::iggyAllocCount = 0; +__int64 UIController::iggyAllocCount = 0; static unordered_map allocations; static void * RADLINK AllocateFunction ( void * alloc_callback_user_data , size_t size_requested , size_t * size_returned ) { @@ -272,7 +272,7 @@ void UIController::postInit() IggySetTextureSubstitutionCallbacks ( &UIController::TextureSubstitutionCreateCallback , &UIController::TextureSubstitutionDestroyCallback, this ); SetupFont(); - // + // loadSkins(); for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) @@ -402,7 +402,7 @@ void UIController::tick() EnderDragonRenderer::bossInstance = nullptr; // Clear out the cached movie file data - int64_t currentTime = System::currentTimeMillis(); + __int64 currentTime = System::currentTimeMillis(); for(AUTO_VAR(it, m_cachedMovieData.begin()); it != m_cachedMovieData.end();) { if(it->second.m_expiry < currentTime) @@ -522,7 +522,7 @@ IggyLibrary UIController::loadSkin(const wstring &skinPath, const wstring &skinN IggyMemoryUseInfo memoryInfo; rrbool res; int iteration = 0; - int64_t totalStatic = 0; + __int64 totalStatic = 0; while(res = IggyDebugGetMemoryUseInfo ( NULL , lib , "" , @@ -632,7 +632,7 @@ void UIController::CleanUpSkinReload() { if(!Minecraft::GetInstance()->skins->getSelected()->hasAudio()) { -#ifdef _DURANGO +#ifdef _DURANGO DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); #else DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); @@ -653,7 +653,7 @@ void UIController::CleanUpSkinReload() byteArray UIController::getMovieData(const wstring &filename) { // Cache everything we load in the current tick - int64_t targetTime = System::currentTimeMillis() + (1000LL * 60); + __int64 targetTime = System::currentTimeMillis() + (1000LL * 60); AUTO_VAR(it,m_cachedMovieData.find(filename)); if(it == m_cachedMovieData.end() ) { @@ -699,7 +699,7 @@ void UIController::handleInput() { #ifdef _DURANGO // 4J-JEV: Added exception for primary play who migh've uttered speech commands. - if(iPad != ProfileManager.GetPrimaryPad() + if(iPad != ProfileManager.GetPrimaryPad() && (!InputManager.IsPadConnected(iPad) || !InputManager.IsPadLocked(iPad)) ) continue; #endif for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) @@ -775,7 +775,7 @@ void UIController::handleKeyPress(unsigned int iPad, unsigned int key) { // no active touch? clear active and highlighted touch UI elements m_ActiveUIElement = NULL; - m_HighlightedUIElement = NULL; + m_HighlightedUIElement = NULL; // fullscreen first UIScene *pScene=m_groups[(int)eUIGroup_Fullscreen]->getCurrentScene(); @@ -825,7 +825,7 @@ void UIController::handleKeyPress(unsigned int iPad, unsigned int key) } } } - } + } else if(m_bTouchscreenPressed && pTouchData->reportNum==1) { // fullscreen first @@ -1006,8 +1006,8 @@ void UIController::handleKeyPress(unsigned int iPad, unsigned int key) //!(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<closeAllScenes(); m_groups[(int)group]->getTooltips()->SetTooltips(-1); - + // This should cause the popup to dissappear TutorialPopupInfo popupInfo; if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetTutorialDescription(&popupInfo); @@ -1865,7 +1865,7 @@ void UIController::SetMenuDisplayed(int iPad,bool bVal) #ifdef _DURANGO // 4J-JEV: When in-game, allow player to toggle the 'Pause' and 'IngameInfo' menus via Kinnect. - if (Minecraft::GetInstance()->running) + if (Minecraft::GetInstance()->running) InputManager.SetEnabledGtcButtons(_360_GTC_MENU | _360_GTC_PAUSE | _360_GTC_VIEW); #endif } @@ -2280,7 +2280,7 @@ void UIController::SetTrialTimerLimitSecs(unsigned int uiSeconds) void UIController::UpdateTrialTimer(unsigned int iPad) { - WCHAR wcTime[20]; + WCHAR wcTime[20]; DWORD dwTimeTicks=(DWORD)app.getTrialTimer(); @@ -2342,7 +2342,7 @@ void UIController::ShowAutosaveCountdownTimer(bool show) void UIController::UpdateAutosaveCountdownTimer(unsigned int uiSeconds) { #if !(defined(_XBOX_ONE) || defined(__ORBIS__)) - WCHAR wcAutosaveCountdown[100]; + WCHAR wcAutosaveCountdown[100]; swprintf( wcAutosaveCountdown, 100, app.GetString(IDS_AUTOSAVE_COUNTDOWN),uiSeconds); if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(wcAutosaveCountdown); #endif @@ -2507,7 +2507,7 @@ C4JStorage::EMessageResult UIController::RequestUGCMessageBox(UINT title/* = -1 #ifdef __ORBIS__ // Show the vague UGC system message in addition to our message ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION, iPad ); - return C4JStorage::EMessage_ResultAccept; + return C4JStorage::EMessage_ResultAccept; #elif defined(__PSVITA__) ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, iPad ); UINT uiIDA[1]; @@ -2544,7 +2544,7 @@ C4JStorage::EMessageResult UIController::RequestContentRestrictedMessageBox(UINT #ifdef __ORBIS__ // Show the vague UGC system message in addition to our message ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION, iPad ); - return C4JStorage::EMessage_ResultAccept; + return C4JStorage::EMessage_ResultAccept; #elif defined(__PSVITA__) ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_AGE_RESTRICTION, iPad ); return C4JStorage::EMessage_ResultAccept; @@ -2584,7 +2584,7 @@ void UIController::setFontCachingCalculationBuffer(int length) } } -// Returns the first scene of given type if it exists, NULL otherwise +// Returns the first scene of given type if it exists, NULL otherwise UIScene *UIController::FindScene(EUIScene sceneType) { UIScene *pScene = NULL; @@ -2723,7 +2723,7 @@ void UIController::TouchBoxesClear(UIScene *pUIScene) for (AUTO_VAR(it, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].begin()); it != itEnd; it++) { UIELEMENT *element=(UIELEMENT *)*it; - delete element; + delete element; } m_TouchBoxes[eUIGroup][eUILayer][eUIscene].clear(); } @@ -2759,7 +2759,7 @@ bool UIController::TouchBoxHit(UIScene *pUIScene,S32 x, S32 y) return true; } } - } + } } //app.DebugPrintf("MISS at x = %i y = %i\n", (int)x, (int)y); diff --git a/Minecraft.Client/Common/UI/UIController.h b/Minecraft.Client/Common/UI/UIController.h index f8f695bd..ef064f80 100644 --- a/Minecraft.Client/Common/UI/UIController.h +++ b/Minecraft.Client/Common/UI/UIController.h @@ -15,7 +15,7 @@ class UIControl; class UIController : public IUIController { public: - static int64_t iggyAllocCount; + static __int64 iggyAllocCount; // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded static CRITICAL_SECTION ms_reloadSkinCS; @@ -29,7 +29,7 @@ private: CRITICAL_SECTION m_navigationLock; static const int UI_REPEAT_KEY_DELAY_MS = 300; // How long from press until the first repeat - static const int UI_REPEAT_KEY_REPEAT_RATE_MS = 100; // How long in between repeats + static const int UI_REPEAT_KEY_REPEAT_RATE_MS = 100; // How long in between repeats DWORD m_actionRepeatTimer[XUSER_MAX_COUNT][ACTION_MAX_MENU+1]; float m_fScreenWidth; @@ -45,7 +45,7 @@ private: // 4J-PB - ui element type for PSVita touch control #ifdef __PSVITA__ - typedef struct + typedef struct { UIControl *pControl; S32 x1,y1,x2,y2; @@ -110,7 +110,7 @@ private: C4JRender::eViewportType m_currentRenderViewport; bool m_bCustomRenderPosition; - + static DWORD m_dwTrialTimerLimitSecs; unordered_map m_substitutionTextures; @@ -118,7 +118,7 @@ private: typedef struct _CachedMovieData { byteArray m_ba; - int64_t m_expiry; + __int64 m_expiry; } CachedMovieData; unordered_map m_cachedMovieData; @@ -179,7 +179,7 @@ protected: void postInit(); -public: +public: CRITICAL_SECTION m_Allocatorlock; void SetupFont(); public: @@ -208,7 +208,7 @@ private: void tickInput(); void handleInput(); void handleKeyPress(unsigned int iPad, unsigned int key); - + protected: static rrbool RADLINK ExternalFunctionCallback( void * user_callback_data , Iggy * player , IggyExternalFunctionCallUTF16 * call ); @@ -278,7 +278,7 @@ private: public: void CloseAllPlayersScenes(); void CloseUIScenes(int iPad, bool forceIPad = false); - + virtual bool IsPauseMenuDisplayed(int iPad); virtual bool IsContainerMenuDisplayed(int iPad); virtual bool IsIgnorePlayerJoinMenuDisplayed(int iPad); diff --git a/Minecraft.Client/Common/UI/UIGroup.cpp b/Minecraft.Client/Common/UI/UIGroup.cpp index ed9d06b1..1899d05b 100644 --- a/Minecraft.Client/Common/UI/UIGroup.cpp +++ b/Minecraft.Client/Common/UI/UIGroup.cpp @@ -81,7 +81,7 @@ void UIGroup::tick() } // Handle deferred update focus - if (m_updateFocusStateCountdown > 0) + if (m_updateFocusStateCountdown > 0) { m_updateFocusStateCountdown--; if (m_updateFocusStateCountdown == 0)_UpdateFocusState(); @@ -233,7 +233,7 @@ void UIGroup::handleInput(int iPad, int key, bool repeat, bool pressed, bool rel } } -// FOCUS +// FOCUS // Check that a layer may recieve focus, specifically that there is no infocus layer above bool UIGroup::RequestFocus(UILayer* layerPtr) @@ -379,16 +379,16 @@ unsigned int UIGroup::GetLayerIndex(UILayer* layerPtr) // can't get here... return 0; } - -void UIGroup::PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic) + +void UIGroup::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) { - int64_t groupStatic = 0; - int64_t groupDynamic = 0; + __int64 groupStatic = 0; + __int64 groupDynamic = 0; app.DebugPrintf(app.USER_SR, "-- BEGIN GROUP %d\n",m_group); for(unsigned int i = 0; i < eUILayer_COUNT; ++i) { app.DebugPrintf(app.USER_SR, " \\- BEGIN LAYER %d\n",i); - m_layers[i]->PrintTotalMemoryUsage(groupStatic, groupDynamic); + m_layers[i]->PrintTotalMemoryUsage(groupStatic, groupDynamic); app.DebugPrintf(app.USER_SR, " \\- END LAYER %d\n",i); } app.DebugPrintf(app.USER_SR, "-- Group static: %d, Group dynamic: %d\n", groupStatic, groupDynamic); @@ -402,7 +402,7 @@ int UIGroup::getCommandBufferList() return m_commandBufferList; } -// Returns the first scene of given type if it exists, NULL otherwise +// Returns the first scene of given type if it exists, NULL otherwise UIScene *UIGroup::FindScene(EUIScene sceneType) { UIScene *pScene = NULL; diff --git a/Minecraft.Client/Common/UI/UIGroup.h b/Minecraft.Client/Common/UI/UIGroup.h index 8e16c2c3..e20fbb02 100644 --- a/Minecraft.Client/Common/UI/UIGroup.h +++ b/Minecraft.Client/Common/UI/UIGroup.h @@ -19,10 +19,10 @@ private: UIScene_HUD *m_hud; C4JRender::eViewportType m_viewportType; - + EUIGroup m_group; int m_iPad; - + bool m_bMenuDisplayed; bool m_bPauseMenuDisplayed; bool m_bContainerMenuDisplayed; @@ -90,7 +90,7 @@ public: void SetViewportType(C4JRender::eViewportType type); C4JRender::eViewportType GetViewportType(); - + virtual void HandleDLCMountingComplete(); virtual void HandleDLCInstalled(); #ifdef _XBOX_ONE @@ -99,15 +99,15 @@ public: bool IsFullscreenGroup(); void handleUnlockFullVersion(); - - void PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic); + + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); unsigned int GetLayerIndex(UILayer* layerPtr); int getCommandBufferList(); UIScene *FindScene(EUIScene sceneType); -private: +private: void _UpdateFocusState(); void updateStackStates(); }; diff --git a/Minecraft.Client/Common/UI/UILayer.cpp b/Minecraft.Client/Common/UI/UILayer.cpp index 6acfc85f..15bde2fa 100644 --- a/Minecraft.Client/Common/UI/UILayer.cpp +++ b/Minecraft.Client/Common/UI/UILayer.cpp @@ -38,7 +38,7 @@ void UILayer::tick() m_scenesToDelete.push_back(scene); } } - + while (!m_scenesToDestroy.empty()) { UIScene *scene = m_scenesToDestroy.back(); @@ -46,13 +46,13 @@ void UILayer::tick() scene->destroyMovie(); } m_scenesToDestroy.clear(); - + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) { (*it)->tick(); } // Note: reverse iterator, the last element is the top of the stack - int sceneIndex = m_sceneStack.size() - 1; + int sceneIndex = m_sceneStack.size() - 1; //for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) while( sceneIndex >= 0 && sceneIndex < m_sceneStack.size() ) { @@ -422,9 +422,9 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) } m_sceneStack.push_back(newScene); - + updateFocusState(); - + newScene->tick(); return true; @@ -706,12 +706,12 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) // 4J-PB - this should just be true m_bMenuDisplayed=true; - + EUIScene sceneType = scene->getSceneType(); switch(sceneType) { case eUIScene_PauseMenu: - m_bPauseMenuDisplayed = true; + m_bPauseMenuDisplayed = true; break; case eUIScene_Crafting2x2Menu: case eUIScene_Crafting3x3Menu: @@ -727,7 +727,7 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) // Intentional fall-through case eUIScene_DeathMenu: - case eUIScene_FullscreenProgress: + case eUIScene_FullscreenProgress: case eUIScene_SignEntryMenu: case eUIScene_EndPoem: m_bIgnoreAutosaveMenuDisplayed = true; @@ -736,7 +736,7 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) switch(sceneType) { - case eUIScene_FullscreenProgress: + case eUIScene_FullscreenProgress: case eUIScene_EndPoem: case eUIScene_Credits: case eUIScene_LeaderboardsMenu: @@ -775,8 +775,8 @@ void UILayer::handleInput(int iPad, int key, bool repeat, bool pressed, bool rel UIScene *scene = *it; if(scene->hasFocus(iPad) && scene->canHandleInput()) { - // 4J-PB - ignore repeats of action ABXY buttons - // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. + // 4J-PB - ignore repeats of action ABXY buttons + // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. // 4J Stu - Changed this slightly to add the allowRepeat function so we can allow repeats in the crafting menu if(repeat && !scene->allowRepeat(key) ) { @@ -784,8 +784,8 @@ void UILayer::handleInput(int iPad, int key, bool repeat, bool pressed, bool rel } scene->handleInput(iPad, key, repeat, pressed, released, handled); } - - // Fix for PS3 #444 - [IN GAME] If the user keeps pressing CROSS while on the 'Save Game' screen the title will crash. + + // Fix for PS3 #444 - [IN GAME] If the user keeps pressing CROSS while on the 'Save Game' screen the title will crash. handled = handled || scene->hidesLowerScenes(); if(handled ) break; } @@ -842,10 +842,10 @@ void UILayer::handleUnlockFullVersion() } } -void UILayer::PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic) +void UILayer::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) { - int64_t layerStatic = 0; - int64_t layerDynamic = 0; + __int64 layerStatic = 0; + __int64 layerDynamic = 0; for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) { (*it)->PrintTotalMemoryUsage(layerStatic, layerDynamic); @@ -859,7 +859,7 @@ void UILayer::PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic) totalDynamic += layerDynamic; } -// Returns the first scene of given type if it exists, NULL otherwise +// Returns the first scene of given type if it exists, NULL otherwise UIScene *UILayer::FindScene(EUIScene sceneType) { for (int i = 0; i < m_sceneStack.size(); i++) diff --git a/Minecraft.Client/Common/UI/UILayer.h b/Minecraft.Client/Common/UI/UILayer.h index 357c2874..2840f23f 100644 --- a/Minecraft.Client/Common/UI/UILayer.h +++ b/Minecraft.Client/Common/UI/UILayer.h @@ -66,12 +66,12 @@ public: // INPUT void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); -#ifdef __PSVITA__ +#ifdef __PSVITA__ // Current active scene UIScene *getCurrentScene(); #endif // FOCUS - + bool updateFocusState(bool allowedFocus = false); public: @@ -85,7 +85,7 @@ public: #endif void handleUnlockFullVersion(); UIScene *FindScene(EUIScene sceneType); - - void PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic); + + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); }; diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp index 75eb3dcf..e7d907ec 100644 --- a/Minecraft.Client/Common/UI/UIScene.cpp +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -13,7 +13,7 @@ UIScene::UIScene(int iPad, UILayer *parentLayer) m_iPad = iPad; swf = NULL; m_pItemRenderer = NULL; - + bHasFocus = false; m_hasTickedOnce = false; m_bFocussedOnce = false; @@ -27,7 +27,7 @@ UIScene::UIScene(int iPad, UILayer *parentLayer) m_bUpdateOpacity = false; m_backScene = NULL; - + m_cacheSlotRenders = false; m_needsCacheRendered = true; m_expectedCachedSlotCount = 0; @@ -94,7 +94,7 @@ void UIScene::reloadMovie(bool force) } handleReload(); - + IggyDataValue result; IggyDataValue value[1]; @@ -328,11 +328,11 @@ void UIScene::loadMovie() } byteArray baFile = ui.getMovieData(moviePath.c_str()); - int64_t beforeLoad = ui.iggyAllocCount; + __int64 beforeLoad = ui.iggyAllocCount; swf = IggyPlayerCreateFromMemory ( baFile.data , baFile.length, NULL); - int64_t afterLoad = ui.iggyAllocCount; - IggyPlayerInitializeAndTickRS ( swf ); - int64_t afterTick = ui.iggyAllocCount; + __int64 afterLoad = ui.iggyAllocCount; + IggyPlayerInitializeAndTickRS ( swf ); + __int64 afterTick = ui.iggyAllocCount; if(!swf) { @@ -343,7 +343,7 @@ void UIScene::loadMovie() app.FatalLoadError(); } app.DebugPrintf( app.USER_SR, "Loaded iggy movie %ls\n", moviePath.c_str() ); - IggyProperties *properties = IggyPlayerProperties ( swf ); + IggyProperties *properties = IggyPlayerProperties ( swf ); m_movieHeight = properties->movie_height_in_pixels; m_movieWidth = properties->movie_width_in_pixels; @@ -351,7 +351,7 @@ void UIScene::loadMovie() m_renderHeight = m_movieHeight; S32 width, height; - m_parentLayer->getRenderDimensions(width, height); + m_parentLayer->getRenderDimensions(width, height); IggyPlayerSetDisplaySize( swf, width, height ); IggyPlayerSetUserdata(swf,this); @@ -361,8 +361,8 @@ void UIScene::loadMovie() IggyMemoryUseInfo memoryInfo; rrbool res; int iteration = 0; - int64_t totalStatic = 0; - int64_t totalDynamic = 0; + __int64 totalStatic = 0; + __int64 totalDynamic = 0; while(res = IggyDebugGetMemoryUseInfo ( swf , NULL , 0 , @@ -372,7 +372,7 @@ void UIScene::loadMovie() { totalStatic += memoryInfo.static_allocation_bytes; totalDynamic += memoryInfo.dynamic_allocation_bytes; - app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), memoryInfo.subcategory_stringlen, memoryInfo.subcategory, + app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), memoryInfo.subcategory_stringlen, memoryInfo.subcategory, memoryInfo.static_allocation_bytes, memoryInfo.static_allocation_count, memoryInfo.dynamic_allocation_bytes, memoryInfo.dynamic_allocation_count); ++iteration; //if(memoryInfo.static_allocation_bytes > 0) getDebugMemoryUseRecursive(moviePath, memoryInfo); @@ -398,22 +398,22 @@ void UIScene::getDebugMemoryUseRecursive(const wstring &moviePath, IggyMemoryUse internalIteration , &internalMemoryInfo )) { - app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), internalMemoryInfo.subcategory_stringlen, internalMemoryInfo.subcategory, + app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), internalMemoryInfo.subcategory_stringlen, internalMemoryInfo.subcategory, internalMemoryInfo.static_allocation_bytes, internalMemoryInfo.static_allocation_count, internalMemoryInfo.dynamic_allocation_bytes, internalMemoryInfo.dynamic_allocation_count); ++internalIteration; if(internalMemoryInfo.subcategory_stringlen > memoryInfo.subcategory_stringlen) getDebugMemoryUseRecursive(moviePath, internalMemoryInfo); } } -void UIScene::PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic) +void UIScene::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) { if(!swf) return; IggyMemoryUseInfo memoryInfo; rrbool res; int iteration = 0; - int64_t sceneStatic = 0; - int64_t sceneDynamic = 0; + __int64 sceneStatic = 0; + __int64 sceneDynamic = 0; while(res = IggyDebugGetMemoryUseInfo ( swf , NULL , "" , @@ -483,7 +483,7 @@ void UIScene::tickTimers() { it = m_timers.erase(it); } - else + else { if(currentTime > it->second.targetTime) { @@ -634,7 +634,7 @@ void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iP if(useCommandBuffers) RenderManager.CBuffStart(list, true); #endif PIXBeginNamedEvent(0,"Draw uncached"); - ui.setupCustomDrawMatrices(this, customDrawRegion); + ui.setupCustomDrawMatrices(this, customDrawRegion); _customDrawSlotControl(customDrawRegion, iPad, item, fAlpha, isFoil, bDecorations, useCommandBuffers); delete customDrawRegion; PIXEndNamedEvent(); @@ -644,7 +644,7 @@ void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iP for(AUTO_VAR(it, m_cachedSlotDraw.begin()); it != m_cachedSlotDraw.end(); ++it) { CachedSlotDrawData *drawData = *it; - ui.setupCustomDrawMatrices(this, drawData->customDrawRegion); + ui.setupCustomDrawMatrices(this, drawData->customDrawRegion); _customDrawSlotControl(drawData->customDrawRegion, iPad, drawData->item, drawData->fAlpha, drawData->isFoil, drawData->bDecorations, useCommandBuffers); delete drawData->customDrawRegion; delete drawData; @@ -698,7 +698,7 @@ void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iP // Finish GDraw and anything else that needs to be finalised ui.endCustomDraw(region); } - } + } } void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer) @@ -716,7 +716,7 @@ void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_pt // we might want separate x & y scales here float scaleX = bwidth / 16.0f; - float scaleY = bheight / 16.0f; + float scaleY = bheight / 16.0f; glEnable(GL_RESCALE_NORMAL); glPushMatrix(); @@ -751,8 +751,8 @@ void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_pt if(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); @@ -975,8 +975,8 @@ int UIScene::convertGameActionToIggyKeycode(int action) bool UIScene::allowRepeat(int key) { - // 4J-PB - ignore repeats of action ABXY buttons - // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. + // 4J-PB - ignore repeats of action ABXY buttons + // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. switch(key) { case ACTION_MENU_OK: diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h index 1b646ce0..823c510c 100644 --- a/Minecraft.Client/Common/UI/UIScene.h +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -40,7 +40,7 @@ class UILayer; class UIScene { friend class UILayer; -public: +public: IggyValuePath *m_rootPath; private: @@ -80,7 +80,7 @@ public: protected: ESceneResolution m_loadedResolution; - + bool m_bIsReloading; bool m_bFocussedOnce; @@ -96,7 +96,7 @@ protected: public: virtual Iggy *getMovie() { return swf; } - + void destroyMovie(); virtual void reloadMovie(bool force = false); virtual bool needsReloaded(); @@ -127,7 +127,7 @@ private: void getDebugMemoryUseRecursive(const wstring &moviePath, IggyMemoryUseInfo &memoryInfo); public: - void PrintTotalMemoryUsage(int64_t &totalStatic, int64_t &totalDynamic); + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); public: UIScene(int iPad, UILayer *parentLayer); @@ -140,7 +140,7 @@ public: IggyName registerFastName(const wstring &name); #ifdef __PSVITA__ - void SetFocusToElement(int iID); + void SetFocusToElement(int iID); void UpdateSceneControls(); #endif protected: @@ -160,7 +160,7 @@ public: void gainFocus(); void loseFocus(); - + virtual void updateTooltips(); virtual void updateComponents() {} virtual void handleGainFocus(bool navBack); @@ -188,7 +188,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, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations); - + bool m_cacheSlotRenders; bool m_needsCacheRendered; int m_expectedCachedSlotCount; @@ -260,7 +260,7 @@ public: protected: -#ifdef _DURANGO +#ifdef _DURANGO virtual long long getDefaultGtcButtons() { return _360_GTC_BACK; } #endif diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp index 0c415c7b..6be67bed 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp @@ -61,11 +61,11 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay m_labelTexturePackDescription.init(L""); WCHAR TempString[256]; - swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); m_sliderDifficulty.init(TempString,eControl_Difficulty,0,3,app.GetGameSettings(m_iPad,eGameSetting_Difficulty)); m_MoreOptionsParams.bGenerateOptions=TRUE; - m_MoreOptionsParams.bStructures=TRUE; + m_MoreOptionsParams.bStructures=TRUE; m_MoreOptionsParams.bFlatWorld=FALSE; m_MoreOptionsParams.bBonusChest=FALSE; m_MoreOptionsParams.bPVP = TRUE; @@ -85,7 +85,7 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; // 4J-PB - Removing this so that we can attempt to create an online game on PS3 when we are a restricted child account - // It'll fail when we choose create, but this matches the behaviour of load game, and lets the player know why they can't play online, + // It'll fail when we choose create, but this matches the behaviour of load game, and lets the player know why they can't play online, // instead of just greying out the online setting in the More Options // #ifdef __PS3__ // if(ProfileManager.IsSignedInLive( m_iPad )) @@ -118,9 +118,9 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay { // The profile settings say Online, but either the player is offline, or they are not allowed to play online m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; - } + } } - + #if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 if(getSceneResolution() == eSceneResolution_1080) { @@ -339,7 +339,7 @@ int UIScene_CreateWorldMenu::ContinueOffline(void *pParam,int iPad,C4JStorage::E UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { pClass->m_MoreOptionsParams.bOnlineGame=false; pClass->checkStateAndStartGame(); @@ -374,7 +374,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.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); } #endif @@ -385,7 +385,7 @@ void UIScene_CreateWorldMenu::handleInput(int iPad, int key, bool repeat, bool p 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) { @@ -557,7 +557,7 @@ void UIScene_CreateWorldMenu::StartSharedLaunchFlow() if(m_MoreOptionsParams.dwTexturePack!=0) { // texture pack hasn't been set yet, so check what it will be - TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexturePack; m_pDLCPack=pDLCTexPack->getDLCInfoParentPack(); @@ -609,7 +609,7 @@ void UIScene_CreateWorldMenu::StartSharedLaunchFlow() 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.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); #endif #if defined _XBOX_ONE || defined __ORBIS__ @@ -636,7 +636,7 @@ void UIScene_CreateWorldMenu::handleSliderMove(F64 sliderId, F64 currentValue) m_sliderDifficulty.handleSliderMove(value); app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); - swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[value])); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[value])); m_sliderDifficulty.setLabel(TempString); break; } @@ -683,7 +683,7 @@ void UIScene_CreateWorldMenu::handleTimerComplete(int id) m_MoreOptionsParams.bInviteOnly = FALSE; m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; } - + #if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 if(getSceneResolution() == eSceneResolution_1080) { @@ -721,7 +721,7 @@ void UIScene_CreateWorldMenu::handleTimerComplete(int id) PBYTE pbImageData=NULL; app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); - ListInfo.fEnabled = TRUE; + ListInfo.fEnabled = TRUE; ListInfo.iData = m_iConfigA[i]; HRESULT hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); app.DebugPrintf("Adding texturepack %d from TPD\n",m_iConfigA[i]); @@ -803,7 +803,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() bool isOnlineGame = m_MoreOptionsParams.bOnlineGame; int iPadNotSignedInLive = -1; bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); - + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) { if (ProfileManager.IsSignedIn(i) && (i == primaryPad || isLocalMultiplayerAvailable)) @@ -855,7 +855,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() ui.RequestMessageBox(IDS_PRO_CURRENTLY_NOT_ONLINE_TITLE, IDS_PRO_PSNOFFLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL,NULL, app.GetStringTable()); } else - { + { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_CONFIRM_OK; @@ -901,7 +901,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() SceNpCommerceDialogParam param; sceNpCommerceDialogParamInitialize(¶m); param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; - param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); iResult=sceNpCommerceDialogOpen(¶m); @@ -916,7 +916,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() #endif if(m_bGameModeSurvival != true || m_MoreOptionsParams.bHostPrivileges == TRUE) - { + { UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; @@ -980,7 +980,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() SceNpCommerceDialogParam param; sceNpCommerceDialogParamInitialize(¶m); param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; - param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); iResult=sceNpCommerceDialogOpen(¶m); @@ -1033,8 +1033,8 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() SceNpCommerceDialogParam param; sceNpCommerceDialogParamInitialize(¶m); param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; - param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; - param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); iResult=sceNpCommerceDialogOpen(¶m); @@ -1107,13 +1107,13 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD // start the game bool isFlat = (pClass->m_MoreOptionsParams.bFlatWorld==TRUE); - int64_t seedValue = 0; + __int64 seedValue = 0; NetworkGameInitData *param = new NetworkGameInitData(); if (wSeed.length() != 0) { - int64_t value = 0; + __int64 value = 0; unsigned int len = (unsigned int)wSeed.length(); //Check if the input string contains a numerical value @@ -1132,7 +1132,7 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD //If the input string is a numerical value, convert it to a number if( isNumber ) - value = _fromString(wSeed); + value = _fromString<__int64>(wSeed); //If the value is not 0 use it, otherwise use the algorithm from the java String.hashCode() function to hash it if( value != 0 ) @@ -1336,7 +1336,7 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu } } else - { + { pClass->m_bIgnoreInput = false; } return 0; @@ -1347,7 +1347,7 @@ int UIScene_CreateWorldMenu::ConfirmCreateReturned(void *pParam,int iPad,C4JStor { UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; @@ -1392,7 +1392,7 @@ int UIScene_CreateWorldMenu::ConfirmCreateReturned(void *pParam,int iPad,C4JStor ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); } else - { + { #if defined( __ORBIS__) || defined(__PSVITA__) bool isOnlineGame = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; if(isOnlineGame) @@ -1422,7 +1422,7 @@ int UIScene_CreateWorldMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStor UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu *)pParam; pClass->m_bIgnoreInput = false; - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_CreateWorldMenu::StartGame_SignInReturned, pClass, false, iPad); } @@ -1434,28 +1434,28 @@ int UIScene_CreateWorldMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStor // { // int32_t iResult; // UIScene_CreateWorldMenu *pClass = (UIScene_CreateWorldMenu *)pParam; -// +// // // continue offline, or upsell PS Plus? -// if(result==C4JStorage::EMessage_ResultDecline) +// if(result==C4JStorage::EMessage_ResultDecline) // { // // upsell psplus // int32_t iResult=sceNpCommerceDialogInitialize(); -// +// // SceNpCommerceDialogParam param; // sceNpCommerceDialogParamInitialize(¶m); // param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; -// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; +// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; // param.userId = ProfileManager.getUserID(pClass->m_iPad); -// +// // iResult=sceNpCommerceDialogOpen(¶m); // } -// else if(result==C4JStorage::EMessage_ResultAccept) +// else if(result==C4JStorage::EMessage_ResultAccept) // { // // continue offline // pClass->m_MoreOptionsParams.bOnlineGame=false; // pClass->checkStateAndStartGame(); // } -// +// // pClass->m_bIgnoreInput=false; // return 0; // } diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h index c3e0ca1c..e45fa09c 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h @@ -16,13 +16,13 @@ private: }; static int m_iDifficultyTitleSettingA[4]; - + UIControl m_controlMainPanel; UIControl_Label m_labelGameName, m_labelSeed, m_labelCreatedMode; UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonLoadWorld; UIControl_Slider m_sliderDifficulty; UIControl_BitmapIcon m_bitmapIcon; - + #if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 UIControl_CheckBox m_checkboxOnline; #endif @@ -35,7 +35,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 @@ -48,7 +48,7 @@ private: LevelGenerationOptions *m_levelGen; DLCPack * m_pDLCPack; - + int m_iSaveGameInfoIndex; int m_CurrentDifficulty; bool m_bGameModeSurvival; @@ -61,7 +61,7 @@ private: bool m_bRequestQuadrantSignin; bool m_bIsCorrupt; bool m_bThumbnailGetFailed; - int64_t m_seed; + __int64 m_seed; #ifdef __PS3__ std::vector*m_pvProductInfo; @@ -75,7 +75,7 @@ private: bool m_bRebuildTouchBoxes; public: UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLayer); - + virtual void updateTooltips(); virtual void updateComponents(); @@ -110,7 +110,7 @@ private: #ifdef _DURANGO static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); #endif - + static int ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); static void StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocalUsersMask); static int LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bIsOwner); diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp index 166c708d..1d90da77 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -207,7 +207,7 @@ UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer bool bTexturePackAlreadyListed; bool bNeedToGetTPD=false; Minecraft *pMinecraft = Minecraft::GetInstance(); - int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) { @@ -311,7 +311,7 @@ void UIScene_LoadOrJoinMenu::updateTooltips() // update the tooltips // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should the the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; int iLB = -1; int iX=-1; @@ -322,7 +322,7 @@ void UIScene_LoadOrJoinMenu::updateTooltips() else if (DoesSavesListHaveFocus()) { if((m_iDefaultButtonsC > 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) - { + { if(StorageManager.GetSaveDisabled()) { iRB=IDS_TOOLTIPS_DELETESAVE; @@ -378,7 +378,7 @@ void UIScene_LoadOrJoinMenu::updateTooltips() // Is there a save from PS3 or PSVita available? // Sony asked that this be displayed at all times so users are aware of the functionality. We'll display some text when there's no save available //if(app.getRemoteStorage()->saveIsAvailable()) - { + { bool bSignedInLive = ProfileManager.IsSignedInLive(m_iPad); if(bSignedInLive) { @@ -393,7 +393,7 @@ void UIScene_LoadOrJoinMenu::updateTooltips() ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, iX, iY,-1,-1,iLB,iRB); } -// +// void UIScene_LoadOrJoinMenu::Initialise() { m_iSaveListIndex = 0; @@ -481,7 +481,7 @@ void UIScene_LoadOrJoinMenu::handleGainFocus(bool navBack) { app.SetLiveLinkRequired( true ); - m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); // re-enable button presses m_bIgnoreInput=false; @@ -825,7 +825,7 @@ void UIScene_LoadOrJoinMenu::GetSaveInfo() m_pSaveDetails=StorageManager.ReturnSavesInfo(); if(m_pSaveDetails==NULL) { - C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); } #endif @@ -874,7 +874,7 @@ void UIScene_LoadOrJoinMenu::GetSaveInfo() m_pSaveDetails=StorageManager.ReturnSavesInfo(); if(m_pSaveDetails==NULL) { - C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); } #if TO_BE_IMPLEMENTED @@ -918,7 +918,7 @@ void UIScene_LoadOrJoinMenu::AddDefaultButtons() continue; } } - + m_generators.push_back(levelGen); m_buttonListSaves.addItem(levelGen->getWorldName()); @@ -969,7 +969,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr case ACTION_MENU_X: #if TO_BE_IMPLEMENTED // Change device - // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. m_bIgnoreInput=true; StorageManager.SetSaveDevice(&CScene_MultiGameJoinLoad::DeviceSelectReturned,this,true); @@ -987,7 +987,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr { bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); if(bSignedInLive) - { + { LaunchSaveTransfer(); } } @@ -1171,7 +1171,7 @@ int UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,boo UIScene_LoadOrJoinMenu *pClass=(UIScene_LoadOrJoinMenu *)lpParam; pClass->m_bIgnoreInput=false; if (bRes) - { + { uint16_t ui16Text[128]; ZeroMemory(ui16Text, 128 * sizeof(uint16_t) ); InputManager.GetText(ui16Text); @@ -1184,13 +1184,13 @@ int UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,boo StorageManager.RenameSaveData(pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC, ui16Text,&UIScene_LoadOrJoinMenu::RenameSaveDataReturned,pClass); #endif } - else + else { pClass->m_bIgnoreInput=false; pClass->updateTooltips(); } - } - else + } + else { pClass->m_bIgnoreInput=false; pClass->updateTooltips(); @@ -1204,13 +1204,13 @@ void UIScene_LoadOrJoinMenu::handleInitFocus(F64 controlId, F64 childId) app.DebugPrintf(app.USER_SR, "UIScene_LoadOrJoinMenu::handleInitFocus - %d , %d\n", (int)controlId, (int)childId); } -void UIScene_LoadOrJoinMenu::handleFocusChange(F64 controlId, F64 childId) +void UIScene_LoadOrJoinMenu::handleFocusChange(F64 controlId, F64 childId) { app.DebugPrintf(app.USER_SR, "UIScene_LoadOrJoinMenu::handleFocusChange - %d , %d\n", (int)controlId, (int)childId); - + switch((int)controlId) { - case eControl_GamesList: + case eControl_GamesList: m_iGameListIndex = childId; m_buttonListGames.updateChildFocus( (int) childId ); break; @@ -1246,7 +1246,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) ui.PlayUISFX(eSFX_Press); if((int)childId == JOIN_LOAD_CREATE_BUTTON_INDEX) - { + { app.SetTutorialMode( false ); m_controlJoinTimer.setVisible( false ); @@ -1298,7 +1298,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) } else #endif - { + { app.SetTutorialMode( false ); if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) @@ -1340,7 +1340,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) case eControl_GamesList: { m_bIgnoreInput=true; - + m_eAction = eAction_JoinGame; //CD - Added for audio @@ -1375,7 +1375,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) bool bPlayStationPlus=true; int iPadWithNoPlaystationPlus=0; - bool isSignedInLive = true; + bool isSignedInLive = true; int iPadNotSignedInLive = -1; for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { @@ -1458,7 +1458,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) SceNpCommerceDialogParam param; sceNpCommerceDialogParamInitialize(¶m); param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; - param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); iResult=sceNpCommerceDialogOpen(¶m); @@ -1532,7 +1532,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) } void UIScene_LoadOrJoinMenu::LoadLevelGen(LevelGenerationOptions *levelGen) -{ +{ // Load data from disc //File saveFile( L"Tutorial\\Tutorial" ); //LoadSaveFromDisk(&saveFile); @@ -1630,7 +1630,7 @@ void UIScene_LoadOrJoinMenu::UpdateGamesList() // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should show the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; int iX=-1; @@ -1854,7 +1854,7 @@ void UIScene_LoadOrJoinMenu::handleTimerComplete(int id) if(iImageDataBytes!=0) { - // set the image + // set the image registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,true); m_iConfigA[i]=-1; } @@ -1867,7 +1867,7 @@ void UIScene_LoadOrJoinMenu::handleTimerComplete(int id) bool bAllDone=true; for(int i=0;igetName().c_str()); - int64_t fileSize = saveFile->length(); + __int64 fileSize = saveFile->length(); FileInputStream fis(*saveFile); byteArray ba(fileSize); fis.read(ba); @@ -1946,7 +1946,7 @@ void UIScene_LoadOrJoinMenu::LoadSaveFromDisk(File *saveFile, ESavePlatform save #ifdef SONY_REMOTE_STORAGE_DOWNLOAD void UIScene_LoadOrJoinMenu::LoadSaveFromCloud() -{ +{ wchar_t wFileName[128]; mbstowcs(wFileName, app.getRemoteStorage()->getLocalFilename(), strlen(app.getRemoteStorage()->getLocalFilename())+1); // plus null @@ -1960,7 +1960,7 @@ void UIScene_LoadOrJoinMenu::LoadSaveFromCloud() mbstowcs(wSaveName, app.getRemoteStorage()->getSaveNameUTF8(), strlen(app.getRemoteStorage()->getSaveNameUTF8())+1); // plus null StorageManager.SetSaveTitle(wSaveName); - int64_t fileSize = cloudFile.length(); + __int64 fileSize = cloudFile.length(); FileInputStream fis(cloudFile); byteArray ba(fileSize); fis.read(ba); @@ -2019,7 +2019,7 @@ int UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JSt // Check that we have a valid save selected (can get a bad index if the save list has been refreshed) bool validSelection= pClass->m_iDefaultButtonsC != 0 && pClass->m_iSaveListIndex >= pClass->m_iDefaultButtonsC; - if(result==C4JStorage::EMessage_ResultDecline && validSelection) + if(result==C4JStorage::EMessage_ResultDecline && validSelection) { if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) { @@ -2049,7 +2049,7 @@ int UIScene_LoadOrJoinMenu::DeleteSaveDataReturned(LPVOID lpParam,bool bRes) if(bRes) { // wipe the list and repopulate it - pClass->m_iState=e_SavesRepopulateAfterDelete; + pClass->m_iState=e_SavesRepopulateAfterDelete; } else pClass->m_bIgnoreInput=false; @@ -2169,7 +2169,7 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)pParam; // Exit with or without saving - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { // we need to enable background downloading for the DLC XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); @@ -2194,9 +2194,9 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS #endif -#if defined _XBOX_ONE +#if defined _XBOX_ONE if(ProfileManager.IsSignedIn(iPad)) - { + { if (ProfileManager.IsSignedInLive(iPad)) { wstring ProductId; @@ -2205,13 +2205,13 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS StorageManager.InstallOffer(1,(WCHAR *)ProductId.c_str(),NULL,NULL); } else - { + { // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); } } -#endif +#endif } pClass->m_bIgnoreInput=false; @@ -2223,7 +2223,7 @@ int UIScene_LoadOrJoinMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStora { UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { #if defined(__PS3__) SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass); @@ -2442,7 +2442,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter DWORD dwDataSizeSaveImage=0; StorageManager.GetDefaultSaveImage(&pbDataSaveImage, &dwDataSizeSaveImage); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t - StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that + StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); @@ -2470,7 +2470,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter { // we can't cancel here, we need the saves info so we can delete the file if(pClass->m_saveTransferDownloadCancelled) - { + { WCHAR wcTemp[256]; swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" m_wstrStageText=wcTemp; @@ -2485,7 +2485,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter break; case eSaveTransfer_GettingSavesInfo: if(pClass->m_saveTransferDownloadCancelled) - { + { WCHAR wcTemp[256]; swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" m_wstrStageText=wcTemp; @@ -2602,7 +2602,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter DWORD dwDataSizeSaveImage=0; StorageManager.GetDefaultSaveImage(&pbDataSaveImage, &dwDataSizeSaveImage); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t - StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that + StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); @@ -2613,12 +2613,12 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter } -#ifdef SPLIT_SAVES +#ifdef SPLIT_SAVES ConsoleSaveFileOriginal oldFormatSave( wSaveName, ba.data, ba.length, false, app.getRemoteStorage()->getSavePlatform() ); pSave = new ConsoleSaveFileSplit( &oldFormatSave, false, pMinecraft->progressRenderer ); pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); - pSave->Flush(false,false); + pSave->Flush(false,false); pClass->m_eSaveTransferState = eSaveTransfer_Saving; #else pSave = new ConsoleSaveFileOriginal( wSaveName, ba.data, ba.length, false, app.getRemoteStorage()->getSavePlatform() ); @@ -2654,7 +2654,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter delete pSave; - + pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); pClass->m_eSaveTransferState = eSaveTransfer_Succeeded; } @@ -2668,7 +2668,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.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass, app.GetStringTable()); pClass->m_eSaveTransferState = eSaveTransfer_Finished; } break; @@ -2683,7 +2683,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter if(bSaveFileCreated) { if(pClass->m_saveTransferDownloadCancelled) - { + { WCHAR wcTemp[256]; swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" m_wstrStageText=wcTemp; @@ -2743,7 +2743,7 @@ 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()); + ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass, app.GetStringTable()); pClass->m_eSaveTransferState = eSaveTransfer_Finished; } if(bSaveFileCreated) // save file has been created, then deleted. @@ -2887,7 +2887,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.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass, app.GetStringTable()); pClass->m_eSaveUploadState = esaveUpload_Finished; } break; @@ -2904,7 +2904,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.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass, app.GetStringTable()); pClass->m_eSaveUploadState = esaveUpload_Finished; } } @@ -2953,7 +2953,7 @@ int UIScene_LoadOrJoinMenu::SaveTransferDialogReturned(void *pParam,int iPad,C4J { UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { // upload the save pClass->LaunchSaveUpload(); @@ -3062,13 +3062,13 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) ByteArrayInputStream bais(UIScene_LoadOrJoinMenu::s_transferData); DataInputStream dis(&bais); - wstring saveTitle = dis.readUTF(); + wstring saveTitle = dis.readUTF(); StorageManager.SetSaveTitle(saveTitle.c_str()); wstring saveUniqueName = dis.readUTF(); // 4J Stu - Don't set this any more. We added it so that we could share the ban list data for this save - // However if the player downloads the same save multiple times, it will overwrite the previous version + // However if the player downloads the same save multiple times, it will overwrite the previous version // with that filname, and they could have made changes to it. //StorageManager.SetSaveUniqueFilename((wchar_t *)saveUniqueName.c_str()); @@ -3091,13 +3091,13 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) case eSaveTransferFile_SaveData: { #ifdef SPLIT_SAVES - if(!pStateContainer->m_bSaveTransferCancelled) + if(!pStateContainer->m_bSaveTransferCancelled) { ConsoleSaveFileOriginal oldFormatSave( L"Temp name", UIScene_LoadOrJoinMenu::s_transferData.data, UIScene_LoadOrJoinMenu::s_transferData.length, false, SAVE_FILE_PLATFORM_X360 ); pSave = new ConsoleSaveFileSplit( &oldFormatSave, false, pMinecraft->progressRenderer ); pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); - if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); + if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); } pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Saving; @@ -3118,7 +3118,7 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) pSave->ConvertToLocalPlatform(); pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); - if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); + if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); pStateContainer->m_iProgress+=1; if(pStateContainer->m_iProgress==101) @@ -3134,8 +3134,8 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) // On Durango/Orbis, we need to wait for all the asynchronous saving processes to complete before destroying the levels, as that will ultimately delete // the directory level storage & therefore the ConsoleSaveSplit instance, which needs to be around until all the sub files have completed saving. #if defined(_DURANGO) || defined(__ORBIS__) - pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); - + pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); + while(StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) { Sleep(10); @@ -3150,9 +3150,9 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) #ifdef _XBOX_ONE pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_AND_CONVERT_COMPLETE); #endif - + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; - + // wipe the list and repopulate it if(!pStateContainer->m_bSaveTransferCancelled) pStateContainer->m_pClass->m_iState=e_SavesRepopulateAfterTransferDownload; @@ -3192,7 +3192,7 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) } void UIScene_LoadOrJoinMenu::RequestFileSize( SaveTransferStateContainer *pClass, wchar_t *filename ) -{ +{ Minecraft *pMinecraft=Minecraft::GetInstance(); // get the save file size @@ -3298,7 +3298,7 @@ int UIScene_LoadOrJoinMenu::SaveTransferUpdateProgress(LPVOID lpParam,unsigned l if(pClass->m_bSaveTransferCancelled) // was cancelled { - pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING); + pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING); swprintf(wcTemp,app.GetString(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING)); m_wstrStageText=wcTemp; pMinecraft->progressRenderer->progressStage( m_wstrStageText ); @@ -3373,7 +3373,7 @@ int UIScene_LoadOrJoinMenu::CopySaveDialogReturned(void *pParam,int iPad,C4JStor { UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { LoadingInputParams *loadingParams = new LoadingInputParams(); @@ -3418,7 +3418,7 @@ int UIScene_LoadOrJoinMenu::CopySaveThreadProc( LPVOID lpParameter ) ui.LeaveCallbackIdCriticalSection(); // Copy save data takes two callbacks - one for completion, and one for progress. The progress callback also lets us cancel the operation, if we return false. StorageManager.CopySaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC],UIScene_LoadOrJoinMenu::CopySaveDataReturned,UIScene_LoadOrJoinMenu::CopySaveDataProgress,lpParameter); - + bool bContinue = true; do { @@ -3455,7 +3455,7 @@ int UIScene_LoadOrJoinMenu::CopySaveDataReturned(LPVOID lpParam, bool success, C { pClass->m_bCopying = false; // wipe the list and repopulate it - pClass->m_iState=e_SavesRepopulateAfterDelete; + pClass->m_iState=e_SavesRepopulateAfterDelete; ui.LeaveCallbackIdCriticalSection(); } else diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp index b949aafa..b3608b06 100644 --- a/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp @@ -55,7 +55,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle CreateWorldMenuInitData *params = (CreateWorldMenuInitData *)pInitData->pvInitData; m_MoreOptionsParams.bGenerateOptions=TRUE; - m_MoreOptionsParams.bStructures=TRUE; + m_MoreOptionsParams.bStructures=TRUE; m_MoreOptionsParams.bFlatWorld=FALSE; m_MoreOptionsParams.bBonusChest=FALSE; m_MoreOptionsParams.bPVP = TRUE; @@ -96,7 +96,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle { // The profile settings say Online, but either the player is offline, or they are not allowed to play online m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; - } + } } m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_SURVIVAL)); @@ -104,7 +104,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle m_CurrentDifficulty=app.GetGameSettings(m_iPad,eGameSetting_Difficulty); m_SliderDifficulty.SetValue(m_CurrentDifficulty); - swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[m_CurrentDifficulty])); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[m_CurrentDifficulty])); m_SliderDifficulty.SetText(TempString); ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); @@ -135,7 +135,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle m_NewWorld.SetEnable(true); m_EditWorldName.SetTextLimit(XCONTENT_MAX_DISPLAYNAME_LENGTH); - + wstring wWorldName = m_EditWorldName.GetText(); // set the caret to the end of the default text @@ -148,7 +148,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle XuiSetTimer(m_hObj,GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); - + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); // 4J-PB - Load up any texture pack data we have locally in the XZP @@ -176,7 +176,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle m_pTexturePacksList->SetSelectionChangedHandle(m_hObj); Minecraft *pMinecraft = Minecraft::GetInstance(); - int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; HRESULT hr; for(unsigned int i = 0; i < texturePacksCount; ++i) @@ -189,7 +189,7 @@ HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandle if(dwImageBytes > 0 && pbImageData) { - ListInfo.fEnabled = TRUE; + ListInfo.fEnabled = TRUE; DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tp; if(pDLCTexPack) { @@ -297,7 +297,7 @@ HRESULT CScene_MultiGameCreate::OnDestroy() app.RemoveMemoryTPDFile(app.TMSFileA[i].iConfig); } } - + app.FreeLocalTMSFiles(eTMSFileType_TexturePack); return S_OK; @@ -338,7 +338,7 @@ HRESULT CScene_MultiGameCreate::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPr // DLC might have been corrupt if(ullOfferID_Full!=0LL) - { + { TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); UINT uiIDA[3]; @@ -374,7 +374,7 @@ HRESULT CScene_MultiGameCreate::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPr // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) // It seems we're allowed to break the 5 minute rule if it's the result of a user action // check the checkboxes - + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) { @@ -389,15 +389,15 @@ HRESULT CScene_MultiGameCreate::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPr if(m_MoreOptionsParams.dwTexturePack!=0) { // texture pack hasn't been set yet, so check what it will be - TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); - + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + if(pTexturePack==NULL) { // corrupt DLC so set it to the default textures m_MoreOptionsParams.dwTexturePack=0; } else - { + { m_pDLCPack=pTexturePack->getDLCPack(); // do we have a license? if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) @@ -439,11 +439,11 @@ HRESULT CScene_MultiGameCreate::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPr return S_OK; } } - } + } } if(m_bGameModeSurvival != true || m_MoreOptionsParams.bHostPrivileges == TRUE) - { + { UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; @@ -478,7 +478,7 @@ HRESULT CScene_MultiGameCreate::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPr BOOL pccFriendsAllowed = TRUE; ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); if(!pccAllowed && !pccFriendsAllowed) noUGC = true; - + if(isClientSide && noUGC ) { m_bIgnoreInput = false; @@ -495,7 +495,7 @@ HRESULT CScene_MultiGameCreate::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPr } } else if(hObjPressed==m_MoreOptions) - { + { app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_LaunchMoreOptionsMenu,&m_MoreOptionsParams); } else if(hObjPressed == m_ButtonGameMode) @@ -527,7 +527,7 @@ int CScene_MultiGameCreate::UnlockTexturePackReturned(void *pParam,int iPad,C4JS if(result==C4JStorage::EMessage_ResultAccept) { if(ProfileManager.IsSignedIn(iPad)) - { + { ULONGLONG ullIndexA[1]; DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_pDLCPack->getPurchaseOfferId()); @@ -542,7 +542,7 @@ int CScene_MultiGameCreate::UnlockTexturePackReturned(void *pParam,int iPad,C4JS StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); - // the license change coming in when the offer has been installed will cause this scene to refresh + // the license change coming in when the offer has been installed will cause this scene to refresh } } else @@ -629,12 +629,12 @@ HRESULT CScene_MultiGameCreate::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINot // Enable the done button when we have all of the necessary information wstring wWorldName = m_EditWorldName.GetText(); BOOL bHasWorldName = ( wWorldName.length()!=0); - m_NewWorld.SetEnable(bHasWorldName); + m_NewWorld.SetEnable(bHasWorldName); } else if(hObjSource==m_SliderDifficulty.GetSlider() ) { app.SetGameSettings(m_iPad,eGameSetting_Difficulty,pValueChangedData->nValue); - swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[pValueChangedData->nValue])); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[pValueChangedData->nValue])); m_SliderDifficulty.SetText(TempString); } @@ -656,11 +656,11 @@ HRESULT CScene_MultiGameCreate::OnControlNavigate(XUIMessageControlNavigate *pCo HRESULT CScene_MultiGameCreate::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) { - // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly switch(pTimer->nId) { - + case GAME_CREATE_ONLINE_TIMER_ID: { bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); @@ -693,7 +693,7 @@ HRESULT CScene_MultiGameCreate::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled } } break; - + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: { // also check for any new texture packs info being available @@ -718,7 +718,7 @@ HRESULT CScene_MultiGameCreate::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled PBYTE pbImageData=NULL; app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); - ListInfo.fEnabled = TRUE; + ListInfo.fEnabled = TRUE; ListInfo.iData = m_iConfigA[i]; HRESULT hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); app.DebugPrintf("Adding texturepack %d from TPD\n",m_iConfigA[i]); @@ -734,7 +734,7 @@ HRESULT CScene_MultiGameCreate::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled bool bAllDone=true; for(int i=0;im_MoreOptionsParams.bOnlineGame; @@ -780,7 +780,7 @@ int CScene_MultiGameCreate::ConfirmCreateReturned(void *pParam,int iPad,C4JStora BOOL pccFriendsAllowed = TRUE; ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); if(!pccAllowed && !pccFriendsAllowed) noUGC = true; - + if(isClientSide && noUGC ) { pClass->m_bIgnoreInput = false; @@ -816,7 +816,7 @@ int CScene_MultiGameCreate::StartGame_SignInReturned(void *pParam,bool bContinue if(ProfileManager.IsSignedIn(iPad)) { DWORD dwLocalUsersMask = 0; - + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; bool noPrivileges = false; @@ -835,7 +835,7 @@ int CScene_MultiGameCreate::StartGame_SignInReturned(void *pParam,bool bContinue BOOL pccFriendsAllowed = TRUE; ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); if(!pccAllowed && !pccFriendsAllowed) noUGC = true; - + if(isClientSide && (noPrivileges || noUGC) ) { if( noUGC ) @@ -863,7 +863,7 @@ int CScene_MultiGameCreate::StartGame_SignInReturned(void *pParam,bool bContinue } } else - { + { pClass->m_bIgnoreInput = false; pClass->SetShow( TRUE ); } @@ -884,7 +884,7 @@ void CScene_MultiGameCreate::CreateGame(CScene_MultiGameCreate* pClass, DWORD dw // create the world and launch wstring wWorldName = pClass->m_EditWorldName.GetText(); - + StorageManager.ResetSaveData(); // Make our next save default to the name of the level StorageManager.SetSaveTitle((wchar_t *)wWorldName.c_str()); @@ -904,11 +904,11 @@ void CScene_MultiGameCreate::CreateGame(CScene_MultiGameCreate* pClass, DWORD dw // start the game bool isFlat = (pClass->m_MoreOptionsParams.bFlatWorld==TRUE); - int64_t seedValue = 0; //BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + __int64 seedValue = 0; //BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements if (wSeed.length() != 0) { - int64_t value = 0; + __int64 value = 0; unsigned int len = (unsigned int)wSeed.length(); //Check if the input string contains a numerical value @@ -923,7 +923,7 @@ void CScene_MultiGameCreate::CreateGame(CScene_MultiGameCreate* pClass, DWORD dw //If the input string is a numerical value, convert it to a number if( isNumber ) - value = _fromString(wSeed); + value = _fromString<__int64>(wSeed); //If the value is not 0 use it, otherwise use the algorithm from the java String.hashCode() function to hash it if( value != 0 ) @@ -948,7 +948,7 @@ void CScene_MultiGameCreate::CreateGame(CScene_MultiGameCreate* pClass, DWORD dw param->seed = seedValue; param->saveData = NULL; param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; - + Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); //pMinecraft->skins->updateUI(); @@ -956,7 +956,7 @@ void CScene_MultiGameCreate::CreateGame(CScene_MultiGameCreate* pClass, DWORD dw app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); app.SetGameHostOption(eGameHostOption_FriendsOfFriends,pClass->m_MoreOptionsParams.bAllowFriendsOfFriends); app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)?1:0); - + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); // CXuiList listObject; @@ -999,7 +999,7 @@ HRESULT CScene_MultiGameCreate::OnTransitionStart( XUIMessageTransition *pTransi if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) - { + { m_SliderDifficulty.SetValueDisplay(FALSE); } @@ -1015,7 +1015,7 @@ HRESULT CScene_MultiGameCreate::OnTransitionEnd( XUIMessageTransition *pTransiti { } else if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) - { + { if(m_bSetup && m_texturePackDescDisplayed) { XUITimeline *timeline; @@ -1054,7 +1054,7 @@ HRESULT CScene_MultiGameCreate::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotif if(hObjSource == m_pTexturePacksList->m_hObj) { UpdateTexturePackDescription(pNotifySelChangedData->iItem); - + // 4J-JEV: Removed expand description check, taken care of elsewhere. } @@ -1205,9 +1205,9 @@ void CScene_MultiGameCreate::UpdateCurrentTexturePack() StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CScene_MultiGameCreate::TexturePackDialogReturned,this,app.GetStringTable()); } - // do set the texture pack id, and on the user pressing create world, check they have it + // do set the texture pack id, and on the user pressing create world, check they have it m_MoreOptionsParams.dwTexturePack = ListItem.iData; - return ; + return ; } else { @@ -1221,7 +1221,7 @@ int CScene_MultiGameCreate::TexturePackDialogReturned(void *pParam,int iPad,C4JS pClass->m_currentTexturePackIndex = pClass->m_pTexturePacksList->GetCurSel(); // Exit with or without saving // Decline means install full version of the texture pack in this dialog - if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) { // we need to enable background downloading for the DLC XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); @@ -1248,7 +1248,7 @@ int CScene_MultiGameCreate::TexturePackDialogReturned(void *pParam,int iPad,C4JS ullIndexA[0]=pDLCInfo->ullOfferID_Trial; StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); } - } + } } pClass->m_bIgnoreInput=false; return 0; @@ -1274,12 +1274,12 @@ HRESULT CScene_MultiGameCreate::OnCustomMessage_DLCInstalled() } HRESULT CScene_MultiGameCreate::OnCustomMessage_DLCMountingComplete() -{ +{ // refill the texture pack list m_pTexturePacksList->SetSelectionChangedHandle(m_hObj); Minecraft *pMinecraft = Minecraft::GetInstance(); - int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; HRESULT hr; for(unsigned int i = 0; i < texturePacksCount; ++i) @@ -1292,7 +1292,7 @@ HRESULT CScene_MultiGameCreate::OnCustomMessage_DLCMountingComplete() if(dwImageBytes > 0 && pbImageData) { - ListInfo.fEnabled = TRUE; + ListInfo.fEnabled = TRUE; hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tp; diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp index 142e8ba1..73f25da5 100644 --- a/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp @@ -42,13 +42,13 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand m_iTexturePacksNotInstalled=0; m_iConfigA=NULL; - + XuiControlSetText(m_LabelNoGames,app.GetString(IDS_NO_GAMES_FOUND)); XuiControlSetText(m_GamesList,app.GetString(IDS_JOIN_GAME)); XuiControlSetText(m_SavesList,app.GetString(IDS_START_GAME)); - const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string WCHAR szResourceLocator[ LOCATOR_SIZE ]; const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); @@ -64,17 +64,17 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand m_bRetrievingSaveInfo=false; m_bSaveTransferInProgress=false; - + // check for a default custom cloak in the global storage // 4J-PB - changed to a config file // if(ProfileManager.IsSignedInLive( m_iPad )) -// { +// { // app.InstallDefaultCape(); // } m_initData= new JoinMenuInitData(); m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); - + XPARTY_USER_LIST partyList; if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) @@ -90,7 +90,7 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand if(m_bInParty) iLB = IDS_TOOLTIPS_PARTY_GAMES; XuiSetTimer(m_hObj,JOIN_LOAD_ONLINE_TIMER_ID,JOIN_LOAD_ONLINE_TIMER_TIME); - + m_iSaveInfoC=0; VOID *pObj; @@ -110,7 +110,7 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand { // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that m_bIgnoreInput=false; - + m_iChangingSaveGameInfoIndex = 0; @@ -135,7 +135,7 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand // saving is disabled, but we should still be able to load from a selected save device ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,-1,-1,-1,iLB,IDS_TOOLTIPS_DELETESAVE); - + GetSaveInfo(); } else @@ -153,7 +153,7 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,-1,-1,-1,-1,bCanRename?IDS_TOOLTIPS_SAVEOPTIONS:IDS_TOOLTIPS_DELETESAVE); - + GetSaveInfo(); } } @@ -165,7 +165,7 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand // 4J Stu - Fix for #12530 -TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. MinecraftServer::resetFlags(); - + // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting. if( !m_bIgnoreInput) { @@ -191,7 +191,7 @@ HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHand bool bTexturePackAlreadyListed; bool bNeedToGetTPD=false; Minecraft *pMinecraft = Minecraft::GetInstance(); - int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); //CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; //HRESULT hr; @@ -295,7 +295,7 @@ void CScene_MultiGameJoinLoad::AddDefaultButtons() // increment the count of the mash-up pack worlds in the save list m_iMashUpButtonsC++; TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(levelGen->getRequiredTexturePackId()); - DWORD dwImageBytes; + DWORD dwImageBytes; PBYTE pbImageData = tp->getPackIcon(dwImageBytes); HXUIBRUSH hXuiBrush; @@ -353,8 +353,8 @@ HRESULT CScene_MultiGameJoinLoad::GetSaveInfo( ) ListInfo.fEnabled=TRUE; ListInfo.iData = -1; m_pSavesList->AddData(ListInfo); - } - m_pSavesList->SetCurSelVisible(0); + } + m_pSavesList->SetCurSelVisible(0); } else { @@ -419,7 +419,7 @@ int CScene_MultiGameJoinLoad::DeviceRemovedDialogReturned(void *pParam,int iPad, CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultDecline) + if(result==C4JStorage::EMessage_ResultDecline) { StorageManager.SetSaveDisabled(true); StorageManager.SetSaveDeviceSelected(ProfileManager.GetPrimaryPad(),false); @@ -462,7 +462,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotify //CScene_MultiGameInfo::JoinMenuInitData *initData = new CScene_MultiGameInfo::JoinMenuInitData(); m_initData->iPad = m_iPad; m_initData->selectedSession = currentSessions.at( nIndex ); - + // check that we have the texture pack available // If it's not the default texture pack if(m_initData->selectedSession->data.texturePackParentId!=0) @@ -513,7 +513,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotify return S_OK; } } - + m_NetGamesListTimer.SetShow( FALSE ); // Reset the background downloading, in case we changed it by attempting to download a texture pack @@ -536,7 +536,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotify CXuiCtrl4JList::LIST_ITEM_INFO info = m_pSavesList->GetData(iIndex); if(iIndex == JOIN_LOAD_CREATE_BUTTON_INDEX) - { + { app.SetTutorialMode( false ); m_NetGamesListTimer.SetShow( FALSE ); @@ -571,7 +571,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotify } } else - { + { // check if this is a damaged save if(m_pSavesList->GetData(iIndex).bIsDamaged) { @@ -582,7 +582,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotify StorageManager.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,this, app.GetStringTable()); } else - { + { app.SetTutorialMode( false ); if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) { @@ -605,7 +605,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotify } } } - + return S_OK; } @@ -632,11 +632,11 @@ HRESULT CScene_MultiGameJoinLoad::OnKeyDown(XUIMessageInput* pInputData, BOOL& r app.NavigateBack(XUSER_INDEX_ANY); rfHandled = TRUE; - break; + break; case VK_PAD_X: // Change device - // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. m_bIgnoreInput=true; StorageManager.SetSaveDevice(&CScene_MultiGameJoinLoad::DeviceSelectReturned,this,true); @@ -657,7 +657,7 @@ HRESULT CScene_MultiGameJoinLoad::OnKeyDown(XUIMessageInput* pInputData, BOOL& r { // save transfer - make sure they want to overwrite a save that is up there if(ProfileManager.IsSignedInLive( m_iPad )) - { + { // 4J-PB - required for a delete of the save if it's found to be a corrupted save DWORD nIndex = m_pSavesList->GetCurSel(); m_iChangingSaveGameInfoIndex=m_pSavesList->GetData(nIndex).iIndex; @@ -668,13 +668,13 @@ HRESULT CScene_MultiGameJoinLoad::OnKeyDown(XUIMessageInput* pInputData, BOOL& r ui.RequestMessageBox(IDS_SAVE_TRANSFER_TITLE, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, pInputData->UserIndex,&CScene_MultiGameJoinLoad::SaveTransferDialogReturned,this, app.GetStringTable()); } - } + } break; case VK_PAD_RSHOULDER: if(DoesSavesListHaveFocus()) { m_bIgnoreInput = true; - + int iIndex=m_SavesList.GetCurSel(); m_iChangingSaveGameInfoIndex=m_pSavesList->GetData(iIndex).iIndex; @@ -755,19 +755,19 @@ HRESULT CScene_MultiGameJoinLoad::OnKeyDown(XUIMessageInput* pInputData, BOOL& r } break; } - + return hr; } HRESULT CScene_MultiGameJoinLoad::OnNavReturn(HXUIOBJ hSceneFrom,BOOL& rfHandled) { - + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); // start the texture pack timer again XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); - m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); - + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + // re-enable button presses m_bIgnoreInput=false; @@ -812,7 +812,7 @@ HRESULT CScene_MultiGameJoinLoad::OnNavReturn(HXUIOBJ hSceneFrom,BOOL& rfHandled iY = IDS_TOOLTIPS_VIEW_GAMERCARD; } else if(DoesSavesListHaveFocus()) - { + { if(ProfileManager.IsSignedInLive( m_iPad )) { iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; @@ -901,7 +901,7 @@ HRESULT CScene_MultiGameJoinLoad::OnTransitionStart( XUIMessageTransition *pTran if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) { // Can't call this here because if you back out of the load info screen and then go back in and load a game, it will attempt to use the dlc as it's running a mount of the dlc - + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again if(app.StartInstallDLCProcess(m_iPad)==false) { @@ -925,14 +925,14 @@ HRESULT CScene_MultiGameJoinLoad::OnFontRendererChange() // update the tooltips // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should the the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; if( DoesGamesListHaveFocus() ) { iY = IDS_TOOLTIPS_VIEW_GAMERCARD; - } + } else if(DoesSavesListHaveFocus()) - { + { if(ProfileManager.IsSignedInLive( m_iPad )) { iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; @@ -986,12 +986,12 @@ HRESULT CScene_MultiGameJoinLoad::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotify // update the tooltips // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should the the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; if( DoesGamesListHaveFocus() ) { iY = IDS_TOOLTIPS_VIEW_GAMERCARD; - } + } else if(DoesSavesListHaveFocus()) { if(ProfileManager.IsSignedInLive( m_iPad )) @@ -1118,7 +1118,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesListCallback(LPVOID lpParam) // check this there's no save transfer in progress if(!pClass->m_bSaveTransferInProgress) { - pClass->UpdateGamesList(); + pClass->UpdateGamesList(); } } } @@ -1150,12 +1150,12 @@ void CScene_MultiGameJoinLoad::UpdateGamesList() delete (*it); } currentSessions.clear(); - + m_NetGamesListTimer.SetShow( FALSE ); - + // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should show the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; if( DoesGamesListHaveFocus() ) @@ -1163,7 +1163,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesList() iY = IDS_TOOLTIPS_VIEW_GAMERCARD; } else if(DoesSavesListHaveFocus()) - { + { if(ProfileManager.IsSignedInLive( m_iPad )) { iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; @@ -1282,7 +1282,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesList() // is it in the tpd data ? app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); if(dwImageBytes > 0 && pbImageData) - { + { hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); m_pGamesList->UpdateGraphic(sessionIndex,hXuiBrush); } @@ -1291,7 +1291,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesList() { pbImageData = tp->getPackIcon(dwImageBytes); if(dwImageBytes > 0 && pbImageData) - { + { hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); m_pGamesList->UpdateGraphic(sessionIndex,hXuiBrush); } @@ -1303,7 +1303,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesList() XuiCreateTextureBrushFromMemory(m_DefaultMinecraftIconData,m_DefaultMinecraftIconSize,&hXuiBrush); m_pGamesList->UpdateGraphic(sessionIndex,hXuiBrush); } - + if(memcmp( &selectedSessionId, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) { @@ -1324,14 +1324,14 @@ void CScene_MultiGameJoinLoad::UpdateGamesList(DWORD dwNumResults, IQNetGameSear if(m_searches>0) --m_searches; - + if(m_searches==0) { m_NetGamesListTimer.SetShow( FALSE ); - + // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should show the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; if( DoesGamesListHaveFocus() ) @@ -1374,7 +1374,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesList(DWORD dwNumResults, IQNetGameSear } unsigned int startOffset = m_GamesList.GetItemCount(); - //m_GamesList.InsertItems(startOffset,dwNumResults); + //m_GamesList.InsertItems(startOffset,dwNumResults); //m_GamesList.SetEnable(TRUE); //XuiElementSetDisableFocusRecursion( m_GamesList.m_hObj, FALSE); @@ -1449,7 +1449,7 @@ void CScene_MultiGameJoinLoad::UpdateGamesList(DWORD dwNumResults, IQNetGameSear #endif } } - + if( m_GamesList.GetItemCount() == 0) { m_LabelNoGames.SetShow( TRUE ); @@ -1537,14 +1537,14 @@ int CScene_MultiGameJoinLoad::DeviceSelectReturned(void *pParam,bool bContinue) { // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should show the View Gamercard tooltip - int iRB=-1; + int iRB=-1; int iY = -1; if( pClass->DoesGamesListHaveFocus() ) { iY = IDS_TOOLTIPS_VIEW_GAMERCARD; } else if(pClass->DoesSavesListHaveFocus()) - { + { if(ProfileManager.IsSignedInLive( pClass->m_iPad )) { iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; @@ -1593,7 +1593,7 @@ int CScene_MultiGameJoinLoad::DeviceSelectReturned(void *pParam,bool bContinue) pClass->GetSaveInfo(); } else - { + { ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB); // clear the saves list pClass->m_pSavesList->RemoveAllData(); @@ -1623,11 +1623,11 @@ int CScene_MultiGameJoinLoad::DeviceSelectReturned(void *pParam,bool bContinue) HRESULT CScene_MultiGameJoinLoad::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) { - // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly switch(pTimer->nId) { - + case JOIN_LOAD_ONLINE_TIMER_ID: { XPARTY_USER_LIST partyList; @@ -1673,7 +1673,7 @@ HRESULT CScene_MultiGameJoinLoad::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandl { } else if(DoesSavesListHaveFocus()) - { + { if(ProfileManager.IsSignedInLive( m_iPad )) { iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; @@ -1737,7 +1737,7 @@ HRESULT CScene_MultiGameJoinLoad::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandl //CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; // for each iConfig, check if the data is available, and add it to the List, then remove it from the viConfig - + for(int i=0;im_iSaveInfoC=0; pClass->GetSaveInfo(); } - + pClass->m_bIgnoreInput=false; return 0; } void CScene_MultiGameJoinLoad::LoadLevelGen(LevelGenerationOptions *levelGen) -{ +{ // Load data from disc //File saveFile( L"Tutorial\\Tutorial" ); //LoadSaveFromDisk(&saveFile); // clear out the app's terrain features list app.ClearTerrainFeaturePosition(); - + StorageManager.ResetSaveData(); // Make our next save default to the name of the level StorageManager.SetSaveTitle(levelGen->getDefaultSaveName().c_str()); - + bool isClientSide = false; bool isPrivate = false; int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; @@ -1918,7 +1918,7 @@ void CScene_MultiGameJoinLoad::LoadLevelGen(LevelGenerationOptions *levelGen) if(levelGen->requiresTexturePack()) { param->texturePackId = levelGen->getRequiredTexturePackId(); - + Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->skins->selectTexturePackById(param->texturePackId); //pMinecraft->skins->updateUI(); @@ -1939,7 +1939,7 @@ void CScene_MultiGameJoinLoad::LoadLevelGen(LevelGenerationOptions *levelGen) } void CScene_MultiGameJoinLoad::LoadSaveFromDisk(File *saveFile) -{ +{ // we'll only be coming in here when the tutorial is loaded now StorageManager.ResetSaveData(); @@ -1947,12 +1947,12 @@ void CScene_MultiGameJoinLoad::LoadSaveFromDisk(File *saveFile) // Make our next save default to the name of the level StorageManager.SetSaveTitle(saveFile->getName().c_str()); - int64_t fileSize = saveFile->length(); + __int64 fileSize = saveFile->length(); FileInputStream fis(*saveFile); byteArray ba(fileSize); fis.read(ba); fis.close(); - + bool isClientSide = false; bool isPrivate = false; int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; @@ -1962,7 +1962,7 @@ void CScene_MultiGameJoinLoad::LoadSaveFromDisk(File *saveFile) isClientSide = false; maxPlayers = 4; } - + app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId()); g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); @@ -1992,7 +1992,7 @@ int CScene_MultiGameJoinLoad::DeleteSaveDialogReturned(void *pParam,int iPad,C4J { CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultDecline) + if(result==C4JStorage::EMessage_ResultDecline) { if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) { @@ -2017,7 +2017,7 @@ int CScene_MultiGameJoinLoad::SaveTransferDialogReturned(void *pParam,int iPad,C { CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; // results switched for this dialog - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { // upload the save @@ -2042,7 +2042,7 @@ int CScene_MultiGameJoinLoad::SaveTransferDialogReturned(void *pParam,int iPad,C int CScene_MultiGameJoinLoad::UploadSaveForXboxOneThreadProc( LPVOID lpParameter ) { CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad *) lpParameter; - Minecraft *pMinecraft = Minecraft::GetInstance(); + Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->progressRenderer->progressStart(IDS_SAVE_TRANSFER_TITLE); pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADING ); @@ -2092,7 +2092,7 @@ int CScene_MultiGameJoinLoad::UploadSaveForXboxOneThreadProc( LPVOID lpParameter StorageManager.GetSaveCacheFileInfo(iIndex,XContentData); StorageManager.GetSaveCacheFileInfo(iIndex,&pbImageData,&dwImageBytes); - // if there is no thumbnail, retrieve the default one from the file. + // if there is no thumbnail, retrieve the default one from the file. // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save if(pbImageData==NULL) { @@ -2143,7 +2143,7 @@ int CScene_MultiGameJoinLoad::UploadSaveForXboxOneThreadProc( LPVOID lpParameter return 0; } - // change text for completion confirmation + // change text for completion confirmation pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADCOMPLETE ); // done @@ -2180,7 +2180,7 @@ void CScene_MultiGameJoinLoad::UploadFile(CScene_MultiGameJoinLoad *pClass, char C4JStorage::TMS_FILETYPE_BINARY, C4JStorage::TMS_UGCTYPE_NONE, filename, - (CHAR *)data, + (CHAR *)data, size, &CScene_MultiGameJoinLoad::TransferComplete,pClass, 0, &CScene_MultiGameJoinLoad::Progress,pClass); @@ -2219,7 +2219,7 @@ bool CScene_MultiGameJoinLoad::WaitForTransferComplete( CScene_MultiGameJoinLoad // cancelled return false; } - Sleep(50); + Sleep(50); // update the progress pMinecraft->progressRenderer->progressStagePercentage((unsigned int)(pClass->m_fProgress*100.0f)); } @@ -2235,7 +2235,7 @@ int CScene_MultiGameJoinLoad::SaveOptionsDialogReturned(void *pParam,int iPad,C4 // results switched for this dialog // EMessage_ResultAccept means cancel - if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) { if(result==C4JStorage::EMessage_ResultDecline) // rename { @@ -2302,9 +2302,9 @@ int CScene_MultiGameJoinLoad::LoadSaveDataReturned(void *pParam,bool bContinue) UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - StorageManager.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, + StorageManager.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pClass->m_iPad,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,pClass, app.GetStringTable()); - + } return 0; @@ -2366,7 +2366,7 @@ int CScene_MultiGameJoinLoad::KeyboardReturned(void *pParam,bool bSet) if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) { - // disable saving + // disable saving StorageManager.SetSaveDisabled(true); StorageManager.SetSaveDeviceSelected(ProfileManager.GetPrimaryPad(),false); UINT uiIDA[1]; @@ -2375,11 +2375,11 @@ int CScene_MultiGameJoinLoad::KeyboardReturned(void *pParam,bool bSet) } #else // rename the save - + #endif } else - { + { pClass->m_bIgnoreInput=false; } @@ -2400,7 +2400,7 @@ int CScene_MultiGameJoinLoad::LoadSaveDataForRenameReturned(void *pParam,bool bC StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,XContentData); StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,&pbImageData,&dwImageBytes); - // if there is no thumbnail, retrieve the default one from the file. + // if there is no thumbnail, retrieve the default one from the file. // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save if(pbImageData==NULL) { @@ -2456,7 +2456,7 @@ int CScene_MultiGameJoinLoad::TexturePackDialogReturned(void *pParam,int iPad,C4 // Exit with or without saving // Decline means install full version of the texture pack in this dialog - if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) { // we need to enable background downloading for the DLC XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); @@ -2480,7 +2480,7 @@ int CScene_MultiGameJoinLoad::TexturePackDialogReturned(void *pParam,int iPad,C4 ullIndexA[0]=pDLCInfo->ullOfferID_Trial; StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); } - } + } } pClass->m_bIgnoreInput=false; return 0; @@ -2489,7 +2489,7 @@ int CScene_MultiGameJoinLoad::TexturePackDialogReturned(void *pParam,int iPad,C4 HRESULT CScene_MultiGameJoinLoad::OnCustomMessage_DLCInstalled() { // mounted DLC may have changed - + if(app.StartInstallDLCProcess(m_iPad)==false) { // not doing a mount, so re-enable input @@ -2508,7 +2508,7 @@ HRESULT CScene_MultiGameJoinLoad::OnCustomMessage_DLCInstalled() } HRESULT CScene_MultiGameJoinLoad::OnCustomMessage_DLCMountingComplete() -{ +{ VOID *pObj; XuiObjectFromHandle( m_SavesList, &pObj ); @@ -2534,7 +2534,7 @@ HRESULT CScene_MultiGameJoinLoad::OnCustomMessage_DLCMountingComplete() int iY=-1; if(DoesSavesListHaveFocus()) - { + { if(ProfileManager.IsSignedInLive( m_iPad )) { iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; @@ -2627,7 +2627,7 @@ void CScene_MultiGameJoinLoad::UpdateTooltips() // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); - if(bCanRename) + if(bCanRename) { iRB=IDS_TOOLTIPS_SAVEOPTIONS; } @@ -2694,11 +2694,11 @@ bool CScene_MultiGameJoinLoad::GetSavesInfoCallback(LPVOID pParam,int iTotalSave pbCurrentImagePtr=pbImageData+InfoA[i].dwImageOffset; hr=XuiCreateTextureBrushFromMemory(pbCurrentImagePtr,InfoA[i].dwImageBytes,&hXuiBrush); pClass->m_pSavesList->UpdateGraphic(i+pClass->m_iDefaultButtonsC,hXuiBrush ); - } + } else { // we could put in a damaged save icon here - const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string WCHAR szResourceLocator[ LOCATOR_SIZE ]; const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); @@ -2724,7 +2724,7 @@ bool CScene_MultiGameJoinLoad::GetSavesInfoCallback(LPVOID pParam,int iTotalSave // It's possible that the games list is updated but we haven't displayed it yet as we were still waiting on saves list to load // This is to fix a bug where joining a game before the saves list has loaded causes a crash when this callback is called // as the scene no longer exists - pClass->UpdateGamesList(); + pClass->UpdateGamesList(); // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp index 1a679f58..03782c79 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp @@ -36,7 +36,7 @@ HRESULT CXuiSceneBase::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) MapChildControls(); // Display the tooltips - HRESULT hr = S_OK; + HRESULT hr = S_OK; CXuiElement xuiElement = m_hObj; HXUIOBJ hTemp; @@ -169,7 +169,7 @@ void CXuiSceneBase::_TickAllBaseScenes() // make sure there's not a mount going on before using the textures if(bCheckTexturePack && app.DLCInstallProcessCompleted() ) - { + { TexturePack *tPack = pMinecraft->skins->getSelected(); if(tPack->getId()!=app.GetRequiredTexturePackID()) @@ -186,7 +186,7 @@ void CXuiSceneBase::_TickAllBaseScenes() pMinecraft->skins->selectTexturePackById(app.GetRequiredTexturePackID()); - // probably had background downloads enabled, so turn them off + // probably had background downloads enabled, so turn them off XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); } else @@ -223,7 +223,7 @@ void CXuiSceneBase::_TickAllBaseScenes() { if(pMinecraft->localplayers[i] != NULL && pMinecraft->localplayers[i]->dimension == 1 && !ui.GetMenuDisplayed(i) && app.GetGameSettings(i,eGameSetting_DisplayHUD)) { - int iGuiScale; + int iGuiScale; if(pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { @@ -234,7 +234,7 @@ void CXuiSceneBase::_TickAllBaseScenes() iGuiScale=app.GetGameSettings(i,eGameSetting_UISizeSplitscreen); } m_BossHealthGroup[i].SetShow(TRUE); - m_BossHealthText[i].SetText( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); + m_BossHealthText[i].SetText( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); if(pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { @@ -364,7 +364,7 @@ void CXuiSceneBase::_TickAllBaseScenes() break; } } - } + } m_pBossHealthProgress[i].SetRange(0, boss->getMaxHealth() ); m_pBossHealthProgress[i].SetValue( boss->getSynchedHealth() ); @@ -468,15 +468,15 @@ void CXuiSceneBase::_TickAllBaseScenes() XUIMessage xuiMsg; CustomMessage_TickScene( &xuiMsg ); XuiSendMessage( app.GetCurrentHUDScene(i), &xuiMsg ); - + bool bDisplayGui=app.GetGameStarted() && !ui.GetMenuDisplayed(i) && !(app.GetXuiAction(i)==eAppAction_AutosaveSaveGameCapturedThumbnail) && app.GetGameSettings(i,eGameSetting_DisplayHUD)!=0; if(bDisplayGui && pMinecraft->localplayers[i] != NULL) { - XuiElementSetShow(app.GetCurrentHUDScene(i),TRUE); + XuiElementSetShow(app.GetCurrentHUDScene(i),TRUE); } else { - XuiElementSetShow(app.GetCurrentHUDScene(i),FALSE); + XuiElementSetShow(app.GetCurrentHUDScene(i),FALSE); } } } @@ -495,18 +495,18 @@ HRESULT CXuiSceneBase::_SetEnableTooltips( unsigned int iPad, BOOL bVal ) HRESULT CXuiSceneBase::_SetTooltipText( unsigned int iPad, unsigned int uiTooltip, int iTextID ) { ASSERT( uiTooltip < BUTTONS_TOOLTIP_MAX ); - + XUIRect xuiRect, xuiRectSmall; HRESULT hr=S_OK; LPCWSTR pString=NULL; float fWidth,fHeight; - + // Want to be able to show just a button (for RB LB) if(iTextID>=0) { pString=app.GetString(iTextID); } - + if(hTooltipText[iPad][uiTooltip]==NULL) { HXUIOBJ hObj=NULL; @@ -514,7 +514,7 @@ HRESULT CXuiSceneBase::_SetTooltipText( unsigned int iPad, unsigned int uiToolti hr=XuiElementGetChildById(hObj,L"text_ButtonText",&hTooltipText[iPad][uiTooltip]); hr=XuiElementGetPosition(hTooltipText[iPad][uiTooltip],&m_vPosTextInTooltip[uiTooltip]); } - + if(hTooltipTextSmall[iPad][uiTooltip]==NULL) { HXUIOBJ hObj=NULL; @@ -525,8 +525,8 @@ HRESULT CXuiSceneBase::_SetTooltipText( unsigned int iPad, unsigned int uiToolti if(iTextID>=0) { - hr=XuiTextPresenterMeasureText(hTooltipText[iPad][uiTooltip], pString, &xuiRect); - + hr=XuiTextPresenterMeasureText(hTooltipText[iPad][uiTooltip], pString, &xuiRect); + // Change the size of the whole button to be the width of the measured text, plus the position the text element starts in the visual (which is the offset by the size of the button graphic) XuiElementGetBounds(m_Buttons[iPad][uiTooltip].m_hObj,&fWidth, &fHeight); XuiElementSetBounds(m_Buttons[iPad][uiTooltip].m_hObj,xuiRect.right+1+m_vPosTextInTooltip[uiTooltip].x,fHeight); @@ -537,7 +537,7 @@ HRESULT CXuiSceneBase::_SetTooltipText( unsigned int iPad, unsigned int uiToolti hr=XuiTextPresenterMeasureText(hTooltipTextSmall[iPad][uiTooltip], pString, &xuiRectSmall); - + // Change the size of the whole button to be the width of the measured text, plus the position the text element starts in the visual (which is the offset by the size of the button graphic) XuiElementGetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj,&fWidth, &fHeight); XuiElementSetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj,xuiRectSmall.right+1+m_vPosTextInTooltipSmall[uiTooltip].x,fHeight); @@ -749,7 +749,7 @@ HRESULT CXuiSceneBase::_SetTooltipsEnabled( unsigned int iPad, bool bA, bool bB, m_Buttons[iPad][BUTTON_TOOLTIP_LB].SetEnable( bLB ); m_Buttons[iPad][BUTTON_TOOLTIP_RB].SetEnable( bRB ); m_Buttons[iPad][BUTTON_TOOLTIP_LS].SetEnable( bLS ); - + m_ButtonsSmall[iPad][BUTTON_TOOLTIP_A].SetEnable( bA ); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_B].SetEnable( bB ); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_X].SetEnable( bX ); @@ -860,7 +860,7 @@ HRESULT CXuiSceneBase::_ShowBackground( unsigned int iPad, BOOL bShow ) if(bShow && pMinecraft->level!=NULL) { - int64_t i64TimeOfDay =0; + __int64 i64TimeOfDay =0; // are we in the Nether? - Leave the time as 0 if we are, so we show daylight if(pMinecraft->level->dimension->id==0) { @@ -945,11 +945,11 @@ HRESULT CXuiSceneBase::_ShowPressStart(unsigned int iPad) int nStart, nEnd; // XuiElementFindNamedFrame( m_hObj, L"StartFlash", &nStart ); // XuiElementFindNamedFrame( m_hObj, L"EndFlash", &nEnd ); -// XuiElementPlayTimeline( m_hObj, nStart, nStart, nEnd, TRUE, TRUE ); +// XuiElementPlayTimeline( m_hObj, nStart, nStart, nEnd, TRUE, TRUE ); XuiElementFindNamedFrame( hObj, L"StartFlash", &nStart ); XuiElementFindNamedFrame( hObj, L"EndFlash", &nEnd ); - XuiElementPlayTimeline( hObj, nStart, nStart, nEnd, TRUE, TRUE ); - + XuiElementPlayTimeline( hObj, nStart, nStart, nEnd, TRUE, TRUE ); + return S_OK; } @@ -960,7 +960,7 @@ HRESULT CXuiSceneBase::_HidePressStart() HRESULT CXuiSceneBase::_UpdateAutosaveCountdownTimer(unsigned int uiSeconds) { - WCHAR wcAutosaveCountdown[100]; + WCHAR wcAutosaveCountdown[100]; swprintf( wcAutosaveCountdown, 100, app.GetString(IDS_AUTOSAVE_COUNTDOWN),uiSeconds); m_TrialTimer.SetText(wcAutosaveCountdown); return S_OK; @@ -974,7 +974,7 @@ HRESULT CXuiSceneBase::_ShowAutosaveCountdownTimer(BOOL bVal) HRESULT CXuiSceneBase::_UpdateTrialTimer(unsigned int iPad) { - WCHAR wcTime[20]; + WCHAR wcTime[20]; DWORD dwTimeTicks=(DWORD)app.getTrialTimer(); @@ -982,7 +982,7 @@ HRESULT CXuiSceneBase::_UpdateTrialTimer(unsigned int iPad) { dwTimeTicks=m_dwTrialTimerLimitSecs; } - + dwTimeTicks=m_dwTrialTimerLimitSecs-dwTimeTicks; #ifndef _CONTENT_PACKAGE @@ -1038,7 +1038,7 @@ bool CXuiSceneBase::_PressStartPlaying(unsigned int iPad) HRESULT CXuiSceneBase::_SetPlayerBaseScenePosition( unsigned int iPad, EBaseScenePosition position ) { // turn off the empty quadrant logo - if(m_hEmptyQuadrantLogo!=NULL) + if(m_hEmptyQuadrantLogo!=NULL) { XuiElementSetShow(m_hEmptyQuadrantLogo,FALSE); } @@ -1086,12 +1086,12 @@ HRESULT CXuiSceneBase::_SetPlayerBaseScenePosition( unsigned int iPad, EBaseScen XuiElementSetShow( m_TooltipGroupSmall[iPad].m_hObj, TRUE); } - if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) - { + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { //640x480 ->1280x720 scale.x = 2.0f; scale.y = 1.5f; scale.z = 1.0f; XuiElementSetScale(m_hObj, &scale); - + return S_OK; } @@ -1127,7 +1127,7 @@ HRESULT CXuiSceneBase::_SetPlayerBaseScenePosition( unsigned int iPad, EBaseScen // No position adjustment case e_BaseScene_Fullscreen: tooltipsPos.x=SAFEZONE_HALF_WIDTH; - tooltipsPos.y=XUI_BASE_SCENE_HEIGHT-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT-SAFEZONE_HALF_HEIGHT-fTooltipHeight; crouchIconPos.x=SAFEZONE_HALF_WIDTH; crouchIconPos.y=SAFEZONE_HALF_HEIGHT; fBackWidth=XUI_BASE_SCENE_WIDTH; @@ -1303,7 +1303,7 @@ void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) // Only adjust if fullscreen for now, leaving code to move others if required, but it's too far up the screen when on the bottom quadrants - if( (m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) && + if( (m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) && (RenderManager.IsHiDef() || RenderManager.IsWidescreen()) ) { D3DXVECTOR3 selectedItemPos; @@ -1328,17 +1328,17 @@ void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) // The move applies to the whole scene, so we'll need to move tooltips back in some cases - selectedItemPos.y=XUI_BASE_SCENE_HEIGHT-SAFEZONE_HALF_HEIGHT-fTooltipHeight - fSelectedItemHeight; + selectedItemPos.y=XUI_BASE_SCENE_HEIGHT-SAFEZONE_HALF_HEIGHT-fTooltipHeight - fSelectedItemHeight; selectedItemPos.x = XUI_BASE_SCENE_WIDTH_HALF - (fSelectedItemWidth/2.0f); // Adjust selectedItemPos based on what gui is displayed - // 4J-PB - selected the gui scale based on the slider settings, and on whether we're in Creative or Survival + // 4J-PB - selected the gui scale based on the slider settings, and on whether we're in Creative or Survival float fYOffset=0.0f; unsigned char ucGuiScale=app.GetGameSettings(iPad,eGameSetting_UISize) + 2; - + if(Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localgameModes[iPad] != NULL && Minecraft::GetInstance()->localgameModes[iPad]->canHurtPlayer()) { // SURVIVAL MODE - Move up further because of hearts, shield and xp @@ -1353,7 +1353,7 @@ void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) default: // 2 fYOffset = -94.0f; break; - } + } } else { @@ -1368,7 +1368,7 @@ void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) default: // 2 fYOffset = -58.0f; break; - } + } } @@ -1425,14 +1425,14 @@ void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) // 4J-PB - If it's in split screen vertical, adjust the position // Adjust selectedItemPos based on what gui is displayed if((m_playerBaseScenePosition[iPad]==e_BaseScene_Left) || (m_playerBaseScenePosition[iPad]==e_BaseScene_Right)) - { + { float scale=0.5f; selectedItemPos.y -= (scale * 88.0f); if(Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localgameModes[iPad] != NULL && Minecraft::GetInstance()->localgameModes[iPad]->canHurtPlayer()) { selectedItemPos.y -= (scale * 80.0f); } - + // 4J-PB - selected the gui scale based on the slider settings unsigned char ucGuiScale; float fYOffset=0.0f; @@ -1455,7 +1455,7 @@ void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) default: // 2 fYOffset = 85.0f; break; - } + } selectedItemPos.y+=fYOffset; } @@ -1606,7 +1606,7 @@ HRESULT CXuiSceneBase::_DisplayGamertag( unsigned int iPad, BOOL bDisplay ) { // The host decides whether these are on or off if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0) - { + { if(Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localplayers[iPad]!=NULL) { wstring wsGamertag = convStringToWstring( ProfileManager.GetGamertag(iPad)); @@ -1621,7 +1621,7 @@ HRESULT CXuiSceneBase::_DisplayGamertag( unsigned int iPad, BOOL bDisplay ) } // The host decides whether these are on or off if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0) - { + { XuiElementSetShow(m_hGamerTagA[iPad],bDisplay); // set the opacity of the gamertag @@ -1712,11 +1712,11 @@ void CXuiSceneBase::_HideAllGameUIElements() m_uiSelectedItemOpacityCountDown[i] = 0; m_selectedItemA[i].SetShow(FALSE); m_selectedItemSmallA[i].SetShow(FALSE); - + m_BossHealthGroup[i].SetShow(FALSE); m_bossHealthVisible[i] = FALSE; - XuiElementSetShow(app.GetCurrentHUDScene(i),FALSE); + XuiElementSetShow(app.GetCurrentHUDScene(i),FALSE); _DisplayGamertag(i,FALSE); } @@ -1845,12 +1845,12 @@ void CXuiSceneBase::ReLayout( unsigned int iPad ) if( i>0 && lastVisible!=-1 ) { float width, height; - XuiElementGetBounds(m_Buttons[iPad][lastVisible].m_hObj, &width, &height); + XuiElementGetBounds(m_Buttons[iPad][lastVisible].m_hObj, &width, &height); // 4J Stu - This is for horizontal layout, will need changed if we do vertical layout lastPos.x += width + m_iTooltipSpacingGap; - XuiElementGetBounds(m_ButtonsSmall[iPad][lastVisible].m_hObj, &width, &height); + XuiElementGetBounds(m_ButtonsSmall[iPad][lastVisible].m_hObj, &width, &height); // 4J Stu - This is for horizontal layout, will need changed if we do vertical layout lastPosSmall.x += width + m_iTooltipSpacingGapSmall; } @@ -1948,15 +1948,15 @@ HRESULT CXuiSceneBase::SetTooltips( unsigned int iPad, int iA, int iB, int iX, i } else { - // does the tooltip need to change? + // does the tooltip need to change? if(CXuiSceneBase::Instance->m_iCurrentTooltipTextID[iPad][i]!=iTooptipsA[i] || forceUpdate) { CXuiSceneBase::Instance->SetTooltipText(iPad, i, iTooptipsA[i] ); - } + } CXuiSceneBase::Instance->_ShowTooltip(iPad, i, true ); } } - + } return S_OK; } @@ -2067,14 +2067,14 @@ HRESULT CXuiSceneBase::SetPlayerBasePositions(EBaseScenePosition pad0, EBaseScen } HRESULT CXuiSceneBase::UpdatePlayerBasePositions() -{ +{ EBaseScenePosition padPositions[XUSER_MAX_COUNT]; for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { padPositions[idx] = e_BaseScene_NotSet; } - + Minecraft *pMinecraft = Minecraft::GetInstance(); // If the game is not started (or is being held paused for a bit) then display all scenes fullscreen @@ -2134,7 +2134,7 @@ HRESULT CXuiSceneBase::UpdatePlayerBasePositions() padPositions[idx] = e_BaseScene_Right; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: - padPositions[idx] = e_BaseScene_Top_Left; + padPositions[idx] = e_BaseScene_Top_Left; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: padPositions[idx] = e_BaseScene_Top_Right; @@ -2168,7 +2168,7 @@ void CXuiSceneBase::UpdateSelectedItemPos(int iPad) CXuiSceneBase::Instance->_UpdateSelectedItemPos(iPad); } -HXUIOBJ CXuiSceneBase::GetPlayerBaseScene(int iPad) +HXUIOBJ CXuiSceneBase::GetPlayerBaseScene(int iPad) { return CXuiSceneBase::Instance->_GetPlayerBaseScene(iPad); } diff --git a/Minecraft.Client/Common/zlib/zconf.h b/Minecraft.Client/Common/zlib/zconf.h index 8fd83696..9987a775 100644 --- a/Minecraft.Client/Common/zlib/zconf.h +++ b/Minecraft.Client/Common/zlib/zconf.h @@ -485,7 +485,7 @@ typedef uLong FAR uLongf; # define z_off64_t off64_t #else # if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t long long +# define z_off64_t __int64 # else # define z_off64_t z_off_t # endif diff --git a/Minecraft.Client/CreateWorldScreen.cpp b/Minecraft.Client/CreateWorldScreen.cpp index 1a897203..b9856c7e 100644 --- a/Minecraft.Client/CreateWorldScreen.cpp +++ b/Minecraft.Client/CreateWorldScreen.cpp @@ -97,14 +97,14 @@ void CreateWorldScreen::buttonClicked(Button *button) if (done) return; done = true; - int64_t seedValue = (new Random())->nextLong(); + __int64 seedValue = (new Random())->nextLong(); wstring seedString = seedEdit->getValue(); if (seedString.length() != 0) { // try to convert it to a long first // try { // 4J - removed try/catch - int64_t value = _fromString(seedString); + __int64 value = _fromString<__int64>(seedString); if (value != 0) { seedValue = value; diff --git a/Minecraft.Client/DemoLevel.h b/Minecraft.Client/DemoLevel.h index 6464c32b..8364d5b4 100644 --- a/Minecraft.Client/DemoLevel.h +++ b/Minecraft.Client/DemoLevel.h @@ -4,7 +4,7 @@ class DemoLevel : public Level { private: - static const int64_t DEMO_LEVEL_SEED = 0; // 4J - TODO - was "Don't Look Back".hashCode(); + static const __int64 DEMO_LEVEL_SEED = 0; // 4J - TODO - was "Don't Look Back".hashCode(); static const int DEMO_SPAWN_X = 796; static const int DEMO_SPAWN_Y = 72; static const int DEMO_SPAWN_Z = -731; diff --git a/Minecraft.Client/DemoMode.cpp b/Minecraft.Client/DemoMode.cpp index 0816023b..3b24af7a 100644 --- a/Minecraft.Client/DemoMode.cpp +++ b/Minecraft.Client/DemoMode.cpp @@ -13,8 +13,8 @@ void DemoMode::tick() SurvivalMode::tick(); /* 4J - TODO - seems unlikely we need this demo mode anyway - int64_t time = minecraft->level->getTime(); - int64_t day = (time / Level::TICKS_PER_DAY) + 1; + __int64 time = minecraft->level->getTime(); + __int64 day = (time / Level::TICKS_PER_DAY) + 1; demoHasEnded = (time > (500 + Level::TICKS_PER_DAY * DEMO_DAYS)); if (demoHasEnded) @@ -26,7 +26,7 @@ void DemoMode::tick() { if (day <= (DEMO_DAYS + 1)) { - minecraft->gui->displayClientMessage(L"demo.day." + _toString(day)); + minecraft->gui->displayClientMessage(L"demo.day." + _toString<__int64>(day)); } } else if (day == 1) diff --git a/Minecraft.Client/Durango/Durango_App.cpp b/Minecraft.Client/Durango/Durango_App.cpp index e377ba05..2ec81a29 100644 --- a/Minecraft.Client/Durango/Durango_App.cpp +++ b/Minecraft.Client/Durango/Durango_App.cpp @@ -50,7 +50,7 @@ void CConsoleMinecraftApp::HandleDLCLicenseChange() // Clear the DLC installed flag so the scenes will pick up the new dlc (could be a full pack install) app.ClearDLCInstalled(); app.DebugPrintf(">>> HandleDLCLicenseChange - Updating license for DLC [%ls]\n",xOffer.wszOfferName); - pack->updateLicenseMask(1); + pack->updateLicenseMask(1); } else { @@ -100,7 +100,7 @@ void CConsoleMinecraftApp::ExitGame() } void CConsoleMinecraftApp::FatalLoadError() { - // 4J-PB - + // 4J-PB - //for(int i=0;i<10;i++) { #ifndef _CONTENT_PACKAGE @@ -204,7 +204,7 @@ int CConsoleMinecraftApp::LoadLocalDLCImage(WCHAR *wchName,PBYTE *ppbImageData,D // load the local file WCHAR wchFilename[64]; - + // 4J-PB - Read the file containing the product codes. This will be different for the SCEE/SCEA/SCEJ builds swprintf(wchFilename,L"DLCImages/%s",wchName); HANDLE hFile = CreateFile(wchFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -269,7 +269,7 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() StorageManager.SetSaveTitle(wWorldName.c_str()); bool isFlat = false; - int64_t seedValue = BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + __int64 seedValue = BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements NetworkGameInitData *param = new NetworkGameInitData(); param->seed = seedValue; @@ -308,7 +308,7 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() thread->Run(); } -typedef struct +typedef struct { eDLCContentType e_DLC_Type; //WCHAR *wchDisplayName; @@ -397,7 +397,7 @@ bool CConsoleMinecraftApp::UpdateProductId(XCONTENT_DATA &Data) app.DebugPrintf("Couldn't find %ls\n",Data.wszDisplayName); } - return false; + return false; } void CConsoleMinecraftApp::Shutdown() @@ -455,7 +455,7 @@ int CConsoleMinecraftApp::Callback_TMSPPReadBannedList(void *pParam,int iPad, in { app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadBannedList\n"); C4JStorage::PTMSPP_FILEDATA pFileData=(C4JStorage::PTMSPP_FILEDATA)lpvData; - + CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; if(pFileData) @@ -471,7 +471,7 @@ int CConsoleMinecraftApp::Callback_TMSPPReadBannedList(void *pParam,int iPad, in // mark the level as not checked against banned levels - it'll be checked once the level starts app.SetBanListCheck(iPad,false); - // Xbox One will clear things within the DownloadBlob + // Xbox One will clear things within the DownloadBlob #ifndef _XBOX_ONE delete [] pFileData->pbData; delete [] pFileData; @@ -558,11 +558,11 @@ int CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList(void *pParam,int iPad, CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList\n"); if(lpvData!=NULL) - { + { vector *pvTmsFileDetails=(vector *)lpvData; if(pvTmsFileDetails->size()>0) - { + { #ifdef _DEBUG // dump out the file list app.DebugPrintf("TMSPP filecount - %d\nFiles - \n",pvTmsFileDetails->size()); @@ -707,7 +707,7 @@ void CConsoleMinecraftApp::Callback_SaveGameIncomplete(void *pParam, C4JStorage: { CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam; - if ( saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota + if ( saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota || saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfLocalStorage ) { StorageManager.SetSaveDisabled(true); @@ -718,10 +718,10 @@ void CConsoleMinecraftApp::Callback_SaveGameIncomplete(void *pParam, C4JStorage: else message = IDS_SAVE_INCOMPLETE_EXPLANATION_LOCAL_STORAGE; UINT uiIDA[3] = - { - IDS_SAVE_INCOMPLETE_RETRY_SAVING, - IDS_SAVE_INCOMPLETE_DISABLE_SAVING, - IDS_SAVE_INCOMPLETE_DELETE_SAVES + { + IDS_SAVE_INCOMPLETE_RETRY_SAVING, + IDS_SAVE_INCOMPLETE_DISABLE_SAVING, + IDS_SAVE_INCOMPLETE_DELETE_SAVES }; if ( ui.RequestMessageBox( IDS_SAVE_INCOMPLETE_TITLE, message, uiIDA,3,0,Callback_SaveGameIncompleteMessageBoxReturned,pClass, app.GetStringTable()) == C4JStorage::EMessage_Busy) diff --git a/Minecraft.Client/Durango/Iggy/include/rrCore.h b/Minecraft.Client/Durango/Iggy/include/rrCore.h index 17ebee3a..e88b5f8c 100644 --- a/Minecraft.Client/Durango/Iggy/include/rrCore.h +++ b/Minecraft.Client/Durango/Iggy/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/Durango/Miles/include/mss.h b/Minecraft.Client/Durango/Miles/include/mss.h index 754f536b..531dcbc9 100644 --- a/Minecraft.Client/Durango/Miles/include/mss.h +++ b/Minecraft.Client/Durango/Miles/include/mss.h @@ -39,7 +39,7 @@ // doc system stuff #ifndef EXPAPI -#define EXPAPI +#define EXPAPI #endif #ifndef EXPTYPE #define EXPTYPE @@ -69,10 +69,10 @@ // For docs EXPGROUP(_NullGroup) #define MilesVersion "9.3m" EXPMACRO -#define MilesMajorVersion 9 EXPMACRO +#define MilesMajorVersion 9 EXPMACRO #define MilesMinorVersion 3 EXPMACRO -#define MilesBuildNumber 11 EXPMACRO -#define MilesCustomization 0 EXPMACRO +#define MilesBuildNumber 11 EXPMACRO +#define MilesCustomization 0 EXPMACRO EXPGROUP(_RootGroup) @@ -273,14 +273,14 @@ typedef void VOIDFUNC(void); //================ EXPGROUP(Basic Types) -#define AILCALL EXPTAG(AILCALL) +#define AILCALL EXPTAG(AILCALL) /* Internal calling convention that all external Miles functions use. Usually cdecl or stdcall on Windows. */ -#define AILCALLBACK EXPTAG(AILCALLBACK docproto) +#define AILCALLBACK EXPTAG(AILCALLBACK docproto) /* Calling convention that user supplied callbacks from Miles use. @@ -326,7 +326,7 @@ RADDEFSTART typedef CHAR *LPSTR, *PSTR; #ifdef IS_WIN64 - typedef uint64_t ULONG_PTR, *PULONG_PTR; + typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; #else #ifdef _Wp64 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 @@ -348,13 +348,13 @@ RADDEFSTART typedef struct HWAVEOUT__ *HWAVEOUT; typedef HWAVEIN *LPHWAVEIN; typedef HWAVEOUT *LPHWAVEOUT; - + #ifndef WAVE_MAPPER #define WAVE_MAPPER ((UINT)-1) #endif typedef struct waveformat_tag *LPWAVEFORMAT; - + typedef struct HMIDIOUT__ *HMIDIOUT; typedef HMIDIOUT *LPHMIDIOUT; typedef struct HWND__ *HWND; @@ -368,9 +368,9 @@ RADDEFSTART // If compiling MSS DLL, use __declspec(dllexport) for both // declarations and definitions // - + #ifdef IS_WIN32 - + #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) #define AILLIBCALLBACK __stdcall #define AILCALL __stdcall @@ -382,20 +382,20 @@ RADDEFSTART #define AILCALLBACK __cdecl #define AILEXPORT __cdecl #endif - + #ifdef __RADINDLL__ #define DXDEC __declspec(dllexport) #define DXDEF __declspec(dllexport) #else - + #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) #define DXDEC extern #else #define DXDEC __declspec(dllimport) #endif - + #endif - + #ifdef IS_WIN64 #define MSSDLLNAME "MSS64.DLL" #define MSS_REDIST_DIR_NAME "redist64" @@ -403,11 +403,11 @@ RADDEFSTART #define MSSDLLNAME "MSS32.DLL" #define MSS_REDIST_DIR_NAME "redist" #endif - + #define MSS_DIR_SEP "\\" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - + #endif typedef void * LPVOID; @@ -420,7 +420,7 @@ RADDEFSTART #define AILLIBCALLBACK #define AILCALL #define AILEXPORT - #define AILCALLBACK + #define AILCALLBACK #elif defined(__RADX86__) #define AILLIBCALLBACK __attribute__((cdecl)) #define AILCALL __attribute__((cdecl)) @@ -437,7 +437,7 @@ RADDEFSTART #define DXDEC extern #define DXDEF #endif - + #ifdef __RADX64__ #define MSS_REDIST_DIR_NAME "redist/x64" #elif defined(IS_X86) @@ -447,7 +447,7 @@ RADDEFSTART #else #error "No Redist Dir Specified" #endif - + #define MSS_DIR_SEP "/" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP @@ -714,7 +714,7 @@ typedef enum #ifndef FILE_ERRS #define FILE_ERRS - + #define AIL_NO_ERROR 0 #define AIL_IO_ERROR 1 #define AIL_OUT_OF_MEMORY 2 @@ -736,9 +736,9 @@ EXPTYPEBEGIN typedef SINTa HMSSENUM; EXPTYPEEND /* specifies a type used to enumerate through a list of properties. - + $:MSS_FIRST use this value to start the enumeration process. - + The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call the enumeration function until it returns 0. @@ -751,7 +751,7 @@ the enumeration function until it returns 0. // Preference names and default values // -#define AIL_MM_PERIOD 0 +#define AIL_MM_PERIOD 0 #define DEFAULT_AMP 1 // Default MM timer period = 5 msec. #define AIL_TIMERS 1 @@ -1877,7 +1877,7 @@ typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D posi F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. F32 spread; - + HSAMPLE owner; // May be NULL if used for temporary/internal calculations AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired @@ -1915,7 +1915,7 @@ typedef struct _SAMPLE // Sample instance S32 index; // Numeric index of this sample SMPBUF buf[8]; // Source data buffers - + U32 src_fract; // Fractional part of source address U32 mix_delay; // ms until start mixing (decreased every buffer mix) @@ -1924,7 +1924,7 @@ typedef struct _SAMPLE // Sample instance U64 mix_bytes; // total number of bytes sent to the mixer for this sample. S32 group_id; // ID for grouped operations. - + // size of the next dynamic arrays U32 chan_buf_alloced; U32 chan_buf_used; @@ -1946,10 +1946,10 @@ typedef struct _SAMPLE // Sample instance // these are dynamic arrays F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) - + S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # // 99% of the time this is a 1:1 mapping and is zero. - + S32 lp_any_on; // are any of the low pass filters on? S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? @@ -1989,7 +1989,7 @@ typedef struct _SAMPLE // Sample instance U32 low_pass_changed; // bit mask for what channels changed. - + S32 bus; // Bus assignment for this sample. S32 bus_comp_sends; // Which buses this bus routes compressor input to. S32 bus_comp_installed; // Nonzero if we have a compressor installed. @@ -2042,7 +2042,7 @@ typedef struct _SAMPLE // Sample instance SPINFO pipeline[N_SAMPLE_STAGES]; S32 n_active_filters; // # of SP_FILTER_n stages active - + // // 3D-related state for all platforms (including Xbox) // @@ -2113,14 +2113,14 @@ DXDEC void AILCALL AIL_serve(void); #ifdef IS_MAC typedef void * LPSTR; - + #define WHDR_DONE 0 - + typedef struct _WAVEIN { long temp; } * HWAVEIN; - + typedef struct _WAVEHDR { S32 dwFlags; @@ -2133,7 +2133,7 @@ DXDEC void AILCALL AIL_serve(void); S32 dwLoops; void * lpNext; U32 * reserved; - + } WAVEHDR, * LPWAVEHDR; #endif @@ -2145,7 +2145,7 @@ typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver #ifdef IS_MAC #define AIL_DIGITAL_INPUT_DEFAULT 0 - + typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver { U32 tag; // HDIN @@ -2478,7 +2478,7 @@ typedef struct _DIG_DRIVER // Handle to digital audio driver U32 last_ds_play; U32 last_ds_write; U32 last_ds_move; - + #endif #ifdef IS_X86 @@ -2661,7 +2661,7 @@ typedef struct _SEQUENCE // XMIDI sequence state table void const *EVNT; U8 const *EVNT_ptr; // Current event pointer - + U8 *ICA; // Indirect Controller Array AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler @@ -3121,13 +3121,13 @@ DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); #elif defined(__RADANDROID__) DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); - + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); #define AIL_open_digital_driver(frequency, bits, channel, flags) \ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) - + #elif defined(IS_PSP2) DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); @@ -3221,7 +3221,7 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire { Str255 version_name; } MSS_VersionType; - + #define AIL_MSS_version(str,len) \ { \ long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ @@ -3269,11 +3269,11 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire } \ } \ } - + #endif DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - + DXDEC S32 AILCALL AIL_digital_handle_reacquire (HDIGDRIVER drvr); @@ -3339,18 +3339,18 @@ DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 c $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only - affected when popped. + affected when popped. $- - If you want more control over whether a sample will be affected by a push or a pop operation, + If you want more control over whether a sample will be affected by a push or a pop operation, see $AIL_set_sample_level_mask. - + */ DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); /* - Pops the current system state and returns the system to the way it + Pops the current system state and returns the system to the way it was before the last push. $:dig The driver to pop. @@ -3374,7 +3374,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); $:S The sample to set the mask for. $:mask The bitmask of levels for which the sample will play. - Under normal push/pop operations, a sample's mask is set when it is + Under normal push/pop operations, a sample's mask is set when it is started to the level the system is at. If the system is pushed without a reset, then the mask is adjusted to include the new level. When a system is popped, if the sample is going to continue playing, @@ -3435,7 +3435,7 @@ DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); $:return The HSAMPLE for the new bus. A bus allows you to treat a group of samples as one sample. With the bus sample you can - do almost all of the things you can do with a normal sample handle. The only exception + do almost all of the things you can do with a normal sample handle. The only exception is you can't adjust the playback rate of the sample. Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. @@ -3495,7 +3495,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); /* - Installs the Compressor filter on to a bus, using another bus as the input for + Installs the Compressor filter on to a bus, using another bus as the input for compression/limiting. $:dig The driver the busses exist on. @@ -3508,7 +3508,7 @@ DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_inde its signal strength to the filter, allowing it to attenuate the bus_index bus based on another bus's contents. - To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and + To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties are documented under $(Compressor Filter) */ @@ -4325,7 +4325,7 @@ typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); #define MSS_STREAM_CHUNKS 8 -typedef struct _STREAM +typedef struct _STREAM { S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream S32 using_ASI; // 1 if using ASI decoder to uncompress stream data @@ -4349,7 +4349,7 @@ typedef struct _STREAM S32 read_IO_index; // index of buffer to be loaded into Miles next S32 bufsize; // size of each buffer - + U32 datarate; // datarate in bytes per second S32 filerate; // original datarate of the file S32 filetype; // file format type @@ -4987,7 +4987,7 @@ typedef struct OGG_INFO; DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, - U8 *Ogg_file_image, + U8 *Ogg_file_image, S32 Ogg_file_size); DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); @@ -5102,10 +5102,10 @@ DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); // 3D-related calls // -DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, +DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, S32 bus_index); -DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, +DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, S32 bus_index, S32 room_type); @@ -5180,7 +5180,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSS $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If + This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be called otherwise. @@ -5195,8 +5195,8 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, M $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having an exclusion that varies as a function of distance to the listener. If - a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion + This marks a sample as having an exclusion that varies as a function of distance to the listener. If + a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion affects reverb wet level. The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. @@ -5230,7 +5230,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECT other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional source. - If there is neither spread falloff nor volume falloff specified, spread will be automatically applied + If there is neither spread falloff nor volume falloff specified, spread will be automatically applied when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff and $AIL_set_sample_3D_volume_falloff. @@ -5243,7 +5243,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); $:S Sample to affect. $:spread The value to set the spread to. - Spread is how much the directionality of a sample "spreads" to more speakers - emulating + Spread is how much the directionality of a sample "spreads" to more speakers - emulating the effect a sound has when it occupies more than a point source. For instance, a sound point source that sits directly to the left of the listener would have a very strong left speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be @@ -5392,7 +5392,7 @@ EXPGROUP(Miles High Level Event System) EXPTYPE typedef struct MSSSOUNDBANK {}; /* Internal structure. - + Use $HMSOUNDBANK instead. */ @@ -5401,7 +5401,7 @@ EXPTYPE typedef struct MSSSOUNDBANK {}; EXPTYPE typedef struct SoundBank *HMSOUNDBANK; /* Describes a handle to an open sound bank. - + This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. */ @@ -5424,7 +5424,7 @@ DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); Close a soundbank previously opened with $AIL_open_soundbank. $:bank Soundbank to close. - + Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from this soundbank are no longer valid. */ @@ -5448,7 +5448,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. - The name of the bank is the name used in asset names. This is distinct from the + The name of the bank is the name used in asset names. This is distinct from the file name of the bank. The return value should not be deleted. @@ -5457,7 +5457,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); /* Returns the amount of data used by the soundbank management structures. - + $:bank Soundbank to query. $:return Total memory allocated. @@ -5476,7 +5476,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sound presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5503,7 +5503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMS $:return Returns 0 when enumeration is complete. Enumerates the environment presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5530,7 +5530,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sounds available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* SoundName = 0; @@ -5549,7 +5549,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* Note that name should NOT be deleted by the caller - this points at memory owned by Miles. */ - + DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); /* Enumerate the events stored in a soundbank. @@ -5561,7 +5561,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, $:return Returns 0 when enumeration is complete. Enumerates the events available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* EventName = 0; @@ -5624,7 +5624,7 @@ DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. This will alter the properties on a given sample, based on the given preset. -*/ +*/ DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); /* @@ -5644,7 +5644,7 @@ DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK ba $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. Presets may or may not affect any given property. Only the properties affected by the specified - preset will have their values restored to default. + preset will have their values restored to default. */ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); @@ -5658,7 +5658,7 @@ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPO $:isfloat nonzero if the output needs to be a float. The function callback should convert variable expressions in to an output value of the - requested type. + requested type. */ DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); @@ -5777,7 +5777,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name $:name The name of the sound asset to find. $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. - $:return Returns the byte size of the buffer required for out_name. + $:return Returns the byte size of the buffer required for out_name. This function must be called in order to resolve the sound asset name to something that can be used by miles. To ensure safe buffer containment, call @@ -5832,7 +5832,7 @@ typedef struct _MEMDUMP* HMEMDUMP; ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." - Discussion = "Primarily designed for offline use, this function is the first step in + Discussion = "Primarily designed for offline use, this function is the first step in creating an event that can be consumed by the MilesEvent system. Usage is as follows: HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); @@ -5850,7 +5850,7 @@ typedef struct _MEMDUMP* HMEMDUMP; Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following $AIL_complete_event_queue_processing. - + Events are generally tailored to the MilesEvent system, even though there is nothing preventing you from writing your own event system, or creation ui. " @@ -5906,7 +5906,7 @@ EXPTYPEEND /* Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. - $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same + $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same sound to play twice in a row. This is the only selection type that doesn't require a state variable. $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. @@ -5926,10 +5926,10 @@ EXPTYPEEND Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." - In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. - If there are multiple names listed, the sound will be chosen at random based on the given weights. This + In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. + If there are multiple names listed, the sound will be chosen at random based on the given weights. This string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always - terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use + terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use an empty string as an entry." In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" @@ -5944,7 +5944,7 @@ EXPTYPEEND In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." - In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound + In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound with a priority strictly less than the given priority." In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." @@ -5969,19 +5969,19 @@ DXDEC S32 AILCALL AIL_add_start_sound_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_SoundNames, - const char* i_PresetName, + const char* i_PresetName, U8 i_PresetIsDynamic, const char* i_EventName, const char* i_StartMarker, const char* i_EndMarker, char const* i_StateVar, char const* i_VarInit, - const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, + const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, const char* i_StartOffset, F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, F32 i_FadeInTime, - U8 i_EvictionType, + U8 i_EvictionType, U8 i_SelectType ); @@ -6004,7 +6004,7 @@ AIL_add_start_sound_event_step( In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to be called with the same parameters. - + If you are using MilesEvent, the data is refcounted so the sound will not be freed until all samples using it complete." } @@ -6089,7 +6089,7 @@ DXDEC S32 AILCALL AIL_add_control_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, const char* i_PresetName, U8 i_PresetApplyType, @@ -6191,7 +6191,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Defines a named blend function to be referenced by a blended sound later. $:i_Event The event to add the step to. - $:i_Name The name of the blend. This is the name that will be + $:i_Name The name of the blend. This is the name that will be referenced by the state variable in start sound, as well as the variable name to set by the game to update the blend for an instance. $:i_SoundCount The number of sounds this blend will affect. Max 10. @@ -6226,7 +6226,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Miles max sample count." } */ -DXDEC S32 AILCALL +DXDEC S32 AILCALL AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); /*! @@ -6257,8 +6257,8 @@ AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitNa AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" } */ -DXDEC S32 AILCALL -AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, +DXDEC S32 AILCALL +AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, const char* i_Labels, U8 i_IsDynamic ); @@ -6272,13 +6272,13 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * n thus shouldn't be checked via strlen, etc. $:return Returns 0 on fail. - Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, + Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, rather than inspected directly. */ DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); /* - Clears all persistent state in the runtime. + Clears all persistent state in the runtime. $:i_Event The event to add the step to. @@ -6311,7 +6311,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Ev DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); /* Adds a step to define a variable that oscillates over time. - + $:i_Event The event to add the step to. $:i_Name The nane of the variable to oscillate. $:i_Base The value to oscillate around, or a variable name to use as the base. @@ -6327,15 +6327,15 @@ DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); /* Adds a step to set and move a variable over time on a curve. - + $:i_Event The event to add the step to. $:i_Name The variable to move. $:i_Times The midpoint and final times for the curves $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) $:i_Values The initial, midpoint, and final values for the variable. - + The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. - + If an existing move var exists when the new one is added, the old one is replaced. */ @@ -6450,7 +6450,7 @@ struct EVENT_STEP_INFO U8 isdynamic; } persist; - struct + struct { MSSSTRINGC name; MSSSTRINGC labels; @@ -6522,7 +6522,7 @@ struct EVENT_STEP_INFO the string location of the next event step in the buffer." Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be - used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the + used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the next step. In this manner it can be used in a loop: // Create an event to stop all sounds. @@ -6610,11 +6610,11 @@ EXPTYPE typedef void* HEVENTSYSTEM; DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); /* Initializes the Miles Event system and associates it with an open digital driver. - + $:dig The digital sound driver that this event system should use. $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). - $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. - Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. + $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. + Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. Use 0 to let Miles to allocate this buffer itself. $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). @@ -6633,8 +6633,8 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); $:return A handle to the event system to use in various high level functions. Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. - - To enqueue events to the new system, use $AIL_enqueue_event_system. + + To enqueue events to the new system, use $AIL_enqueue_event_system. To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. @@ -6646,7 +6646,7 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); /* Shuts down the Miles event system. - + This function will closes everything in the event system - it ignores reference counts. It will free all event memory, sound banks, and samples used by the system. */ @@ -6660,10 +6660,10 @@ DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char c $:return The handle to the newly loaded soundbank (zero on failure). This function opens the sound bank and makes it available to the event system. The filename - is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. + is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', and while using the name 'gamebank' for authoring and auditioning. - + Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds is played, or a sound requiring it plays. @@ -6685,7 +6685,7 @@ DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); Any other data references still existing (queued events, persisted presets, etc) will report errors when used, but will not crash. - + Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. @@ -6698,24 +6698,24 @@ DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name) (EXPAPI removed to prevent release in docs) Searches for an event by name in the event system. - + $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". $:return A pointer to the event contents (or 0, if the event isn't found). - + This function is normally used as the event parameter for $AIL_enqueue_event. It searches one or all open soundbanks for a particular event name. - - This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with + + This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with MILESEVENT_ENQUEUE_BY_NAME. - + Events that are not enqueued by name can not be tracked by the Auditioner. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to a specific system. Used only if you have multiple event systems running. - + $:system The event system to attach the event to. $:return See $AIL_enqueue_event for return description. @@ -6728,10 +6728,10 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); $:name The full name of the event, eg "soundbank/path/to/event". $:return See $AIL_enqueue_event for return description. - - This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. - - For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent + + This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. + + For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) For introduction to the auditioning system, see $integrating_events. @@ -6743,9 +6743,9 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); $:return A token used for passing to functions that add data to the event. - This is used to pass more data to an event that will be executed. For instance, if + This is used to pass more data to an event that will be executed. For instance, if an event is going to spatialize a sound, but there's no need to move the sound over the course of - its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a + its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a sound is started it will use that for its initial position, and there is no need to do any game object <-> event id tracking. @@ -6762,7 +6762,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); The enqueue process is still completely thread safe. No locks are used, however only 8 enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start - will yield the thread until a slot is open. + will yield the thread until a slot is open. The ONLY time that should happen is if events enqueues are started but never ended: @@ -6838,7 +6838,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as user_buffer is never dereferenced. - $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and + $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and carried with the event. During sound enumeration this buffer is made available, and you never have to worry about memory management. $- @@ -6855,7 +6855,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data->game_stat = 1; data->needed_info = 2; - // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound + // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound // completes and we're done using it in the enumeration loop. S32 ptr_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); @@ -6874,7 +6874,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data.game_stat = 1; data.needed_info = 2; - // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use + // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use // a stack variable like this S32 buf_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); @@ -6895,7 +6895,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* nam $:value The value of the variable to set. $:return 0 if the enqueue buffer is full - When a sound starts, the given variable will be set to the given value prior to any possible + When a sound starts, the given variable will be set to the given value prior to any possible references being used by presets. */ @@ -6904,7 +6904,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); Limits the effects of the event to sounds started by the given ID. $:token A token created with $AIL_enqueue_event_start - $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an + $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an event, it will apply to all sounds started by the event, and any events queued by that event. $:return 0 if the enqueue buffer is full @@ -6932,7 +6932,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); $:selection The value to use for selecting the sound to play. $:return 0 if the enqueue buffer is full - The selection index is used to programatically select a sound from the + The selection index is used to programatically select a sound from the loaded banks. The index passed in replaces any numeric value at the end of the sound name existing in any start sound event step. For example, if a start sound event plays "mybank/sound1", and the event is queued with @@ -6969,52 +6969,52 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* even As with all of the enqueue functions it is completely thread-safe. Upon completion of this function, the enqueue slot is release and available for another - $AIL_enqueue_event_start. + $AIL_enqueue_event_start. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. - - $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. + + $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. - $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. - This data is then accessible later, when enumerating the instances. + $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. + This data is then accessible later, when enumerating the instances. $:user_buffer_len Size of the buffer pointed to by user_buffer. $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, - when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if + when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you - execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. + execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. - $:return On success, returns QueuedID value that is unique to this queued event for the rest of this + $:return On success, returns QueuedID value that is unique to this queued event for the rest of this program run (you can use this ID to uniquely identify sounds triggered from this event). - + This function enqueues an event to be triggered - this is how you begin execution of an event. First, you queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to execute an event. - - This function is very lightweight. It does nothing more than post the event and data to a + + This function is very lightweight. It does nothing more than post the event and data to a command buffer that gets executed via $AIL_begin_event_queue_processing. The user_buffer parameter can be used in different ways. If no flags are passed in, then Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with the queued sound - you can then free the user_buffer data completely! This lets Miles keep track - of all your sound related memory directly and is the normal way to use the system (it is very + of all your sound related memory directly and is the normal way to use the system (it is very convenient once you get used to it). If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will simply be associated with each sound that this event may start. In this case, user_buffer_len is ignored. - - In both cases, when you later enumerate the sound instances, you can access your sound data + + In both cases, when you later enumerate the sound instances, you can access your sound data with the $(MILESEVENTSOUNDINFO::UserBuffer) field. - + You can call this function from any number threads - it's designed to be called from anywhere in your game. If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done - by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and + by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. */ @@ -7044,23 +7044,23 @@ DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); /* Begin execution of all of the enqueued events. - $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events + $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events (out of memory, bank file not found, bad data, etc). You can get the specific error by calling $AIL_last_error. - + This function executes all the events currently in the queue. This is where all major processing takes place in the event system. - + Once you execute this functions, then sound instances will be in one of three states: - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7082,7 +7082,7 @@ ${ MILESEVENTSOUNDINFO Info; HMSSENUM SoundEnum = MSS_FIRST; - while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) { game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue @@ -7098,13 +7098,13 @@ ${ } } - $AIL_complete_event_queue_processing( ); - $} - - Note that if any event step drastically fails, the rest of the command queue is + $AIL_complete_event_queue_processing( ); + $} + + Note that if any event step drastically fails, the rest of the command queue is skipped, and this function returns 0! For this reason, you shouldn't assume that a start sound event will always result in a completed sound later. - + Therefore, you should allocate memory that you want associated with a sound instance during the enumeration loop, rather than at enqueue time. Otherwise, you need to detect that the sound didn't start and then free the memory (which can be complicated). @@ -7120,7 +7120,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO HSTREAM Stream; void* UserBuffer; S32 UserBufferLen; - S32 Status; + S32 Status; U32 Flags; S32 UsedDelay; F32 UsedVolume; @@ -7130,10 +7130,10 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO } MILESEVENTSOUNDINFO; /* Sound instance data that is associated with each active sound instance. - + $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound - was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from + was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from $AIL_enqueue_event, and EventID represents the completion event. $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). $:Sample The $HSAMPLE for this playing sound. @@ -7148,7 +7148,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted and is only valid for the until the next call in to Miles. $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. - + This structure is returned by the $AIL_enumerate_sound_instances function. It returns information about an active sound instance. */ @@ -7157,7 +7157,7 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7183,14 +7183,14 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will // get 20. $} - + */ DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7265,7 +7265,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, the sound starting. Generally you don't need to do this manually, since the sound designer should do this, however if you need to restart a sound that stopped - for example a stream that went to error - you will have to set the start position via code. - + However, since there can be a delay between the time the sound is first seen in the sound iteration and the time it gets set to the data, start positions set via the low level miles calls can get lost, so use this. @@ -7281,11 +7281,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. - $:info Returns the data for each sound instance. + $:info Returns the data for each sound instance. $:return Returns 0 when enumeration is complete. Enumerates the sound instances. This will generally be used between - calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to + calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to manage the sound instances. The label_query is a list of labels to match, separated by commas. By default, comma-separated @@ -7302,11 +7302,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7315,7 +7315,7 @@ ${ HMSSENUM SoundEnum = MSS_FIRST; MILESEVENTSOUNDINFO Info; - while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) { if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) { @@ -7330,23 +7330,23 @@ $} EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; #define MILESEVENT_SOUND_STATUS_PENDING 0x1 -#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 +#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 #define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). - + These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. */ @@ -7360,13 +7360,13 @@ EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event and couldn't find anything in the loaded banks. $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, or a limit on the sound itself. - $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. + $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. The sound will start when sufficient data has been loaded to hopefully avoid a skip. $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible that the sound playback will catch up to the read position under poor I/O conditions. @@ -7375,7 +7375,7 @@ EXPTYPEEND sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media was removed during load, or the file was not found. - + These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances may have more than one flag, logically 'or'ed together. */ @@ -7383,16 +7383,16 @@ EXPTYPEEND DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); /* Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). - + $:return Returns 0 on failure. - This function must be called as a pair with $AIL_begin_event_queue_processing. - - In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't - started playing yet. Old sound instances that have finished playing are still valid - they - haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances + This function must be called as a pair with $AIL_begin_event_queue_processing. + + In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't + started playing yet. Old sound instances that have finished playing are still valid - they + haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances and frees the completed ones - it's the 2nd half of the event processing. - + Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound instances. */ @@ -7400,7 +7400,7 @@ DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a stop sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7408,7 +7408,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, this function accomplishes that, and is captured by the auditioner for replay. @@ -7417,7 +7417,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a pause sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7425,7 +7425,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, this function accomplishes that, and is captured by the auditioner for replay. @@ -7434,7 +7434,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a resume sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7442,17 +7442,17 @@ DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U6 Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, this function accomplishes that, and is captured by the auditioner for replay. */ -DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, +DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); /* Allows the programmer to manually enqueue a start sound event into the event system. - + $:bank The bank containing the sound to start. $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. @@ -7463,10 +7463,10 @@ DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. $:return Returns a non-zero EnqueueID on success. - Enqueues an event to start the specified sound asset. - + Enqueues an event to start the specified sound asset. + Usually the programmer should trigger an event that the sound designer has specifically - create to start the appropriate sounds, but this function gives the programmer + create to start the appropriate sounds, but this function gives the programmer manual control, if necessary. This function is not captured by the auditioner. */ @@ -7488,7 +7488,7 @@ DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char co Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based on the settings in the event step). - + Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. Note that this replaces those events, it does not supplement. */ @@ -7503,7 +7503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS that this pointer can change frame to frame and should be immediately copied to a client-allocated buffer if persistence is desired. $:return Returns 0 when enumeration is complete. - + This function lets you enumerate all the persisting presets that are currently active in the system. It is mostly a debugging aid. */ @@ -7511,12 +7511,12 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); /* Returns a big string describing the current state of the event system. - - $:return String description of current systems state. + + $:return String description of current systems state. This function is a debugging aid - it can be used to show all of the active allocations, active sounds, etc. - + You must delete the pointer returned from this function with $AIL_mem_free_lock. */ @@ -7535,7 +7535,7 @@ EXPTYPE typedef struct _MILESEVENTSTATE } MILESEVENTSTATE; /* returns the current state of the Miles Event System. - + $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. $:HeapRemaining The number of bytes in HeapSize that is remaining. @@ -7615,7 +7615,7 @@ EXPTYPE typedef struct _MILESBANKFUNCTIONS } MILESBANKFUNCTIONS; /* specifies callbacks for each of the Miles event system. - + $:FreeAll Callback that tells you to free all user-side bank memory. $:GetPreset Callback to retrieve a sound preset. $:GetEnvironment Callback to retrieve an environment preset. @@ -7645,13 +7645,13 @@ DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleC In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). - + */ DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); /* Allows you to override the internal bank file resource management.. - + $:Functions A pointer to a structure containing all the callback functions. This function is used to completely override the high-level resource management system. @@ -7856,7 +7856,7 @@ EXPTYPEEND $:MILES_PLAT_IPHONE Apple iDevices $:MILES_PLAT_LINUX Linux Flavors $:MILES_PLAT_WII Nintendo Wii - $:MILES_PLAT_PSP2 Sony NGP + $:MILES_PLAT_PSP2 Sony NGP Values representing the various platforms the high level tool allows. */ @@ -7891,11 +7891,11 @@ EXPGROUP(Miles High Level Event System) DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); /* Returns an information structure about the current state of the Miles Event System. - + $:system The system to retrieve information for, or zero for the default system. $:state A pointer to a structure to receive the state information. - This function is a debugging aid - it returns information for the event system. + This function is a debugging aid - it returns information for the event system. */ DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); @@ -7923,7 +7923,7 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); // Callback for the error handler. EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); /* - The function prototype to use for a callback that will be made when the event system + The function prototype to use for a callback that will be made when the event system encounters an unrecoverable error. $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. @@ -7937,7 +7937,7 @@ EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_ EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); /* The function definition to use when defining your own random function. - + You can define a function with this prototype and pass it to $AIL_register_random if you want to tie the Miles random calls in with your game's (for logging and such). */ @@ -7953,7 +7953,7 @@ DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_Error can sometimes be somewhat invisible. This function allows you to see what went wrong, when it went wrong. - The basic usage is to have the callback check $AIL_last_error() for the overall category of + The basic usage is to have the callback check $AIL_last_error() for the overall category of failure. The parameter passed to the callback might provide some context, but it can and will be zero on occasion. Generally it will represent the resource string that is being worked on when the error occurred. @@ -8009,7 +8009,7 @@ typedef C8 * (AILCALL *FLT_ERROR)(void); typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, MSS_FREE_TYPE * pfree, - UINTa user, + UINTa user, HDIGDRIVER dig, void * memory); typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); diff --git a/Minecraft.Client/Durango/Miles/include/rrCore.h b/Minecraft.Client/Durango/Miles/include/rrCore.h index 17ebee3a..e88b5f8c 100644 --- a/Minecraft.Client/Durango/Miles/include/rrCore.h +++ b/Minecraft.Client/Durango/Miles/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/Durango/Network/DQRNetworkManager.cpp b/Minecraft.Client/Durango/Network/DQRNetworkManager.cpp index eaa8d400..f13cc4aa 100644 --- a/Minecraft.Client/Durango/Network/DQRNetworkManager.cpp +++ b/Minecraft.Client/Durango/Network/DQRNetworkManager.cpp @@ -43,7 +43,7 @@ DQRNetworkManager::SessionInfo::SessionInfo() } // This maps internal to extern states, and needs to match element-by-element the eSQRNetworkManagerInternalState enumerated type -const DQRNetworkManager::eDQRNetworkManagerState DQRNetworkManager::m_INTtoEXTStateMappings[DQRNetworkManager::DNM_INT_STATE_COUNT] = +const DQRNetworkManager::eDQRNetworkManagerState DQRNetworkManager::m_INTtoEXTStateMappings[DQRNetworkManager::DNM_INT_STATE_COUNT] = { DNM_STATE_INITIALISING, // DNM_INT_STATE_INITIALISING DNM_STATE_INITIALISE_FAILED, // DNM_INT_STATE_INITIALISE_FAILED @@ -64,7 +64,7 @@ const DQRNetworkManager::eDQRNetworkManagerState DQRNetworkManager::m_INTtoEXTSt DNM_STATE_PLAYING, // DNM_INT_STATE_PLAYING DNM_STATE_LEAVING, // DNM_INT_STATE_LEAVING DNM_STATE_LEAVING, // DNM_INT_STATE_LEAVING_FAILED - DNM_STATE_ENDING, // DNM_INT_STATE_ENDING + DNM_STATE_ENDING, // DNM_INT_STATE_ENDING }; DQRNetworkManager::DQRNetworkManager(IDQRNetworkManagerListener *listener) @@ -146,7 +146,7 @@ void DQRNetworkManager::EnableDebugXBLContext(MXS::XboxLiveContext^ XBLContext) // Show service calls from Xbox Services on the UI for easy debugging XBLContext->Settings->EnableServiceCallRoutedEvents = true; - XBLContext->Settings->ServiceCallRouted += ref new Windows::Foundation::EventHandler( + XBLContext->Settings->ServiceCallRouted += ref new Windows::Foundation::EventHandler( [=]( Platform::Object^, Microsoft::Xbox::Services::XboxServiceCallRoutedEventArgs^ args ) { //if( args->HttpStatus != 200 ) @@ -308,14 +308,14 @@ void DQRNetworkManager::JoinSession(int playerMask) m_isHosting = false; sockaddr_in6 localSocketAddressStorage; - + ZeroMemory(&localSocketAddressStorage, sizeof(localSocketAddressStorage)); - + localSocketAddressStorage.sin6_family = AF_INET6; localSocketAddressStorage.sin6_port = htons(m_associationTemplate->AcceptorSocketDescription->BoundPortRangeLower); - + memcpy(&localSocketAddressStorage.sin6_addr, &in6addr_any, sizeof(in6addr_any)); - + m_localSocketAddress = Platform::ArrayReference(reinterpret_cast(&localSocketAddressStorage), sizeof(localSocketAddressStorage)); m_joinCreateSessionAttempts = 0; @@ -402,7 +402,7 @@ bool DQRNetworkManager::AddUsersToSession(int playerMask, MXSM::MultiplayerSessi // We need to get a MultiplayerSession for each player that is joining MXSM::MultiplayerSession^ session = nullptr; - + WXS::User^ newUser = ProfileManager.GetUser(i); if( newUser == nullptr ) { @@ -451,12 +451,12 @@ bool DQRNetworkManager::AddLocalPlayerByUserIndex(int userIndex) // We need to handle this differently for the host and other machines. As the procedure for adding a reserved slot for a local player whilst on the host doesn't seem to work // // On the host machine, we: - // + // // (1) Get a MPSD for the player that is being added // (2) Call the join method // (3) Write the MPSD // (4) Update the player sync data, and broadcast out to all clients - + // On remote machines, we: // // (1) join the party @@ -473,10 +473,10 @@ bool DQRNetworkManager::AddLocalPlayerByUserIndex(int userIndex) { return false; } - + if( !m_isOfflineGame ) { - // This is going to involve some async processing + // This is going to involve some async processing MXS::XboxLiveContext^ newUserXBLContext = ref new MXS::XboxLiveContext(newUser); if( newUserXBLContext == nullptr ) @@ -558,7 +558,7 @@ bool DQRNetworkManager::AddLocalPlayerByUserIndex(int userIndex) SendRoomSyncInfo(); m_listener->HandlePlayerJoined(pPlayer); // This is for notifying of local players joining in an offline game } - else + else { // Can fail (notably if m_roomSyncData contains players who've left) assert(0); @@ -571,7 +571,7 @@ bool DQRNetworkManager::AddLocalPlayerByUserIndex(int userIndex) { // Check if there's any available slots before attempting to add the player to the party. We can still fail joining later if // the host can't add a reserved slot for us for some reason but better checking on the client side before even attempting. - + WXS::User^ newUser = ProfileManager.GetUser(userIndex); MXS::XboxLiveContext^ newUserXBLContext = ref new MXS::XboxLiveContext(newUser); @@ -622,16 +622,16 @@ bool DQRNetworkManager::AddLocalPlayerByUserIndex(int userIndex) bool DQRNetworkManager::RemoveLocalPlayerByUserIndex(int userIndex) { - // We need to handle this differently for the host and other machines. + // We need to handle this differently for the host and other machines. // // On the host machine, we: - // + // // (1) Get a MPSD for the player that is being removed // (2) Call the leave method // (3) Write the MPSD // (4) Leave the party // (5) Update the player sync data, and broadcast out to all clients - + // On remote machines, we: // // (1) Get a MPSD for the player that is being removed @@ -651,7 +651,7 @@ bool DQRNetworkManager::RemoveLocalPlayerByUserIndex(int userIndex) { return false; } - + if( !m_isOfflineGame ) { if( m_chat ) @@ -714,7 +714,7 @@ bool DQRNetworkManager::IsHost() } // Consider as "in session" from the moment that a game is created or joined, until the point where the game itself has been told via state change that we are now idle. The -// game code requires IsInSession to return true as soon as it has asked to do one of these things (even if the state system hasn't really caught up with this request yet), and +// game code requires IsInSession to return true as soon as it has asked to do one of these things (even if the state system hasn't really caught up with this request yet), and // it also requires that it is informed of the state changes leading up to not being in the session, before this should report false. bool DQRNetworkManager::IsInSession() { @@ -788,7 +788,7 @@ wstring DQRNetworkManager::GetDisplayNameByGamertag(wstring gamertag) { return m_displayNames[gamertag]; } - else + else { return gamertag; } @@ -902,14 +902,14 @@ void DQRNetworkManager::Tick_VoiceChat() { m_chat->AddLocalUser(user); } - } + } } m_vecChatPlayersJoined.clear(); LeaveCriticalSection(&m_csVecChatPlayers); } void DQRNetworkManager::Tick_Party() -{ +{ // If the primary player has been flagged as having left the party, then we don't respond immediately as it is possible we are just transitioning from one party to another, and it would be much // nicer to handle this kind of transition directly. If we do get a new party within this time period, then we'll handle by asking the user if they want to leave the game they are currently in etc. if( m_playersLeftParty ) @@ -919,7 +919,7 @@ void DQRNetworkManager::Tick_Party() // We've waited long enough. User must (hopefully) have just left the party // Previously we'd switch to offline but that causes a world of pain with forced sign-outs if( m_playersLeftParty & 1 ) - { + { // Before we switch to an offline game, check to see if there is currently a new party. If this is the case and // we're here, then its because we were added to a party, but didn't receive a gamesessionready event. So if we have // a party here that we've joined, and the number of players in the party (including us) is more than MAX_PLAYERS_IN_TEMPLATE, @@ -955,7 +955,7 @@ void DQRNetworkManager::Tick_Party() m_playersLeftParty = 0; } } - + // Forced sign out if (m_handleForcedSignOut) { @@ -1064,7 +1064,7 @@ void DQRNetworkManager::Tick_ResolveGamertags() HostGamertagResolveDetails *details = m_hostGamertagResolveResults.front(); details->m_pPlayer->SetName(details->m_name.c_str()); - + LogComment("Adding a player"); if( AddRoomSyncPlayer(details->m_pPlayer, details->m_sessionAddress, details->m_channel ) ) { @@ -1154,7 +1154,7 @@ void DQRNetworkManager::Tick_StateMachine() break; case DNM_INT_STATE_JOINING_SENDING_UNRELIABLE: { - int64_t timeNow = System::currentTimeMillis(); + __int64 timeNow = System::currentTimeMillis(); // m_firstUnreliableSendTime of 0 indicates that we haven't tried sending an unreliable packet yet so need to send one and initialise things if( m_firstUnreliableSendTime == 0 ) { @@ -1188,7 +1188,7 @@ void DQRNetworkManager::Tick_StateMachine() { // Timeout if we've been waiting for reserved slots for our joining players for too long. This is most likely because the host doesn't have room for all the slots we wanted, and we weren't able to determine this // when we went to join the game (ie someone else was joining at the same time). At this point we need to remove any local players that did already join, from both the session and the party. - int64_t timeNow = System::currentTimeMillis(); + __int64 timeNow = System::currentTimeMillis(); if( ( timeNow - m_startedWaitingForReservationsTime ) > JOIN_RESERVATION_WAIT_TIME ) { SetState(DNM_INT_STATE_JOINING_FAILED_TIDY_UP); @@ -1332,7 +1332,7 @@ void DQRNetworkManager::HandleSessionChange(MXSM::MultiplayerSession^ multiplaye { ((DurangoStats*)GenericStats::getInstance())->setMultiplayerCorrelationId( nullptr ); } - + m_multiplayerSession = multiplayerSession; } @@ -1362,7 +1362,7 @@ MXSM::MultiplayerSession^ DQRNetworkManager::WriteSessionHelper( MXS::XboxLiveCo }) .wait(); - if( outputMultiplayerSession != nullptr && + if( outputMultiplayerSession != nullptr && outputMultiplayerSession->SessionReference != nullptr ) { app.DebugPrintf( "Session written OK\n" ); @@ -1422,7 +1422,7 @@ WXM::MultiplayerSessionReference^ DQRNetworkManager::ConvertToWindowsXboxMultipl { return ref new WXM::MultiplayerSessionReference( sessionRef->SessionName, - sessionRef->ServiceConfigurationId, + sessionRef->ServiceConfigurationId, sessionRef->SessionTemplateName ); } @@ -1458,7 +1458,7 @@ void DQRNetworkManager::UpdateRoomSyncPlayers(RoomSyncData *pNewSyncData) // And when we are done, anything left in the temporary vector must be a player that left for( int i = 0; i < pNewSyncData->playerCount; i++ ) { - PlayerSyncData *pNewPlayer = &pNewSyncData->players[i]; + PlayerSyncData *pNewPlayer = &pNewSyncData->players[i]; bool bAlreadyExisted = false; for( AUTO_VAR(it, tempPlayers.begin()); it != tempPlayers.end(); it++ ) { @@ -1491,7 +1491,7 @@ void DQRNetworkManager::UpdateRoomSyncPlayers(RoomSyncData *pNewSyncData) } LogCommentFormat(L"Adding new player, index %d - type %d, small Id %d, name %s, xuid %s\n",i,m_players[i]->m_type,pNewPlayer->m_smallId,pNewPlayer->m_name,pNewPlayer->m_XUID); - + m_players[i]->SetSmallId(pNewPlayer->m_smallId); m_players[i]->SetName(pNewPlayer->m_name); m_players[i]->SetUID(PlayerUID(pNewPlayer->m_XUID)); @@ -1525,7 +1525,7 @@ void DQRNetworkManager::UpdateRoomSyncPlayers(RoomSyncData *pNewSyncData) bool DQRNetworkManager::AddRoomSyncPlayer(DQRNetworkPlayer *pPlayer, unsigned int sessionAddress, int channel) { if( m_roomSyncData.playerCount == MAX_ONLINE_PLAYER_COUNT ) return false; - + EnterCriticalSection(&m_csRoomSyncData); // Find the first entry that isn't us, to decide what to sync before. Don't consider entry #0 as this is reserved to indicate the host. int insertAtIdx = m_roomSyncData.playerCount; @@ -1552,11 +1552,11 @@ bool DQRNetworkManager::AddRoomSyncPlayer(DQRNetworkPlayer *pPlayer, unsigned in { m_roomSyncData.players[i] = m_roomSyncData.players[i-1]; m_players[i] = m_players[i - 1]; - } + } m_roomSyncData.players[insertAtIdx].m_channel = channel; m_roomSyncData.players[insertAtIdx].m_sessionAddress = sessionAddress; int xuidLength = pPlayer->GetUID().toString().length() + 1; // +1 for terminator - m_roomSyncData.players[insertAtIdx].m_XUID = new wchar_t [xuidLength]; + m_roomSyncData.players[insertAtIdx].m_XUID = new wchar_t [xuidLength]; wcsncpy(m_roomSyncData.players[insertAtIdx].m_XUID, pPlayer->GetUID().toString().c_str(), xuidLength); m_roomSyncData.players[insertAtIdx].m_smallId = pPlayer->GetSmallId(); wcscpy_s(m_roomSyncData.players[insertAtIdx].m_name, pPlayer->GetName()); @@ -1587,7 +1587,7 @@ void DQRNetworkManager::RemoveRoomSyncPlayersWithSessionAddress(unsigned int ses { m_roomSyncData.players[iWriteIdx] = m_roomSyncData.players[i]; m_players[iWriteIdx] = m_players[i]; - iWriteIdx++; + iWriteIdx++; } } m_roomSyncData.playerCount = iWriteIdx; @@ -1618,7 +1618,7 @@ void DQRNetworkManager::RemoveRoomSyncPlayer(DQRNetworkPlayer *pPlayer) { m_roomSyncData.players[iWriteIdx] = m_roomSyncData.players[i]; m_players[iWriteIdx] = m_players[i]; - iWriteIdx++; + iWriteIdx++; } } m_roomSyncData.playerCount = iWriteIdx; @@ -1659,13 +1659,13 @@ void DQRNetworkManager::SendRoomSyncInfo() uint32_t sizeHigh = internalBytes >> 8; uint32_t sizeLow = internalBytes & 0xff; - data[0] = 0x80 | sizeHigh; // Header - flag as internal data (0x80), sending + data[0] = 0x80 | sizeHigh; // Header - flag as internal data (0x80), sending data[1] = sizeLow; // Data following has the a single byte to say what it is, followed by the room sync data itself data[2] = DQR_INTERNAL_PLAYER_TABLE; memcpy(data + 3, &xuidBytes, 4); memcpy(data + 7, &m_roomSyncData, sizeof(RoomSyncData)); - unsigned char *pucCurr = data + 7 + sizeof(RoomSyncData); + unsigned char *pucCurr = data + 7 + sizeof(RoomSyncData); for( int i = 0 ; i < m_roomSyncData.playerCount; i++ ) { @@ -1701,12 +1701,12 @@ void DQRNetworkManager::SendAddPlayerFailed(Platform::String^ xuid) uint32_t sizeHigh = internalBytes >> 8; uint32_t sizeLow = internalBytes & 0xff; - data[0] = 0x80 | sizeHigh; // Header - flag as internal data (0x80), sending + data[0] = 0x80 | sizeHigh; // Header - flag as internal data (0x80), sending data[1] = sizeLow; // Data following has the a single byte to say what it is, followed by the room sync data itself data[2] = DQR_INTERNAL_ADD_PLAYER_FAILED; memcpy(data + 3, &xuidBytes, 4); - memcpy(data + 7, xuid->Data(), xuidBytes); + memcpy(data + 7, xuid->Data(), xuidBytes); SendBytesRaw(-1, data, totalBytes, true); @@ -1927,7 +1927,7 @@ int DQRNetworkManager::HostGameThreadProc() // Actually create the session (locally), using the primary player's context try { - session = ref new MXSM::MultiplayerSession( primaryUserXBLContext, + session = ref new MXSM::MultiplayerSession( primaryUserXBLContext, ref new MXSM::MultiplayerSessionReference( SERVICE_CONFIG_ID, MATCH_SESSION_TEMPLATE_NAME, sessionName ), 0, // this means that it will use the maxMembers specified in the session template. false, @@ -1972,7 +1972,7 @@ int DQRNetworkManager::HostGameThreadProc() session->Join( GetNextSmallIdAsJsonString(), true ); session->SetCurrentUserStatus( MXSM::MultiplayerSessionMemberStatus::Active ); - + // Get device ID for current user & set in the session Platform::String^ secureDeviceAddress = WXN::SecureDeviceAddress::GetLocal()->GetBase64String(); session->SetCurrentUserSecureDeviceAddressBase64( secureDeviceAddress ); @@ -1997,7 +1997,7 @@ int DQRNetworkManager::HostGameThreadProc() return 0; } m_partyController->SetJoinability(m_listener->IsSessionJoinable()); - + // Add reservations for anyone in the party, who isn't the primary player. Just adding local players for now, but perhaps this should add // other party members at this stage? for ( WXM::PartyMember^ member : partyView->Members ) @@ -2029,8 +2029,8 @@ int DQRNetworkManager::HostGameThreadProc() session->SetHostDeviceToken( hostMember->DeviceToken ); m_partyController->RegisterGamePlayersChangedEventHandler(); - - // Update session on the server + + // Update session on the server HRESULT hr = S_OK; session = WriteSessionHelper( primaryUserXBLContext, session, MXSM::MultiplayerSessionWriteMode::UpdateExisting, hr ); @@ -2086,14 +2086,14 @@ int DQRNetworkManager::HostGameThreadProc() if( m_state == DNM_INT_STATE_HOSTING_FAILED) return 0; sockaddr_in6 localSocketAddressStorage; - + ZeroMemory(&localSocketAddressStorage, sizeof(localSocketAddressStorage)); - + localSocketAddressStorage.sin6_family = AF_INET6; localSocketAddressStorage.sin6_port = htons(m_associationTemplate->AcceptorSocketDescription->BoundPortRangeLower); - + memcpy(&localSocketAddressStorage.sin6_addr, &in6addr_any, sizeof(in6addr_any)); - + m_localSocketAddress = Platform::ArrayReference(reinterpret_cast(&localSocketAddressStorage), sizeof(localSocketAddressStorage)); // This shouldn't ever happen, but seems worth checking that we don't have a pre-existing session in case there's any way to get here with one already running @@ -2184,7 +2184,7 @@ int DQRNetworkManager::HostGameThreadProc() if( m_currentUserMask & ( 1 << i ) && ProfileManager.IsSignedIn(i)) { auto user = ProfileManager.GetUser(i); - wstring displayName = ProfileManager.GetDisplayName(i); + wstring displayName = ProfileManager.GetDisplayName(i); DQRNetworkPlayer* pPlayer = new DQRNetworkPlayer(this, ( ( smallId == m_hostSmallId ) ? DQRNetworkPlayer::DNP_TYPE_HOST : DQRNetworkPlayer::DNP_TYPE_LOCAL ), true, i, localSessionAddress); pPlayer->SetSmallId(smallId); @@ -2234,7 +2234,7 @@ int DQRNetworkManager::LeaveRoomThreadProc() // Request RTS to be terminated RTS_Terminate(); - + // Now leave the game session. We need to do this for each player in turn, writing each time bool bError = false; for( int i = 0; i < 4; i++ ) @@ -2339,7 +2339,7 @@ int DQRNetworkManager::TidyUpJoinThreadProc() // We can fail to join at various points, and in at least one case (if it is down to RUDP unreliable packets timing out) then we don't have m_joinSessionUserMask bits set any more, // but we Do have m_currentUserMask set. Any of these should be considered users we should be attempting to remove from the session. - int removeSessionMask = m_joinSessionUserMask | m_currentUserMask; + int removeSessionMask = m_joinSessionUserMask | m_currentUserMask; for( int i = 0; i < 4; i++ ) { if( removeSessionMask & ( 1 << i ) ) @@ -2428,7 +2428,7 @@ int DQRNetworkManager::UpdateCustomSessionDataThreadProc() { LogComment(L"Starting thread to update custom data"); WXS::User^ primaryUser = ProfileManager.GetUser(0); - + if( primaryUser == nullptr ) { return 0; @@ -2550,7 +2550,7 @@ void DQRNetworkManager::HandlePlayerRemovedFromParty(int playerMask) { // As a client, we don't have any messy changing to offline game or saving etc. to do, so we can respond immediately to leaving the party if( playerMask & 1 ) - { + { DQRNetworkManager::LogComment(L"Primary player on this system has left the party - leaving game\n"); app.SetDisconnectReason(DisconnectPacket::eDisconnect_ExitedGame); LeaveRoom(); @@ -2725,7 +2725,7 @@ bool DQRNetworkManager::JoinPartyFromSearchResult(SessionSearchResult *searchRes m_joinSessionUserMask = playerMask; m_isInSession = true; m_isOfflineGame = false; - + m_startedWaitingForReservationsTime = System::currentTimeMillis(); SetState(DNM_INT_STATE_JOINING_WAITING_FOR_RESERVATIONS); @@ -2742,7 +2742,7 @@ bool DQRNetworkManager::JoinPartyFromSearchResult(SessionSearchResult *searchRes if( sessionRef != nullptr ) { // Allow 2 seconds before we let the player cancel - int64_t allowCancelTime = System::currentTimeMillis() + (1000 * 2); + __int64 allowCancelTime = System::currentTimeMillis() + (1000 * 2); // Now leave the game session. We need to do this for each player in turn, writing each time. Consider that any of the joining // members *may* have a slot (reserved or active) depending on how far progressed the joining got. @@ -2814,7 +2814,7 @@ bool DQRNetworkManager::JoinPartyFromSearchResult(SessionSearchResult *searchRes break; } - int64_t currentTime = System::currentTimeMillis(); + __int64 currentTime = System::currentTimeMillis(); if( currentTime > allowCancelTime) { shownCancelScreen = true; @@ -2893,7 +2893,7 @@ bool DQRNetworkManager::JoinPartyFromSearchResult(SessionSearchResult *searchRes SetState(DNM_INT_STATE_JOINING_FAILED); } }); - + while(!ccTask.is_done()) { @@ -3013,7 +3013,7 @@ void DQRNetworkManager::RequestDisplayName(DQRNetworkPlayer *player) { if (player->IsLocal()) { - // Player is local so we can just ask profile manager + // Player is local so we can just ask profile manager SetDisplayName(player->GetUID(), ProfileManager.GetDisplayName(player->GetLocalPlayerIndex())); } else diff --git a/Minecraft.Client/Durango/Network/DQRNetworkManager.h b/Minecraft.Client/Durango/Network/DQRNetworkManager.h index 3c4a742c..5f7b8d90 100644 --- a/Minecraft.Client/Durango/Network/DQRNetworkManager.h +++ b/Minecraft.Client/Durango/Network/DQRNetworkManager.h @@ -131,7 +131,7 @@ public: static const int MAX_ONLINE_PLAYER_COUNT = 8; static const int MAX_ONLINE_PLAYER_NAME_LENGTH = 21; - // This class stores everything about a player that must be synchronised between machines. + // This class stores everything about a player that must be synchronised between machines. class PlayerSyncData { public: @@ -210,7 +210,7 @@ public: DNM_STATE_JOINING, DNM_STATE_STARTING, - DNM_STATE_PLAYING, + DNM_STATE_PLAYING, DNM_STATE_LEAVING, DNM_STATE_ENDING, @@ -339,9 +339,9 @@ private: static const eDQRNetworkManagerState m_INTtoEXTStateMappings[DNM_INT_STATE_COUNT]; eDQRNetworkManagerInternalState m_state; eDQRNetworkManagerState m_stateExternal; - int64_t m_lastUnreliableSendTime; - int64_t m_firstUnreliableSendTime; - int64_t m_startedWaitingForReservationsTime; + __int64 m_lastUnreliableSendTime; + __int64 m_firstUnreliableSendTime; + __int64 m_startedWaitingForReservationsTime; unsigned char *m_customSessionData; unsigned int m_customSessionDataSize; int m_customDataDirtyUpdateTicks; @@ -361,7 +361,7 @@ private: CRITICAL_SECTION m_csRoomSyncData; RoomSyncData m_roomSyncData; - DQRNetworkPlayer *m_players[MAX_ONLINE_PLAYER_COUNT]; + DQRNetworkPlayer *m_players[MAX_ONLINE_PLAYER_COUNT]; IDQRNetworkManagerListener *m_listener; PartyController *m_partyController; @@ -389,7 +389,7 @@ private: int m_joinCreateSessionAttempts; C4JThread *m_CreateSessionThread; - C4JThread *m_LeaveRoomThread; + C4JThread *m_LeaveRoomThread; C4JThread *m_TidyUpJoinThread; C4JThread *m_UpdateCustomSessionDataThread; C4JThread *m_RTS_DoWorkThread; @@ -426,7 +426,7 @@ private: int GetQueueSizeMessages(); void SendBytesRaw(int smallId, BYTE *bytes, int byteCount, bool reliableAndSequential); void SendBytesChat(unsigned int address, BYTE *bytes, int byteCount, bool reliable, bool sequential, bool broadcast); - + bool AddRoomSyncPlayer(DQRNetworkPlayer *pPlayer, unsigned int sessionAddress, int channel); void RemoveRoomSyncPlayersWithSessionAddress(unsigned int sessionAddress); void RemoveRoomSyncPlayer(DQRNetworkPlayer *pPlayer); @@ -438,7 +438,7 @@ private: int GetSessionIndexForSmallId(unsigned char smallId); int GetSessionIndexAndSmallIdForHost(unsigned char *smallId); - static void LogComment( Platform::String^ strText ); + static void LogComment( Platform::String^ strText ); static void LogCommentFormat( LPCWSTR strMsg, ... ); static void LogCommentWithError( Platform::String^ strTest, HRESULT hr ); @@ -491,7 +491,7 @@ public: void SetDisplayName(PlayerUID xuid, wstring displayName); private: - int64_t m_playersLeftPartyTime; + __int64 m_playersLeftPartyTime; int m_playersLeftParty; bool GetBestPartyUserIndex(); @@ -502,7 +502,7 @@ private: bool GetGameSessionData(MXSM::MultiplayerSession^ session, void *gameSessionData); public: - static Platform::Collections::Vector^ GetFriends(); + static Platform::Collections::Vector^ GetFriends(); private: SessionSearchResult *m_sessionSearchResults; @@ -551,7 +551,7 @@ private: void Process_RTS_MESSAGE_STATUS_TERMINATED(RTS_Message &message); // Outgoing messages - to be called from the RTS work thread, to process requests from the main thread - + void ProcessRTSMessagesOutgoing(); void Process_RTS_MESSAGE_START_CLIENT(RTS_Message &message); void Process_RTS_MESSAGE_START_HOST(RTS_Message &message); diff --git a/Minecraft.Client/Durango/ServiceConfig/Events-XBLA.8-149E11AEEvents.h b/Minecraft.Client/Durango/ServiceConfig/Events-XBLA.8-149E11AEEvents.h index ed0360f3..5fc80438 100644 --- a/Minecraft.Client/Durango/ServiceConfig/Events-XBLA.8-149E11AEEvents.h +++ b/Minecraft.Client/Durango/ServiceConfig/Events-XBLA.8-149E11AEEvents.h @@ -155,12 +155,12 @@ Routine Description: Register the provider with ETW+. Arguments: - + None Remarks: - ERROR_SUCCESS if success or if the provider was already registered. + ERROR_SUCCESS if success or if the provider was already registered. Otherwise, an error code. --*/ @@ -175,7 +175,7 @@ Routine Description: Arguments: None Remarks: - ERROR_SUCCESS if success or if the provider was not registered. + ERROR_SUCCESS if success or if the provider was not registered. Otherwise, an error code. --*/ #define EventUnregisterXBLA_149E11AE() EtxUnregister(&XBLA_149E11AEProvider, &XBLA_149E11AEHandle) @@ -265,7 +265,7 @@ EventWriteBanLevel(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in co // __inline ULONG -EventWriteBlockBroken(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const signed int BlockId, __in const signed int BlockAux, __in const uint64_t BlockCount) +EventWriteBlockBroken(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const signed int BlockId, __in const signed int BlockAux, __in const unsigned __int64 BlockCount) { #define ARGUMENT_COUNT_XBLA_149E11AE_BlockBroken 7 @@ -289,7 +289,7 @@ EventWriteBlockBroken(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in // __inline ULONG -EventWriteBlockPlaced(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const signed int BlockId, __in const signed int BlockAux, __in const uint64_t BlockCount) +EventWriteBlockPlaced(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const signed int BlockId, __in const signed int BlockAux, __in const unsigned __int64 BlockCount) { #define ARGUMENT_COUNT_XBLA_149E11AE_BlockPlaced 7 @@ -376,7 +376,7 @@ EventWriteGameProgress(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __i // __inline ULONG -EventWriteIncDistanceTravelled(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const uint64_t Distance, __in const signed int TravelMethodId) +EventWriteIncDistanceTravelled(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const unsigned __int64 Distance, __in const signed int TravelMethodId) { #define ARGUMENT_COUNT_XBLA_149E11AE_IncDistanceTravelled 6 @@ -399,7 +399,7 @@ EventWriteIncDistanceTravelled(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessio // __inline ULONG -EventWriteIncTimePlayed(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const uint64_t TimePlayed) +EventWriteIncTimePlayed(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in const signed int DifficultyLevelId, __in const unsigned __int64 TimePlayed) { #define ARGUMENT_COUNT_XBLA_149E11AE_IncTimePlayed 5 @@ -570,7 +570,7 @@ EventWriteLevelStart(__in_opt PCWSTR UserId, __in LPCGUID PlayerSessionId, __in // __inline ULONG -EventWriteMcItemAcquired(__in_opt PCWSTR UserId, __in const signed int SectionId, __in LPCGUID PlayerSessionId, __in_opt PCWSTR MultiplayerCorrelationId, __in const signed int GameplayModeId, __in const signed int DifficultyLevelId, __in const signed int ItemId, __in const signed int AcquisitionMethodId, __in const float LocationX, __in const float LocationY, __in const float LocationZ, __in const signed int ItemAux, __in const uint64_t ItemCount) +EventWriteMcItemAcquired(__in_opt PCWSTR UserId, __in const signed int SectionId, __in LPCGUID PlayerSessionId, __in_opt PCWSTR MultiplayerCorrelationId, __in const signed int GameplayModeId, __in const signed int DifficultyLevelId, __in const signed int ItemId, __in const signed int AcquisitionMethodId, __in const float LocationX, __in const float LocationY, __in const float LocationZ, __in const signed int ItemAux, __in const unsigned __int64 ItemCount) { #define ARGUMENT_COUNT_XBLA_149E11AE_McItemAcquired 14 @@ -601,7 +601,7 @@ EventWriteMcItemAcquired(__in_opt PCWSTR UserId, __in const signed int SectionId // __inline ULONG -EventWriteMcItemUsed(__in_opt PCWSTR UserId, __in const signed int SectionId, __in LPCGUID PlayerSessionId, __in_opt PCWSTR MultiplayerCorrelationId, __in const signed int GameplayModeId, __in const signed int DifficultyLevelId, __in const signed int ItemId, __in const float LocationX, __in const float LocationY, __in const float LocationZ, __in const signed int ItemAux, __in const uint64_t ItemCount, __in const signed int Hunger) +EventWriteMcItemUsed(__in_opt PCWSTR UserId, __in const signed int SectionId, __in LPCGUID PlayerSessionId, __in_opt PCWSTR MultiplayerCorrelationId, __in const signed int GameplayModeId, __in const signed int DifficultyLevelId, __in const signed int ItemId, __in const float LocationX, __in const float LocationY, __in const float LocationZ, __in const signed int ItemAux, __in const unsigned __int64 ItemCount, __in const signed int Hunger) { #define ARGUMENT_COUNT_XBLA_149E11AE_McItemUsed 14 diff --git a/Minecraft.Client/Durango/XML/ATGXmlParser.cpp b/Minecraft.Client/Durango/XML/ATGXmlParser.cpp index 771ba268..fc5aed08 100644 --- a/Minecraft.Client/Durango/XML/ATGXmlParser.cpp +++ b/Minecraft.Client/Durango/XML/ATGXmlParser.cpp @@ -1,13 +1,13 @@ -// 4J-PB - -// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG). -// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples. -// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples. -// You are encouraged to incorporate this code into your titles. +// 4J-PB - +// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG). +// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples. +// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples. +// You are encouraged to incorporate this code into your titles. //------------------------------------------------------------------------------------- // AtgXmlParser.cpp -// +// // Simple callback non-validating XML parser implementation. // // Xbox Advanced Technology Group. @@ -35,7 +35,7 @@ XMLParser::XMLParser() // Name: XMLParser::~XMLParser //------------------------------------------------------------------------------------- XMLParser::~XMLParser() -{ +{ } @@ -51,11 +51,11 @@ VOID XMLParser::FillBuffer() if( m_hFile == NULL ) { - if( m_uInXMLBufferCharsLeft > XML_READ_BUFFER_SIZE ) + if( m_uInXMLBufferCharsLeft > XML_READ_BUFFER_SIZE ) NChars = XML_READ_BUFFER_SIZE; else NChars = m_uInXMLBufferCharsLeft; - + CopyMemory( m_pReadBuf, m_pInXMLBuffer, NChars ); m_uInXMLBufferCharsLeft -= NChars; m_pInXMLBuffer += NChars; @@ -69,7 +69,7 @@ VOID XMLParser::FillBuffer() } m_dwCharsConsumed += NChars; - int64_t iProgress = m_dwCharsTotal ? (( (int64_t)m_dwCharsConsumed * 1000 ) / (int64_t)m_dwCharsTotal) : 0; + __int64 iProgress = m_dwCharsTotal ? (( (__int64)m_dwCharsConsumed * 1000 ) / (__int64)m_dwCharsTotal) : 0; m_pISAXCallback->SetParseProgress( (DWORD)iProgress ); m_pReadBuf[ NChars ] = '\0'; @@ -89,7 +89,7 @@ VOID XMLParser::SkipNextAdvance() //------------------------------------------------------------------------------------- // Name: XMLParser::ConsumeSpace -// Desc: Skips spaces in the current stream +// Desc: Skips spaces in the current stream //------------------------------------------------------------------------------------- HRESULT XMLParser::ConsumeSpace() { @@ -104,29 +104,29 @@ HRESULT XMLParser::ConsumeSpace() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - } - SkipNextAdvance(); + } + SkipNextAdvance(); return S_OK; } //------------------------------------------------------------------------------------- // Name: XMLParser::ConvertEscape -// Desc: Copies and converts an escape sequence into m_pWriteBuf +// Desc: Copies and converts an escape sequence into m_pWriteBuf //------------------------------------------------------------------------------------- HRESULT XMLParser::ConvertEscape() -{ +{ HRESULT hr; WCHAR wVal = 0; - + if( FAILED( hr = AdvanceCharacter() ) ) return hr; - // all escape sequences start with &, so ignore the first character - + // all escape sequences start with &, so ignore the first character + if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + if ( m_Ch == '#' ) // character as hex or decimal { if( FAILED( hr = AdvanceCharacter() ) ) @@ -135,9 +135,9 @@ HRESULT XMLParser::ConvertEscape() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + while ( m_Ch != ';' ) - { + { wVal *= 16; if ( ( m_Ch >= '0' ) && ( m_Ch <= '9' ) ) @@ -151,11 +151,11 @@ HRESULT XMLParser::ConvertEscape() else if ( ( m_Ch >= 'A' ) && ( m_Ch <= 'F' ) ) { wVal += m_Ch - 'A' + 10; - } + } else { - Error( E_INVALID_XML_SYNTAX, "Expected hex digit as part of &#x escape sequence" ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Expected hex digit as part of &#x escape sequence" ); + return E_INVALID_XML_SYNTAX; } if( FAILED( hr = AdvanceCharacter() ) ) @@ -165,7 +165,7 @@ HRESULT XMLParser::ConvertEscape() else // decimal number { while ( m_Ch != ';' ) - { + { wVal *= 10; if ( ( m_Ch >= '0' ) && ( m_Ch <= '9' ) ) @@ -174,7 +174,7 @@ HRESULT XMLParser::ConvertEscape() } else { - Error( E_INVALID_XML_SYNTAX, "Expected decimal digit as part of &# escape sequence" ); + Error( E_INVALID_XML_SYNTAX, "Expected decimal digit as part of &# escape sequence" ); return E_INVALID_XML_SYNTAX; } @@ -187,7 +187,7 @@ HRESULT XMLParser::ConvertEscape() m_Ch = wVal; return S_OK; - } + } // must be an entity reference @@ -197,13 +197,13 @@ HRESULT XMLParser::ConvertEscape() SkipNextAdvance(); if( FAILED( hr = AdvanceName() ) ) return hr; - + EntityRefLen = (UINT)( m_pWritePtr - pEntityRefVal ); m_pWritePtr = pEntityRefVal; if ( EntityRefLen == 0 ) { - Error( E_INVALID_XML_SYNTAX, "Expecting entity name after &" ); + Error( E_INVALID_XML_SYNTAX, "Expecting entity name after &" ); return E_INVALID_XML_SYNTAX; } @@ -219,7 +219,7 @@ HRESULT XMLParser::ConvertEscape() wVal = '"'; else { - Error( E_INVALID_XML_SYNTAX, "Unrecognized entity name after & - (should be lt, gt, amp, apos, or quot)" ); + Error( E_INVALID_XML_SYNTAX, "Unrecognized entity name after & - (should be lt, gt, amp, apos, or quot)" ); return E_INVALID_XML_SYNTAX; // return false if unrecognized token sequence } @@ -228,10 +228,10 @@ HRESULT XMLParser::ConvertEscape() if( m_Ch != ';' ) { - Error( E_INVALID_XML_SYNTAX, "Expected terminating ; for entity reference" ); + Error( E_INVALID_XML_SYNTAX, "Expected terminating ; for entity reference" ); return E_INVALID_XML_SYNTAX; // malformed reference - needs terminating ; } - + m_Ch = wVal; return S_OK; } @@ -250,41 +250,41 @@ HRESULT XMLParser::AdvanceAttrVal() return hr; if( ( m_Ch != '"' ) && ( m_Ch != '\'' ) ) - { - Error( E_INVALID_XML_SYNTAX, "Attribute values must be enclosed in quotes" ); + { + Error( E_INVALID_XML_SYNTAX, "Attribute values must be enclosed in quotes" ); return E_INVALID_XML_SYNTAX; } wQuoteChar = m_Ch; - + for( ;; ) { if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - else if( m_Ch == wQuoteChar ) - break; + return hr; + else if( m_Ch == wQuoteChar ) + break; else if( m_Ch == '&' ) { SkipNextAdvance(); if( FAILED( hr = ConvertEscape() ) ) - return hr; + return hr; } - else if( m_Ch == '<' ) + else if( m_Ch == '<' ) { - Error( E_INVALID_XML_SYNTAX, "Illegal character '<' in element tag" ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Illegal character '<' in element tag" ); + return E_INVALID_XML_SYNTAX; } - + // copy character into the buffer - - if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) + + if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) { - Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); + return E_INVALID_XML_SYNTAX; } - + *m_pWritePtr = m_Ch; - m_pWritePtr++; + m_pWritePtr++; } return S_OK; } @@ -296,18 +296,18 @@ HRESULT XMLParser::AdvanceAttrVal() // Ignores leading whitespace. Currently does not support unicode names //------------------------------------------------------------------------------------- HRESULT XMLParser::AdvanceName() -{ +{ HRESULT hr; if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; if( ( ( m_Ch < 'A' ) || ( m_Ch > 'Z' ) ) && ( ( m_Ch < 'a' ) || ( m_Ch > 'z' ) ) && ( m_Ch != '_' ) && ( m_Ch != ':' ) ) { - Error( E_INVALID_XML_SYNTAX, "Names must start with an alphabetic character or _ or :" ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Names must start with an alphabetic character or _ or :" ); + return E_INVALID_XML_SYNTAX; } while( ( ( m_Ch >= 'A' ) && ( m_Ch <= 'Z' ) ) || @@ -319,17 +319,17 @@ HRESULT XMLParser::AdvanceName() if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) { - Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); + Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); return E_INVALID_XML_SYNTAX; - } + } *m_pWritePtr = m_Ch; m_pWritePtr++; if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; } - + SkipNextAdvance(); return S_OK; } @@ -343,7 +343,7 @@ HRESULT XMLParser::AdvanceName() // Returns S_OK if there are more characters, E_ABORT for no characters to read //------------------------------------------------------------------------------------- HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) -{ +{ if( m_bSkipNextAdvance ) { m_bSkipNextAdvance = FALSE; @@ -351,20 +351,20 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) } // If we hit EOF in the middle of a character, - // it's ok-- we'll just have a corrupt last character + // it's ok-- we'll just have a corrupt last character // (the buffer is padded with double NULLs ) if ( ( m_pReadPtr[0] == '\0' ) && ( m_pReadPtr[1] == '\0' ) ) { // Read more from the file - FillBuffer(); + FillBuffer(); // We are at EOF if it is still NULL if ( ( m_pReadPtr[0] == '\0' ) && ( m_pReadPtr[1] == '\0' ) ) { if( !bOkToFail ) { - Error( E_INVALID_XML_SYNTAX, "Unexpected EOF while parsing XML file" ); + Error( E_INVALID_XML_SYNTAX, "Unexpected EOF while parsing XML file" ); return E_INVALID_XML_SYNTAX; } else @@ -372,7 +372,7 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) return E_FAIL; } } - } + } if( m_bUnicode == FALSE ) { @@ -382,13 +382,13 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) else // if( m_bUnicode == TRUE ) { m_Ch = *((WCHAR *)m_pReadPtr); - + if( m_bReverseBytes ) { m_Ch = ( m_Ch << 8 ) + ( m_Ch >> 8 ); } - - m_pReadPtr += 2; + + m_pReadPtr += 2; } if( m_Ch == '\n' ) @@ -398,114 +398,114 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) } else if( m_Ch != '\r' ) m_pISAXCallback->m_LinePos++; - + return S_OK; } //------------------------------------------------------------------------------------- // Name: XMLParser::AdvanceElement -// Desc: Builds data, calls callback +// Desc: Builds data, calls callback //------------------------------------------------------------------------------------- HRESULT XMLParser::AdvanceElement() -{ +{ HRESULT hr; // write ptr at the beginning of the buffer m_pWritePtr = m_pWriteBuf; - + if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - + return hr; + // if first character wasn't '<', we wouldn't be here - + if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; if( m_Ch == '!' ) { - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; if ( m_Ch == '-' ) { - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - if( m_Ch != '-' ) + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; + if( m_Ch != '-' ) { Error( E_INVALID_XML_SYNTAX, "Expecting '-' after 'ElementEnd( pEntityRefVal, + if( FAILED( m_pISAXCallback->ElementEnd( pEntityRefVal, (UINT) ( m_pWritePtr - pEntityRefVal ) ) ) ) return E_ABORT; - - if( FAILED( hr = ConsumeSpace() ) ) + + if( FAILED( hr = ConsumeSpace() ) ) return hr; - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; if( m_Ch != '>' ) { @@ -513,42 +513,42 @@ HRESULT XMLParser::AdvanceElement() return E_INVALID_XML_SYNTAX; } } - else if( m_Ch == '?' ) + else if( m_Ch == '?' ) { // just skip any xml header tag since not really important after identifying character set for( ;; ) { - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; + if ( m_Ch == '>' ) return S_OK; } } else { - XMLAttribute Attributes[ XML_MAX_ATTRIBUTES_PER_ELEMENT ]; + XMLAttribute Attributes[ XML_MAX_ATTRIBUTES_PER_ELEMENT ]; UINT NumAttrs; WCHAR *pEntityRefVal = m_pWritePtr; UINT EntityRefLen; NumAttrs = 0; - + SkipNextAdvance(); // Entity tag - if( FAILED( hr = AdvanceName() ) ) + if( FAILED( hr = AdvanceName() ) ) return hr; EntityRefLen = (UINT)( m_pWritePtr - pEntityRefVal ); - if( FAILED( hr = ConsumeSpace() ) ) + if( FAILED( hr = ConsumeSpace() ) ) return hr; - + if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - + return hr; + // read attributes while( ( m_Ch != '>' ) && ( m_Ch != '/' ) ) { @@ -556,31 +556,31 @@ HRESULT XMLParser::AdvanceElement() if ( NumAttrs >= XML_MAX_ATTRIBUTES_PER_ELEMENT ) { - Error( E_INVALID_XML_SYNTAX, "Elements may not have more than %d attributes", XML_MAX_ATTRIBUTES_PER_ELEMENT ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Elements may not have more than %d attributes", XML_MAX_ATTRIBUTES_PER_ELEMENT ); + return E_INVALID_XML_SYNTAX; } Attributes[ NumAttrs ].strName = m_pWritePtr; - + // Attribute name if( FAILED( hr = AdvanceName() ) ) return hr; - + Attributes[ NumAttrs ].NameLen = (UINT)( m_pWritePtr - Attributes[ NumAttrs ].strName ); if( FAILED( hr = ConsumeSpace() ) ) return hr; - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; - if( m_Ch != '=' ) + if( m_Ch != '=' ) { Error( E_INVALID_XML_SYNTAX, "Expecting '=' character after attribute name" ); return E_INVALID_XML_SYNTAX; } - - if( FAILED( hr = ConsumeSpace() ) ) + + if( FAILED( hr = ConsumeSpace() ) ) return hr; Attributes[ NumAttrs ].strValue = m_pWritePtr; @@ -588,29 +588,29 @@ HRESULT XMLParser::AdvanceElement() if( FAILED( hr = AdvanceAttrVal() ) ) return hr; - Attributes[ NumAttrs ].ValueLen = (UINT)( m_pWritePtr - + Attributes[ NumAttrs ].ValueLen = (UINT)( m_pWritePtr - Attributes[ NumAttrs ].strValue ); ++NumAttrs; - + if( FAILED( hr = ConsumeSpace() ) ) - return hr; + return hr; if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; } if( m_Ch == '/' ) { if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; if( m_Ch != '>' ) { Error( E_INVALID_XML_SYNTAX, "Expecting '>' after '/' in element tag" ); return E_INVALID_XML_SYNTAX; } - if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, + if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, Attributes, NumAttrs ) ) ) return E_ABORT; @@ -619,7 +619,7 @@ HRESULT XMLParser::AdvanceElement() } else { - if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, + if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, Attributes, NumAttrs ) ) ) return E_ABORT; } @@ -637,7 +637,7 @@ HRESULT XMLParser::AdvanceCDATA() { HRESULT hr; WORD wStage = 0; - + if( FAILED( m_pISAXCallback->CDATABegin() ) ) return E_ABORT; @@ -645,10 +645,10 @@ HRESULT XMLParser::AdvanceCDATA() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + *m_pWritePtr = m_Ch; m_pWritePtr++; - + if( ( m_Ch == ']' ) && ( wStage == 0 ) ) wStage = 1; else if( ( m_Ch == ']' ) && ( wStage == 1 ) ) @@ -666,9 +666,9 @@ HRESULT XMLParser::AdvanceCDATA() if( FAILED( m_pISAXCallback->CDATAData( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), TRUE ) ) ) return E_ABORT; m_pWritePtr = m_pWriteBuf; - } + } } - + if( FAILED( m_pISAXCallback->CDATAData( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) return E_ABORT; @@ -676,7 +676,7 @@ HRESULT XMLParser::AdvanceCDATA() if( FAILED( m_pISAXCallback->CDATAEnd() ) ) return E_ABORT; - + return S_OK; } @@ -694,24 +694,24 @@ HRESULT XMLParser::AdvanceComment() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + if (( m_Ch == '-' ) && ( wStage == 0 )) wStage = 1; else if (( m_Ch == '-' ) && ( wStage == 1 )) wStage = 2; - else if (( m_Ch == '>' ) && ( wStage == 2 )) - break; + else if (( m_Ch == '>' ) && ( wStage == 2 )) + break; else - wStage = 0; + wStage = 0; } - + return S_OK; } //------------------------------------------------------------------------------------- // Name: XMLParser::RegisterSAXCallbackInterface -// Desc: Registers callback interface +// Desc: Registers callback interface //------------------------------------------------------------------------------------- VOID XMLParser::RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ) { @@ -721,7 +721,7 @@ VOID XMLParser::RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ) //------------------------------------------------------------------------------------- // Name: XMLParser::GetSAXCallbackInterface -// Desc: Returns current callback interface +// Desc: Returns current callback interface //------------------------------------------------------------------------------------- ISAXCallback* XMLParser::GetSAXCallbackInterface() { @@ -740,7 +740,7 @@ HRESULT XMLParser::MainParseLoop() if( FAILED( m_pISAXCallback->StartDocument() ) ) return E_ABORT; - + m_pWritePtr = m_pWriteBuf; FillBuffer(); @@ -751,57 +751,57 @@ HRESULT XMLParser::MainParseLoop() m_bReverseBytes = FALSE; m_pReadPtr += 2; } - else if ( *((WCHAR *) m_pReadBuf ) == 0xFFFE ) + else if ( *((WCHAR *) m_pReadBuf ) == 0xFFFE ) { m_bUnicode = TRUE; m_bReverseBytes = TRUE; - m_pReadPtr += 2; + m_pReadPtr += 2; } - else if ( *((WCHAR *) m_pReadBuf ) == 0x003C ) + else if ( *((WCHAR *) m_pReadBuf ) == 0x003C ) { - m_bUnicode = TRUE; + m_bUnicode = TRUE; m_bReverseBytes = FALSE; } - else if ( *((WCHAR *) m_pReadBuf ) == 0x3C00 ) + else if ( *((WCHAR *) m_pReadBuf ) == 0x3C00 ) { m_bUnicode = TRUE; - m_bReverseBytes = TRUE; + m_bReverseBytes = TRUE; } else if ( m_pReadBuf[ 0 ] == 0x3C ) { - m_bUnicode = FALSE; - m_bReverseBytes = FALSE; + m_bUnicode = FALSE; + m_bReverseBytes = FALSE; } else - { + { Error( E_INVALID_XML_SYNTAX, "Unrecognized encoding (parser does not support UTF-8 language encodings)" ); - return E_INVALID_XML_SYNTAX; + return E_INVALID_XML_SYNTAX; } - + for( ;; ) { if( FAILED( AdvanceCharacter( TRUE ) ) ) { if ( ( (UINT) ( m_pWritePtr - m_pWriteBuf ) != 0 ) && ( !bWhiteSpaceOnly ) ) - { - if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) - return E_ABORT; + { + if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) + return E_ABORT; bWhiteSpaceOnly = TRUE; } - + if( FAILED( m_pISAXCallback->EndDocument() ) ) return E_ABORT; - - return S_OK; + + return S_OK; } if( m_Ch == '<' ) { if( ( (UINT) ( m_pWritePtr - m_pWriteBuf ) != 0 ) && ( !bWhiteSpaceOnly ) ) - { - if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) - return E_ABORT; + { + if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) + return E_ABORT; bWhiteSpaceOnly = TRUE; } @@ -810,45 +810,45 @@ HRESULT XMLParser::MainParseLoop() m_pWritePtr = m_pWriteBuf; - if( FAILED( hr = AdvanceElement() ) ) - return hr; + if( FAILED( hr = AdvanceElement() ) ) + return hr; m_pWritePtr = m_pWriteBuf; } - else + else { if( m_Ch == '&' ) { SkipNextAdvance(); - if( FAILED( hr = ConvertEscape() ) ) - return hr; + if( FAILED( hr = ConvertEscape() ) ) + return hr; } - if( bWhiteSpaceOnly && ( m_Ch != ' ' ) && ( m_Ch != '\n' ) && ( m_Ch != '\r' ) && - ( m_Ch != '\t' ) ) + if( bWhiteSpaceOnly && ( m_Ch != ' ' ) && ( m_Ch != '\n' ) && ( m_Ch != '\r' ) && + ( m_Ch != '\t' ) ) { bWhiteSpaceOnly = FALSE; } *m_pWritePtr = m_Ch; m_pWritePtr++; - + if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) { if( !bWhiteSpaceOnly ) - { - if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, - ( UINT ) ( m_pWritePtr - m_pWriteBuf ), + { + if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, + ( UINT ) ( m_pWritePtr - m_pWriteBuf ), TRUE ) ) ) { - return E_ABORT; + return E_ABORT; } } m_pWritePtr = m_pWriteBuf; bWhiteSpaceOnly = TRUE; } - } + } } } @@ -858,36 +858,36 @@ HRESULT XMLParser::MainParseLoop() // Desc: Builds element data //------------------------------------------------------------------------------------- HRESULT XMLParser::ParseXMLFile( CONST CHAR *strFilename ) -{ +{ HRESULT hr; if( m_pISAXCallback == NULL ) return E_NOINTERFACE; - m_pISAXCallback->m_LineNum = 1; + m_pISAXCallback->m_LineNum = 1; m_pISAXCallback->m_LinePos = 0; m_pISAXCallback->m_strFilename = strFilename; // save this off only while we parse the file m_bSkipNextAdvance = FALSE; - m_pReadPtr = m_pReadBuf; - + m_pReadPtr = m_pReadBuf; + m_pReadBuf[ 0 ] = '\0'; - m_pReadBuf[ 1 ] = '\0'; - + m_pReadBuf[ 1 ] = '\0'; + m_pInXMLBuffer = NULL; m_uInXMLBufferCharsLeft = 0; - + WCHAR wchFilename[ 64 ]; swprintf_s(wchFilename,64,L"%s",strFilename); - m_hFile = CreateFile( wchFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + m_hFile = CreateFile( wchFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); if( m_hFile == INVALID_HANDLE_VALUE ) - { + { Error( E_COULD_NOT_OPEN_FILE, "Error opening file" ); hr = E_COULD_NOT_OPEN_FILE; - + } else { @@ -897,14 +897,14 @@ HRESULT XMLParser::ParseXMLFile( CONST CHAR *strFilename ) m_dwCharsConsumed = 0; hr = MainParseLoop(); } - + // Close the file if( m_hFile != INVALID_HANDLE_VALUE ) CloseHandle( m_hFile ); m_hFile = INVALID_HANDLE_VALUE; // we no longer own strFilename, so un-set it - m_pISAXCallback->m_strFilename = NULL; + m_pISAXCallback->m_strFilename = NULL; return hr; } @@ -914,38 +914,38 @@ HRESULT XMLParser::ParseXMLFile( CONST CHAR *strFilename ) // Desc: Builds element data //------------------------------------------------------------------------------------- HRESULT XMLParser::ParseXMLBuffer( CONST CHAR *strBuffer, UINT uBufferSize ) -{ +{ HRESULT hr; - + if( m_pISAXCallback == NULL ) return E_NOINTERFACE; - m_pISAXCallback->m_LineNum = 1; + m_pISAXCallback->m_LineNum = 1; m_pISAXCallback->m_LinePos = 0; m_pISAXCallback->m_strFilename = ""; // save this off only while we parse the file m_bSkipNextAdvance = FALSE; m_pReadPtr = m_pReadBuf; - + m_pReadBuf[ 0 ] = '\0'; - m_pReadBuf[ 1 ] = '\0'; + m_pReadBuf[ 1 ] = '\0'; m_hFile = NULL; m_pInXMLBuffer = strBuffer; m_uInXMLBufferCharsLeft = uBufferSize; m_dwCharsTotal = uBufferSize; m_dwCharsConsumed = 0; - + hr = MainParseLoop(); // we no longer own strFilename, so un-set it - m_pISAXCallback->m_strFilename = NULL; + m_pISAXCallback->m_strFilename = NULL; return hr; } //------------------------------------------------------------------------------------- -// XMLParser::Error() +// XMLParser::Error() // Logs an error through the callback interface //------------------------------------------------------------------------------------- #ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation @@ -960,7 +960,7 @@ VOID XMLParser::Error( HRESULT hErr, CONST CHAR* strFormat, ... ) va_start( pArglist, strFormat ); vsprintf( strBuffer, strFormat, pArglist ); - + m_pISAXCallback->Error( hErr, strBuffer ); va_end( pArglist ); } diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index 716d3307..508b3a1a 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -178,7 +178,7 @@ GameRenderer::~GameRenderer() } void GameRenderer::tick(bool first) // 4J - add bFirst -{ +{ tickFov(); tickLightTexture(); // 4J - change brought forward from 1.8.2 fogBrO = fogBr; @@ -627,7 +627,7 @@ void GameRenderer::unZoomRegion() void GameRenderer::getFovAndAspect(float& fov, float& aspect, float a, bool applyEffects) { // 4J - split out aspect ratio and fov here so we can adjust for viewports - we might need to revisit these as - // they are maybe be too generous for performance. + // they are maybe be too generous for performance. aspect = mc->width / (float) mc->height; fov = getFov(a, applyEffects); @@ -679,7 +679,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<options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) { - if (!mc->options->hideGui && !mc->gameMode->isCutScene()) + if (!mc->options->hideGui && !mc->gameMode->isCutScene()) { turnOnLightLayer(a); PIXBeginNamedEvent(0,"Item in hand render"); @@ -795,7 +795,7 @@ void GameRenderer::renderItemInHand(float a, int eye) // 4J - change brought forward from 1.8.2 void GameRenderer::turnOffLightLayer(double alpha) { // 4J - TODO -#if 0 +#if 0 if (SharedConstants::TEXTURE_LIGHTING) { glClientActiveTexture(GL_TEXTURE1); @@ -868,7 +868,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++) { @@ -1141,7 +1141,7 @@ int GameRenderer::runUpdate(LPVOID lpParam) Vec3::CreateNewThreadStorage(); AABB::CreateNewThreadStorage(); IntCache::CreateNewThreadStorage(); - Tesselator::CreateNewThreadStorage(1024*1024); + Tesselator::CreateNewThreadStorage(1024*1024); Compression::UseDefaultThreadStorage(); RenderManager.InitialiseContext(); #ifdef _LARGE_WORLDS @@ -1210,12 +1210,12 @@ int GameRenderer::runUpdate(LPVOID lpParam) } m_deleteStackSparseDataStorage.clear(); LeaveCriticalSection(&m_csDeleteStack); - + // PIXEndNamedEvent(); AABB::resetPool(); Vec3::resetPool(); - IntCache::Reset(); + IntCache::Reset(); m_updateEvents->Set(eUpdateEventIsFinished); } @@ -1247,12 +1247,12 @@ void GameRenderer::DisableUpdateThread() if( !updateRunning) return; app.DebugPrintf("------------------DisableUpdateThread--------------------\n"); updateRunning = false; - m_updateEvents->Clear(eUpdateCanRun); + m_updateEvents->Clear(eUpdateCanRun); m_updateEvents->WaitForSingle(eUpdateEventIsFinished,INFINITE); #endif } -void GameRenderer::renderLevel(float a, int64_t until) +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 @@ -1335,7 +1335,7 @@ void GameRenderer::renderLevel(float a, int64_t until) if (until == 0) break; - int64_t diff = until - System::nanoTime(); + __int64 diff = until - System::nanoTime(); if (diff < 0) break; if (diff > 1000000000) break; } while (true); @@ -1594,7 +1594,7 @@ void GameRenderer::renderSnowAndRain(float a) this->turnOnLightLayer(a); - if (rainXa == NULL) + if (rainXa == NULL) { rainXa = new float[32 * 32]; rainZa = new float[32 * 32]; @@ -1657,7 +1657,7 @@ void GameRenderer::renderSnowAndRain(float a) } // 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; @@ -1669,7 +1669,7 @@ void GameRenderer::renderSnowAndRain(float a) 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; @@ -1715,9 +1715,9 @@ void GameRenderer::renderSnowAndRain(float a) 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, + 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)); @@ -1753,9 +1753,9 @@ void GameRenderer::renderSnowAndRain(float a) 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, + 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); @@ -1861,7 +1861,7 @@ void GameRenderer::setupClearColor(float a) } else if (t != 0 && Tile::tiles[t]->material == Material::water) { - + unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Water_Clear_Colour ); byte redComponent = ((colour>>16)&0xFF); byte greenComponent = ((colour>>8)&0xFF); @@ -1873,7 +1873,7 @@ void GameRenderer::setupClearColor(float a) } 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); @@ -2017,7 +2017,7 @@ void GameRenderer::setupFog(int i, float alpha) { 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); @@ -2049,7 +2049,7 @@ void GameRenderer::setupFog(int i, float alpha) { 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); @@ -2074,7 +2074,7 @@ void GameRenderer::setupFog(int i, float alpha) { 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); diff --git a/Minecraft.Client/GameRenderer.h b/Minecraft.Client/GameRenderer.h index fca091a1..3729726b 100644 --- a/Minecraft.Client/GameRenderer.h +++ b/Minecraft.Client/GameRenderer.h @@ -94,8 +94,8 @@ public: void setupCamera(float a, int eye); private: void renderItemInHand(float a, int eye); - int64_t lastActiveTime; - int64_t lastNsTime; + __int64 lastActiveTime; + __int64 lastNsTime; // 4J - changes brought forward from 1.8.2 bool _updateLightTexture; public: @@ -112,7 +112,7 @@ private: public: void render(float a, bool bFirst); // 4J added bFirst void renderLevel(float a); - void renderLevel(float a, int64_t until); + void renderLevel(float a, __int64 until); private: Random *random; int rainSoundTime; diff --git a/Minecraft.Client/Gui.cpp b/Minecraft.Client/Gui.cpp index ffdf5055..7d76edbd 100644 --- a/Minecraft.Client/Gui.cpp +++ b/Minecraft.Client/Gui.cpp @@ -58,7 +58,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) { // 4J Stu - I have copied this code for XUI_BaseScene. If/when it gets changed it should be broken out // 4J - altered to force full screen mode to 3X scaling, and any split screen modes to 2X scaling. This is so that the further scaling by 0.5 that - // happens in split screen modes results in a final scaling of 1 rather than 1.5. + // happens in split screen modes results in a final scaling of 1 rather than 1.5. int splitYOffset;// = 20; // This offset is applied when doing the 2X scaling above to move the gui out of the way of the tool tips int guiScale;// = ( minecraft->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN ? 3 : 2 ); int iPad=minecraft->player->GetXboxPad(); @@ -97,7 +97,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) default: // 2 splitYOffset = 10; break; - } + } // Check which screen section this player is in switch(minecraft->player->m_iScreenSection) @@ -136,7 +136,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: - iSafezoneXHalf = 0; + iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) fScaleFactorHeight=0.5f; iHeightOffset=screenHeight; @@ -151,7 +151,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: - iSafezoneXHalf = 0; + iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset; // 5% iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; @@ -163,27 +163,27 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: - iSafezoneXHalf = 0; + iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset + screenHeight/10; // 5% (the whole screen is 2x this screen) iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; - + } // 4J-PB - turn off the slot display if a xui menu is up, or if we're autosaving bool bDisplayGui=!ui.GetMenuDisplayed(iPad) && !(app.GetXuiAction(iPad)==eAppAction_AutosaveSaveGameCapturedThumbnail); // if tooltips are off, set the y offset to zero - if(app.GetGameSettings(iPad,eGameSetting_Tooltips)==0 && bDisplayGui) + if(app.GetGameSettings(iPad,eGameSetting_Tooltips)==0 && bDisplayGui) { switch(minecraft->player->m_iScreenSection) { case C4JRender::VIEWPORT_TYPE_FULLSCREEN: - iTooltipsYOffset=screenHeight/10; + iTooltipsYOffset=screenHeight/10; break; default: - //iTooltipsYOffset=screenHeight/10; + //iTooltipsYOffset=screenHeight/10; switch(guiScale) { case 3: @@ -195,11 +195,11 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) default: // 2 iTooltipsYOffset=14;//screenHeight/10; break; - } + } break; } } - + // 4J-PB - Turn off interface if eGameSetting_DisplayHUD is off - for screen shots/videos. if ( app.GetGameSettings(iPad,eGameSetting_DisplayHUD)==0 ) { @@ -210,13 +210,13 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) minecraft->gameRenderer->setupGuiScreen(guiScale); - + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 4J - added - this did actually get set in renderVignette but that code is currently commented out - if (Minecraft::useFancyGraphics()) + if (Minecraft::useFancyGraphics()) { renderVignette(minecraft->player->getBrightness(a), screenWidth, screenHeight); } @@ -244,7 +244,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) if(bDisplayGui && bTwoPlayerSplitscreen) { // need to apply scale factors depending on the mode - glPushMatrix(); + glPushMatrix(); glScalef(fScaleFactorWidth, fScaleFactorHeight, fScaleFactorWidth); } #if RENDER_HUD @@ -308,9 +308,9 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // need to apply scale factors depending on the mode // 4J Stu - Moved this push and scale further up as we still need to do it for the few HUD components not replaced by xui - //glPushMatrix(); + //glPushMatrix(); //glScalef(fScaleFactorWidth, fScaleFactorHeight, fScaleFactorWidth); - + // 4J-PB - move into the safe zone, and account for 2 player splitscreen blit(iWidthOffset + (screenWidth - quickSelectWidth)/2, iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset , 0, 0, 182, 22); blit(iWidthOffset + (screenWidth - quickSelectWidth)/2 - 1 + inventory->selected * 20, iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset - 1, 0, 22, 24, 22); @@ -358,13 +358,13 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) int food = foodData->getFoodLevel(); int oldFood = foodData->getLastFoodLevel(); -// if (false) //(true) +// if (false) //(true) // { // renderBossHealth(); // } ///////////////////////////////////////////////////////////////////////////////////// - // Display the experience, food, armour, health and the air bubbles + // Display the experience, food, armour, health and the air bubbles ///////////////////////////////////////////////////////////////////////////////////// if(bDisplayGui) { @@ -451,7 +451,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) if (blink) bg = 1; int xo = xLeft + i * 8; int yo = yLine1; - + if (iHealth <= 4) { yo += random->nextInt(2); @@ -538,12 +538,12 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) glEnable(GL_RESCALE_NORMAL); Lighting::turnOnGui(); - + int x,y; for (int i = 0; i < 9; i++) - { + { if(bTwoPlayerSplitscreen) { x = iWidthOffset + screenWidth / 2 - 9 * 10 + i * 20 + 2; @@ -580,11 +580,11 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) else if( minecraft->player->isSprinting() ) { characterDisplayTimer[iPad] = 30; - } + } else if( minecraft->player->abilities.flying) { characterDisplayTimer[iPad] = 5; // quickly get rid of the player display if they stop flying - } + } else if( characterDisplayTimer[iPad] > 0 ) { --characterDisplayTimer[iPad]; @@ -670,7 +670,7 @@ 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); EntityRenderDispatcher::instance->playerRotY = 180; EntityRenderDispatcher::instance->isGuiRender = true; @@ -712,7 +712,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) { y-=13; } - + if(bTwoPlayerSplitscreen) { y+=iHeightOffset; @@ -784,7 +784,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) glPushMatrix(); if (Minecraft::warezTime > 0) glTranslatef(0, 32, 0); font->drawShadow(ClientConstants::VERSION_STRING + L" (" + minecraft->fpsString + L")", iSafezoneXHalf+2, 20, 0xffffff); - font->drawShadow(L"Seed: " + _toString(minecraft->level->getLevelData()->getSeed() ), iSafezoneXHalf+2, 32 + 00, 0xffffff); + font->drawShadow(L"Seed: " + _toString<__int64>(minecraft->level->getLevelData()->getSeed() ), iSafezoneXHalf+2, 32 + 00, 0xffffff); font->drawShadow(minecraft->gatherStats1(), iSafezoneXHalf+2, 32 + 10, 0xffffff); font->drawShadow(minecraft->gatherStats2(), iSafezoneXHalf+2, 32 + 20, 0xffffff); font->drawShadow(minecraft->gatherStats3(), iSafezoneXHalf+2, 32 + 30, 0xffffff); @@ -866,7 +866,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) float t = overlayMessageTime - a; int alpha = (int) (t * 256 / 20); if (alpha > 255) alpha = 255; - if (alpha > 0) + if (alpha > 0) { glPushMatrix(); @@ -893,7 +893,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) } } #endif - + unsigned int max = 10; bool isChatting = false; if (dynamic_cast(minecraft->screen) != NULL) @@ -1026,35 +1026,35 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // void Gui::renderBossHealth(void) // { // if (EnderDragonRenderer::bossInstance == NULL) return; -// +// // shared_ptr boss = EnderDragonRenderer::bossInstance; // EnderDragonRenderer::bossInstance = NULL; -// +// // Minecraft *pMinecraft=Minecraft::GetInstance(); -// +// // Font *font = pMinecraft->font; -// +// // ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); // int screenWidth = ssc.getWidth(); -// +// // int w = 182; // int xLeft = screenWidth / 2 - w / 2; -// +// // int progress = (int) (boss->getSynchedHealth() / (float) boss->getMaxHealth() * (float) (w + 1)); -// +// // int yo = 12; // blit(xLeft, yo, 0, 74, w, 5); // blit(xLeft, yo, 0, 74, w, 5); -// if (progress > 0) +// if (progress > 0) // { // blit(xLeft, yo, 0, 79, progress, 5); // } -// +// // wstring msg = L"Boss health - NON LOCALISED"; // font->drawShadow(msg, screenWidth / 2 - font->width(msg) / 2, yo - 10, 0xff00ff); // glColor4f(1, 1, 1, 1); // glBindTexture(GL_TEXTURE_2D, pMinecraft->textures->loadTexture(TN_GUI_ICONS) );//"/gui/icons.png")); -// +// // } void Gui::renderPumpkin(int w, int h) @@ -1081,7 +1081,7 @@ void Gui::renderPumpkin(int w, int h) glColor4f(1, 1, 1, 1); } - + void Gui::renderVignette(float br, int w, int h) { br = 1 - br; @@ -1126,7 +1126,7 @@ void Gui::renderTp(float br, int w, int h) MemSect(31); minecraft->textures->bindTexture(TN_TERRAIN);//L"/terrain.png")); MemSect(0); - + Icon *slot = Tile::portalTile->getTexture(Facing::UP); float u0 = slot->getU0(); float v0 = slot->getV0(); @@ -1178,7 +1178,7 @@ void Gui::tick() tickCount++; for(int iPad=0;iPadheight; // This causes us to cover xScale*dataLength pixels in the horizontal @@ -1430,12 +1430,12 @@ void Gui::renderGraph(int dataLength, int dataPos, int64_t *dataA, float dataASc t->color(0xff000000 + cc * 256); } - int64_t aVal = dataA[i] / dataAScale; + __int64 aVal = dataA[i] / dataAScale; t->vertex((float)(xScale*i + 0.5f), (float)( height - aVal + 0.5f), (float)( 0)); t->vertex((float)(xScale*i + 0.5f), (float)( height + 0.5f), (float)( 0)); } - + if( dataB != NULL ) { if (dataB[i]>dataBWarning) @@ -1447,7 +1447,7 @@ void Gui::renderGraph(int dataLength, int dataPos, int64_t *dataA, float dataASc t->color(0xff808080 + cc/2 * 256); } - int64_t bVal = dataB[i] / dataBScale; + __int64 bVal = dataB[i] / dataBScale; t->vertex((float)(xScale*i + (xScale - 1) + 0.5f), (float)( height - bVal + 0.5f), (float)( 0)); t->vertex((float)(xScale*i + (xScale - 1) + 0.5f), (float)( height + 0.5f), (float)( 0)); @@ -1458,7 +1458,7 @@ void Gui::renderGraph(int dataLength, int dataPos, int64_t *dataA, float dataASc glEnable(GL_TEXTURE_2D); } -void Gui::renderStackedGraph(int dataPos, int dataLength, int dataSources, int64_t (*func)(unsigned int dataPos, unsigned int dataSource) ) +void Gui::renderStackedGraph(int dataPos, int dataLength, int dataSources, __int64 (*func)(unsigned int dataPos, unsigned int dataSource) ) { int height = minecraft->height; @@ -1475,8 +1475,8 @@ void Gui::renderStackedGraph(int dataPos, int dataLength, int dataSources, int64 Tesselator *t = Tesselator::getInstance(); t->begin(GL_LINES); - int64_t thisVal = 0; - int64_t topVal = 0; + __int64 thisVal = 0; + __int64 topVal = 0; for (int i = 0; i < dataLength; i++) { thisVal = 0; diff --git a/Minecraft.Client/Gui.h b/Minecraft.Client/Gui.h index 269e51a9..41762016 100644 --- a/Minecraft.Client/Gui.h +++ b/Minecraft.Client/Gui.h @@ -63,6 +63,6 @@ public: float getJukeboxOpacity(int iPad); // 4J Added - void renderGraph(int dataLength, int dataPos, int64_t *dataA, float dataAScale, int dataAWarning, int64_t *dataB, float dataBScale, int dataBWarning); - void renderStackedGraph(int dataPos, int dataLength, int dataSources, int64_t (*func)(unsigned int dataPos, unsigned int dataSource) ); + void renderGraph(int dataLength, int dataPos, __int64 *dataA, float dataAScale, int dataAWarning, __int64 *dataB, float dataBScale, int dataBWarning); + void renderStackedGraph(int dataPos, int dataLength, int dataSources, __int64 (*func)(unsigned int dataPos, unsigned int dataSource) ); }; diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index 917fa9f3..98360078 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -454,7 +454,7 @@ void LevelRenderer::allChanged(int playerIndex) zMaxChunk = zChunks; // 4J removed - we now only fully clear this on exiting the game (setting level to NULL). Apart from that, the chunk rebuilding is responsible for maintaining this - // renderableTileEntities.clear(); + // renderableTileEntities.clear(); for (int x = 0; x < xChunks; x++) { @@ -565,7 +565,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); it2++) { - TileEntityRenderDispatcher::instance->render(*it2, a); + TileEntityRenderDispatcher::instance->render(*it2, a); } } @@ -895,7 +895,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) } -void LevelRenderer::renderSameAsLast(int layer, double alpha) +void LevelRenderer::renderSameAsLast(int layer, double alpha) { for (int i = 0; i < RENDERLISTS_LENGTH; i++) { @@ -1127,7 +1127,7 @@ void LevelRenderer::renderSky(float alpha) glPopMatrix(); // 4J - can't work out what this big black box is for. Taking it out until someone misses it... it causes a big black box to visible appear in 3rd person mode whilst under the ground. -#if 0 +#if 0 float ss = 1; float yo = -(float) (yy + 65); float y0 = -ss; @@ -1200,7 +1200,7 @@ void LevelRenderer::renderHaloRing(float alpha) // Rough lumninance calculation float Y = (sr+sr+sb+sg+sg+sg)/6; - float br = 0.6f + (Y*0.4f); + float br = 0.6f + (Y*0.4f); //app.DebugPrintf("Luminance = %f, brightness = %f\n", Y, br); glColor3f(br,br,br); @@ -1369,7 +1369,7 @@ void LevelRenderer::createCloudMesh() t->vertexUV(x0, y0, z0, u, v ); t->vertexUV(x1, y0, z0, u, v ); t->vertexUV(x1, y0, z1, u, v ); - t->vertexUV(x0, y0, z1, u, v ); + t->vertexUV(x0, y0, z1, u, v ); } } t->end(); @@ -1469,7 +1469,7 @@ void LevelRenderer::createCloudMesh() t->vertexUV(x0, y1, z0, u, v ); t->vertexUV(x1, y1, z0, u, v ); t->vertexUV(x1, y0, z0, u, v ); - t->vertexUV(x0, y0, z0, u, v ); + t->vertexUV(x0, y0, z0, u, v ); } } t->end(); @@ -1491,10 +1491,10 @@ void LevelRenderer::createCloudMesh() float z1 = z0 + 1.0f; t->color(0.8f, 0.8f, 0.8f, 0.8f); t->normal(1, 0, 0); - t->vertexUV(x0, y0, z1, u, v ); + t->vertexUV(x0, y0, z1, u, v ); t->vertexUV(x1, y0, z1, u, v ); t->vertexUV(x1, y1, z1, u, v ); - t->vertexUV(x0, y1, z1, u, v ); + t->vertexUV(x0, y1, z1, u, v ); } } t->end(); @@ -1773,7 +1773,7 @@ void LevelRenderer::renderAdvancedClouds(float alpha) t->end(); #endif } - } + } } glColor4f(1, 1, 1, 1.0f); @@ -1910,14 +1910,14 @@ bool LevelRenderer::updateDirtyChunks() { // 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 shared_ptr it should live as long as we need it - shared_ptr player = mc->localplayers[p]; + shared_ptr player = mc->localplayers[p]; if( player == NULL ) continue; if( chunks[p].data == NULL ) continue; if( level[p] == NULL ) continue; if( chunks[p].length != 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; // app.DebugPrintf("!! %d %d %d, %d %d %d {%d,%d} ",px,py,pz,stackChunkDirty,nonStackChunkDirty,onlyRebuild, xChunks, zChunks); @@ -1932,7 +1932,7 @@ bool LevelRenderer::updateDirtyChunks() ClipChunk *pClipChunk = &chunks[p][(z * yChunks + y) * xChunks + x]; // 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 @@ -1974,7 +1974,7 @@ bool LevelRenderer::updateDirtyChunks() // emptiness without actually testing as many data items as uncompressed data would. Chunk *chunk = pClipChunk->chunk; LevelChunk *lc = level[p]->getChunkAt(chunk->x,chunk->z); - if( !lc->isRenderChunkEmpty(y * 16) ) + if( !lc->isRenderChunkEmpty(y * 16) ) { nearChunk = pClipChunk; minDistSq = distSqWeighted; @@ -2014,7 +2014,7 @@ bool LevelRenderer::updateDirtyChunks() PIXEndNamedEvent(); } - + Chunk *chunk = NULL; #ifdef _LARGE_WORLDS @@ -2058,21 +2058,21 @@ bool LevelRenderer::updateDirtyChunks() if((veryNearCount > 0)) bAtomic = true; //MGH - if veryNearCount, then we're trying to rebuild atomically, so do it all on the main thread - if( bAtomic || (index == 0) ) + if( bAtomic || (index == 0) ) { //PIXBeginNamedEvent(0,"Rebuilding near chunk %d %d %d",chunk->x, chunk->y, chunk->z); - // static int64_t totalTime = 0; - // static int64_t countTime = 0; - // int64_t startTime = System::currentTimeMillis(); + // static __int64 totalTime = 0; + // static __int64 countTime = 0; + // __int64 startTime = System::currentTimeMillis(); //app.DebugPrintf("Rebuilding permaChunk %d\n", index); - permaChunk[index].rebuild(); + permaChunk[index].rebuild(); - if(index !=0) + if(index !=0) s_rebuildCompleteEvents->Set(index-1); // MGH - this rebuild happening on the main thread instead, mark the thread it should have been running on as complete - // int64_t endTime = System::currentTimeMillis(); + // __int64 endTime = System::currentTimeMillis(); // totalTime += (endTime - startTime); // countTime++; // printf("%d : %f\n", countTime, (float)totalTime / (float)countTime); @@ -2111,11 +2111,11 @@ bool LevelRenderer::updateDirtyChunks() static Chunk permaChunk; permaChunk.makeCopyForRebuild(chunk); LeaveCriticalSection(&m_csDirtyChunks); - // static int64_t totalTime = 0; - // static int64_t countTime = 0; - // int64_t startTime = System::currentTimeMillis(); + // static __int64 totalTime = 0; + // static __int64 countTime = 0; + // __int64 startTime = System::currentTimeMillis(); permaChunk.rebuild(); - // int64_t endTime = System::currentTimeMillis(); + // __int64 endTime = System::currentTimeMillis(); // totalTime += (endTime - startTime); // countTime++; // printf("%d : %f\n", countTime, (float)totalTime / (float)countTime); @@ -2315,7 +2315,7 @@ void LevelRenderer::setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Lev { // 4J - level is passed if this is coming from setTilesDirty, which could come from when connection is being ticked outside of normal level tick, and player won't // be set up - if( level == NULL ) level = this->level[mc->player->GetXboxPad()]; + if( level == NULL ) level = this->level[mc->player->GetXboxPad()]; // EnterCriticalSection(&m_csDirtyChunks); int _x0 = Mth::intFloorDiv(x0, CHUNK_XZSIZE); int _y0 = Mth::intFloorDiv(y0, CHUNK_SIZE); @@ -2346,10 +2346,10 @@ void LevelRenderer::setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Lev // AP - by the time we reach this function the area passed in has a 1 block border added to it to make sure geometry and lighting is updated correctly. // Some of those blocks will only need lighting updated so it is acceptable to not have those blocks grouped in the deferral system as the mismatch - // will hardly be noticable. The blocks that need geometry updated will be adjacent to the original, non-bordered area. + // will hardly be noticable. The blocks that need geometry updated will be adjacent to the original, non-bordered area. // This bit of code will mark a chunk as 'non-critical' if all of the blocks inside it are NOT adjacent to the original area. This has the greatest effect // when digging a single block. Only 6 of the blocks out of the possible 26 are actually adjacent to the original block. The other 20 only need lighting updated. - // Note I have noticed a new side effect of this system where it's possible to see into the sides of water but this is acceptable compared to seeing through + // Note I have noticed a new side effect of this system where it's possible to see into the sides of water but this is acceptable compared to seeing through // the entire landscape. // is the left or right most block just inside this chunk if( ((x0 & 15) == 15 && x == _x0) || ((x1 & 15) == 0 && x == _x1) ) @@ -2376,7 +2376,7 @@ void LevelRenderer::setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Lev dirtyChunksLockFreeStack.Push((int *)(index)); #else - dirtyChunksLockFreeStack.Push((int *)(index + 2)); + dirtyChunksLockFreeStack.Push((int *)(index + 2)); #endif #ifdef _XBOX @@ -2489,7 +2489,7 @@ void LevelRenderer::cull_SPU(int playerIndex, Culler *culler, float a) m_jobPort_CullSPU->submitSync(); // static int doSort = false; // if(doSort) - { + { m_jobPort_CullSPU->submitJob(&sortJob); } // doSort ^= 1; @@ -2591,7 +2591,7 @@ void LevelRenderer::playSound(shared_ptr entity,int iSound, double x, do } // 4J-PB - original function. I've changed to an enum instead of string compares -// 4J removed - +// 4J removed - /* void LevelRenderer::addParticle(const wstring& name, double x, double y, double z, double xa, double ya, double za) { @@ -2751,7 +2751,7 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle float fStart=((float)(cStart&0xFF)); float fDiff=(float)((cEnd-cStart)&0xFF); - float fCol = (fStart + (Math::random() * fDiff))/255.0f; + float fCol = (fStart + (Math::random() * fDiff))/255.0f; particle->setColor( fCol, fCol, fCol ); } } @@ -2885,11 +2885,11 @@ void LevelRenderer::entityAdded(shared_ptr entity) //if (entity->customTextureUrl2 != L"") textures->addHttpTexture(entity->customTextureUrl2, new MobSkinTextureProcessor()); // 4J-PB - adding these from global title storage - if (entity->customTextureUrl != L"") + if (entity->customTextureUrl != L"") { textures->addMemTexture(entity->customTextureUrl, new MobSkinMemTextureProcessor()); } - if (entity->customTextureUrl2 != L"") + if (entity->customTextureUrl2 != L"") { textures->addMemTexture(entity->customTextureUrl2, new MobSkinMemTextureProcessor()); } @@ -2905,11 +2905,11 @@ void LevelRenderer::entityRemoved(shared_ptr entity) if (entity->customTextureUrl != L"") textures->removeHttpTexture(entity->customTextureUrl); if (entity->customTextureUrl2 != L"") textures->removeHttpTexture(entity->customTextureUrl2); */ - if (entity->customTextureUrl != L"") + if (entity->customTextureUrl != L"") { textures->removeMemTexture(entity->customTextureUrl); } - if (entity->customTextureUrl2 != L"") + if (entity->customTextureUrl2 != L"") { textures->removeMemTexture(entity->customTextureUrl2); } @@ -2944,7 +2944,7 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y { //case LevelEvent::SOUND_WITHER_BOSS_SPAWN: case LevelEvent::SOUND_DRAGON_DEATH: - if (mc->cameraTargetPlayer != NULL) + if (mc->cameraTargetPlayer != NULL) { // play the sound at an offset from the player double dx = x - mc->cameraTargetPlayer->x; @@ -2956,7 +2956,7 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y double sy = mc->cameraTargetPlayer->y; double sz = mc->cameraTargetPlayer->z; - if (len > 0) + if (len > 0) { sx += (dx / len) * 2; sy += (dy / len) * 2; @@ -3185,7 +3185,7 @@ void LevelRenderer::destroyTileProgress(int id, int x, int y, int z, int progres if (progress < 0 || progress >= 10) { AUTO_VAR(it, destroyingBlocks.find(id)); - if(it != destroyingBlocks.end()) + if(it != destroyingBlocks.end()) { delete it->second; destroyingBlocks.erase(it); @@ -3373,7 +3373,7 @@ unsigned char LevelRenderer::incGlobalChunkRefCount(int x, int y, int z, Level * unsigned char refCount = (flags >> CHUNK_FLAG_REF_SHIFT ) & CHUNK_FLAG_REF_MASK; refCount++; flags &= ~(CHUNK_FLAG_REF_MASK<boxes[j]->intersects( box ) ) { - boxes->push_back(AABB::newTemp( m_destroyedTiles[i]->boxes[j]->x0, + boxes->push_back(AABB::newTemp( m_destroyedTiles[i]->boxes[j]->x0, m_destroyedTiles[i]->boxes[j]->y0, m_destroyedTiles[i]->boxes[j]->z0, m_destroyedTiles[i]->boxes[j]->x1, diff --git a/Minecraft.Client/LevelRenderer.h b/Minecraft.Client/LevelRenderer.h index b2bd5eb2..c0a98bba 100644 --- a/Minecraft.Client/LevelRenderer.h +++ b/Minecraft.Client/LevelRenderer.h @@ -26,7 +26,7 @@ using namespace std; // AP - this is a system that works out which chunks actually need to be grouped together via the deferral system when doing chunk::rebuild. Doing this will reduce the number // of chunks built in a single group and reduce the chance of seeing through the landscape when digging near the edges/corners of a chunk. -// I've added another chunk flag to mark a chunk critical so it swipes a bit from the reference count value (goes to 3 bits to 2). This works on Vita because it doesn't have +// I've added another chunk flag to mark a chunk critical so it swipes a bit from the reference count value (goes to 3 bits to 2). This works on Vita because it doesn't have // split screen reference counting. #ifdef __PSVITA__ #define _CRITICAL_CHUNKS @@ -203,7 +203,7 @@ public: // 4J - added for new render list handling // This defines the maximum size of renderable level, must be big enough to cope with actual size of level + view distance at each side // so that we can render the "infinite" sea at the edges - static const int MAX_LEVEL_RENDER_SIZE[3]; + static const int MAX_LEVEL_RENDER_SIZE[3]; static const int DIMENSION_OFFSETS[3]; // This is the TOTAL area of columns of chunks to be allocated for render round the players. So for one player, it would be a region of // sqrt(PLAYER_RENDER_AREA) x sqrt(PLAYER_RENDER_AREA) @@ -258,7 +258,7 @@ public: XLockFreeStack dirtyChunksLockFreeStack; bool dirtyChunkPresent; - int64_t lastDirtyChunkFound; + __int64 lastDirtyChunkFound; static const int FORCE_DIRTY_CHUNK_CHECK_PERIOD_MS = 250; #ifdef _LARGE_WORLDS diff --git a/Minecraft.Client/LocalPlayer.h b/Minecraft.Client/LocalPlayer.h index 865af154..b1e8dd23 100644 --- a/Minecraft.Client/LocalPlayer.h +++ b/Minecraft.Client/LocalPlayer.h @@ -48,14 +48,14 @@ public: 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_t ullButtonsPressed; // Stores the button presses, since the inputmanager can be ticked faster than the minecraft + __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 - uint64_t ullDpad_last; - uint64_t ullDpad_this; - uint64_t ullDpad_filtered; + __uint64 ullDpad_last; + __uint64 ullDpad_this; + __uint64 ullDpad_filtered; // 4J-PB - moved these in from the minecraft structure, since they are per player things for splitscreen //int ticks; @@ -68,7 +68,7 @@ public: private: float flyX, flyY, flyZ; - + protected: // 4J-PB - player's xbox pad int m_iPad; diff --git a/Minecraft.Client/MinecartRenderer.cpp b/Minecraft.Client/MinecartRenderer.cpp index 1fa4a1d9..0cae8346 100644 --- a/Minecraft.Client/MinecartRenderer.cpp +++ b/Minecraft.Client/MinecartRenderer.cpp @@ -16,8 +16,8 @@ void MinecartRenderer::render(shared_ptr _cart, double x, double y, doub shared_ptr cart = dynamic_pointer_cast(_cart); glPushMatrix(); - - int64_t seed = cart->entityId * 493286711l; + + __int64 seed = cart->entityId * 493286711l; seed = seed * seed * 4392167121l + seed * 98761; float xo = ((((seed >> 16) & 0x7) + 0.5f) / 8.0f - 0.5f) * 0.004f; diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index aef61677..3192410d 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -77,15 +77,15 @@ //#define DEBUG_RENDER_SHOWS_PACKETS 1 //#define SPLITSCREEN_TEST -// If not disabled, this creates an event queue on a seperate thread so that the Level::tick calls can be offloaded +// If not disabled, this creates an event queue on a seperate thread so that the Level::tick calls can be offloaded // from the main thread, and have longer to run, since it's called at 20Hz instead of 60 #define DISABLE_LEVELTICK_THREAD Minecraft *Minecraft::m_instance = NULL; -int64_t Minecraft::frameTimes[512]; -int64_t Minecraft::tickTimes[512]; +__int64 Minecraft::frameTimes[512]; +__int64 Minecraft::tickTimes[512]; int Minecraft::frameTimePos = 0; -int64_t Minecraft::warezTime = 0; +__int64 Minecraft::warezTime = 0; File Minecraft::workDir = File(L""); #ifdef __PSVITA__ @@ -94,7 +94,7 @@ TOUCHSCREENRECT QuickSelectRect[3]= { { 560, 890, 1360, 980 }, { 450, 840, 1449, 960 }, - { 320, 840, 1600, 970 }, + { 320, 840, 1600, 970 }, }; int QuickSelectBoxWidth[3]= @@ -680,7 +680,7 @@ void Minecraft::run() return; } - int64_t lastTime = System::currentTimeMillis(); + __int64 lastTime = System::currentTimeMillis(); int frames = 0; while (running) @@ -705,7 +705,7 @@ void Minecraft::run() timer->advanceTime(); } - int64_t beforeTickTime = System::nanoTime(); + __int64 beforeTickTime = System::nanoTime(); for (int i = 0; i < timer->ticks; i++) { ticks++; @@ -717,7 +717,7 @@ void Minecraft::run() // setScreen(new LevelConflictScreen()); // } } - int64_t tickDuraction = System::nanoTime() - beforeTickTime; + __int64 tickDuraction = System::nanoTime() - beforeTickTime; checkGlError(L"Pre render"); TileRenderer::fancy = options->fancyGraphics; @@ -1272,7 +1272,7 @@ void Minecraft::applyFrameMouseLook() void Minecraft::run_middle() { - static int64_t lastTime = 0; + static __int64 lastTime = 0; static bool bFirstTimeIntoGame = true; static bool bAutosaveTimerSet=false; static unsigned int uiAutosaveTimer=0; @@ -1332,7 +1332,7 @@ void Minecraft::run_middle() if( pDLCPack ) { if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) - { + { bTrialTexturepack=true; } } @@ -1454,7 +1454,7 @@ void Minecraft::run_middle() { delete m_pPsPlusUpsell; m_pPsPlusUpsell = NULL; - + if ( ProfileManager.HasPlayStationPlus(i) ) { app.DebugPrintf(" Player_%i is now authorised for PsPlus.\n", i); @@ -1796,7 +1796,7 @@ void Minecraft::run_middle() timer->advanceTime(); } - //int64_t beforeTickTime = System::nanoTime(); + //__int64 beforeTickTime = System::nanoTime(); for (int i = 0; i < timer->ticks; i++) { bool bLastTimerTick = ( i == ( timer->ticks - 1 ) ); @@ -1882,7 +1882,7 @@ void Minecraft::run_middle() // CompressedTileStorage::tick(); // 4J added // SparseDataStorage::tick(); // 4J added } - //int64_t tickDuraction = System::nanoTime() - beforeTickTime; + //__int64 tickDuraction = System::nanoTime() - beforeTickTime; MemSect(31); checkGlError(L"Pre render"); MemSect(0); @@ -2084,14 +2084,14 @@ void Minecraft::emergencySave() setLevel(NULL); } -void Minecraft::renderFpsMeter(int64_t tickTime) +void Minecraft::renderFpsMeter(__int64 tickTime) { int nsPer60Fps = 1000000000l / 60; if (lastTimer == -1) { lastTimer = System::nanoTime(); } - int64_t now = System::nanoTime(); + __int64 now = System::nanoTime(); Minecraft::tickTimes[(Minecraft::frameTimePos) & (Minecraft::frameTimes_length - 1)] = tickTime; Minecraft::frameTimes[(Minecraft::frameTimePos++) & (Minecraft::frameTimes_length - 1)] = now - lastTimer; lastTimer = now; @@ -2123,7 +2123,7 @@ void Minecraft::renderFpsMeter(int64_t tickTime) t->vertex((float)(Minecraft::frameTimes_length), (float)( height - hh1 * 2), (float)( 0)); t->end(); - int64_t totalTime = 0; + __int64 totalTime = 0; for (int i = 0; i < Minecraft::frameTimes_length; i++) { totalTime += Minecraft::frameTimes[i]; @@ -2153,8 +2153,8 @@ void Minecraft::renderFpsMeter(int64_t tickTime) t->color(0xff000000 + cc * 256); } - int64_t time = Minecraft::frameTimes[i] / 200000; - int64_t time2 = Minecraft::tickTimes[i] / 200000; + __int64 time = Minecraft::frameTimes[i] / 200000; + __int64 time2 = Minecraft::tickTimes[i] / 200000; t->vertex((float)(i + 0.5f), (float)( height - time + 0.5f), (float)( 0)); t->vertex((float)(i + 0.5f), (float)( height + 0.5f), (float)( 0)); @@ -2234,7 +2234,7 @@ void Minecraft::levelTickThreadInitFunc() { AABB::CreateNewThreadStorage(); Vec3::CreateNewThreadStorage(); - IntCache::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); Compression::UseDefaultThreadStorage(); } @@ -2863,7 +2863,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piUse=IDS_TOOLTIPS_MILK; 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; @@ -3136,7 +3136,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - + 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 @@ -3153,7 +3153,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } else { - *piUse=IDS_TOOLTIPS_FEED; + *piUse=IDS_TOOLTIPS_FEED; } } @@ -3182,9 +3182,9 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } } } - + break; - + case eTYPE_PLAYER: { // Fix for #58576 - TU6: Content: Gameplay: Hit button prompt is available when attacking a host who has "Invisible" option turned on @@ -3230,7 +3230,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } *piAction=IDS_TOOLTIPS_HIT; } - break; + break; case eTYPE_ZOMBIE: { shared_ptr zomb = dynamic_pointer_cast(hitResult->entity); @@ -3483,7 +3483,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) player->abilities.debugflying = !player->abilities.debugflying; player->abilities.flying = !player->abilities.flying; } -#endif // PSVITA +#endif // PSVITA } #endif @@ -3551,8 +3551,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) player->drop(); } - uint64_t ullButtonsPressed=player->ullButtonsPressed; - + __uint64 ullButtonsPressed=player->ullButtonsPressed; + bool selected = false; #ifdef __PSVITA__ // 4J-PB - use the touchscreen for quickselect @@ -3576,7 +3576,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) 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; - + if(selectedItem != NULL) iCount=selectedItem->GetCount(); if(selectedItem != NULL && !( (player->ullButtonsPressed&(1LL<GetCount() == 1)) { @@ -3885,7 +3885,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } #ifdef __PS3__ -// while(!g_tickLevelQueue.empty()) +// while(!g_tickLevelQueue.empty()) // { // Level* pLevel = g_tickLevelQueue.front(); // g_tickLevelQueue.pop(); @@ -4113,7 +4113,7 @@ void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_pt player->resetPos(); gameMode->initPlayer(player); - + player->SetXboxPad(iPrimaryPlayer); for(int i=0;i(System::currentTimeMillis() % 1000); + name = L"Player" + _toString<__int64>(System::currentTimeMillis() % 1000); sessionId = L"-"; /* 4J - TODO - get a session ID from somewhere? if (args.length > 0) name = args[0]; @@ -4647,7 +4647,7 @@ void Minecraft::delayTextureReload() reloadTextures = true; } -int64_t Minecraft::currentTimeMillis() +__int64 Minecraft::currentTimeMillis() { return System::currentTimeMillis();//(Sys.getTime() * 1000) / Sys.getTimerResolution(); } @@ -5018,8 +5018,8 @@ int Minecraft::MustSignInReturnedPSN(void *pParam, int iPad, C4JStorage::EMessag { Minecraft* pMinecraft = (Minecraft *)pParam; - if(result == C4JStorage::EMessage_ResultAccept) - { + if(result == C4JStorage::EMessage_ResultAccept) + { SQRNetworkManager_Orbis::AttemptPSNSignIn(&Minecraft::InGame_SignInReturned, pMinecraft, false, iPad); } diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/Minecraft.h index 2e943de7..caec4702 100644 --- a/Minecraft.Client/Minecraft.h +++ b/Minecraft.Client/Minecraft.h @@ -71,7 +71,7 @@ private: bool hasCrashed; C4JThread::EventQueue* levelTickEventQueue; - + static void levelTickUpdateFunc(void* pParam); static void levelTickThreadInitFunc(); @@ -165,11 +165,11 @@ private: LevelStorageSource *levelSource; public: static const int frameTimes_length = 512; - static int64_t frameTimes[frameTimes_length]; + static __int64 frameTimes[frameTimes_length]; static const int tickTimes_length = 512; - static int64_t tickTimes[tickTimes_length]; + static __int64 tickTimes[tickTimes_length]; static int frameTimePos; - static int64_t warezTime; + static __int64 warezTime; private: int rightClickDelay; public: @@ -230,9 +230,9 @@ private: // String grabHugeScreenshot(File workDir2, int width, int height, int ssWidth, int ssHeight); // 4J - removed // 4J - per player thing? - int64_t lastTimer; + __int64 lastTimer; - void renderFpsMeter(int64_t tickTime); + void renderFpsMeter(__int64 tickTime); public: void stop(); // 4J removed @@ -253,7 +253,7 @@ public: //bool isRaining ; // 4J - Moved to per player - //int64_t lastTickTime; + //__int64 lastTickTime; private: // 4J- per player? @@ -301,7 +301,7 @@ public: static int maxSupportedTextureSize(); void delayTextureReload(); - static int64_t currentTimeMillis(); + static __int64 currentTimeMillis(); #ifdef _DURANGO static void inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index a57b798b..ceb9554b 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -54,9 +54,9 @@ //4J Added MinecraftServer *MinecraftServer::server = NULL; bool MinecraftServer::setTimeAtEndOfTick = false; -int64_t MinecraftServer::setTime = 0; +__int64 MinecraftServer::setTime = 0; bool MinecraftServer::setTimeOfDayAtEndOfTick = false; -int64_t MinecraftServer::setTimeOfDay = 0; +__int64 MinecraftServer::setTimeOfDay = 0; bool MinecraftServer::m_bPrimaryPlayerSignedOut=false; bool MinecraftServer::s_bServerHalted=false; bool MinecraftServer::s_bSaveOnExitAnswered=false; @@ -99,7 +99,7 @@ MinecraftServer::~MinecraftServer() { } -bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed) +bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed) { // 4J - removed #if 0 @@ -149,7 +149,7 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW //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('�', '$'); + //motd.replace('§', '$'); setAnimals(settings->getBoolean(L"spawn-animals", true)); setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); @@ -201,7 +201,7 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW // TODO: Stop loading, add error message. } - int64_t levelNanoTime = System::nanoTime(); + __int64 levelNanoTime = System::nanoTime(); wstring levelName = settings->getString(L"level-name", L"world"); wstring levelTypeString; @@ -221,7 +221,7 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW } LevelType *pLevelType = LevelType::getLevelType(levelTypeString); - if (pLevelType == NULL) + if (pLevelType == NULL) { pLevelType = LevelType::lvl_normal; } @@ -245,10 +245,10 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW #if 0 wstring levelSeedString = settings->getString(L"level-seed", L""); - int64_t levelSeed = (new Random())->nextLong(); + __int64 levelSeed = (new Random())->nextLong(); if (levelSeedString.length() > 0) { - long newSeed = _fromString(levelSeedString); + long newSeed = _fromString<__int64>(levelSeedString); if (newSeed != 0) { levelSeed = newSeed; } @@ -280,7 +280,7 @@ int MinecraftServer::runPostUpdate(void* lpParam) Entity::useSmallIds(); // This thread can end up spawning entities as resources IntCache::CreateNewThreadStorage(); AABB::CreateNewThreadStorage(); - Vec3::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); Compression::UseDefaultThreadStorage(); Level::enableLightingCache(); Tile::CreateNewThreadStorage(); @@ -375,7 +375,7 @@ void MinecraftServer::postProcessTerminate(ProgressRenderer *mcprogress) DeleteCriticalSection(&m_postProcessCS); } -bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring& name, int64_t levelSeed, LevelType *pLevelType, NetworkGameInitData *initData) +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)) @@ -401,10 +401,10 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring { // We are loading a file from disk with the data passed in -#ifdef SPLIT_SAVES +#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 ); @@ -445,7 +445,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring } // McRegionLevelStorage *storage = new McRegionLevelStorage(new ConsoleSaveFile( L"" ), L"", L"", 0); // original -// McRegionLevelStorage *storage = new McRegionLevelStorage(File(L"."), name, true); // TODO +// McRegionLevelStorage *storage = new McRegionLevelStorage(File(L"."), name, true); // TODO for (unsigned int i = 0; i < levels.length; i++) { if( s_bServerHalted || !g_NetworkManager.IsInSession() ) @@ -518,13 +518,13 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring m_postUpdateThread->SetPriority(THREAD_PRIORITY_ABOVE_NORMAL); m_postUpdateThread->Run(); - int64_t startTime = System::currentTimeMillis(); + __int64 startTime = System::currentTimeMillis(); // 4J Stu - Added this to temporarily make starting games on vita faster #ifdef __PSVITA__ int r = 48; #else - int r = 196; + int r = 196; #endif // 4J JEV: load gameRules. @@ -548,7 +548,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring csf->closeHandle(fe); } - int64_t lastTime = System::currentTimeMillis(); + __int64 lastTime = System::currentTimeMillis(); // 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; @@ -564,7 +564,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring } #if 0 - int64_t lastStorageTickTime = System::currentTimeMillis(); + __int64 lastStorageTickTime = System::currentTimeMillis(); // Test code to enable full creation of levels at start up int halfsidelen = ( i == 0 ) ? 27 : 9; @@ -587,7 +587,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring } } #else - int64_t lastStorageTickTime = System::currentTimeMillis(); + __int64 lastStorageTickTime = System::currentTimeMillis(); Pos *spawnPos = level->getSharedSpawnPos(); int twoRPlusOne = r*2 + 1; @@ -604,7 +604,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring return false; } // printf(">>>%d %d %d\n",i,x,z); -// int64_t now = System::currentTimeMillis(); +// __int64 now = System::currentTimeMillis(); // if (now < lastTime) lastTime = now; // if (now > lastTime + 1000) { @@ -663,7 +663,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring if(!levels[0]->getLevelData()->getHasStronghold()) { - int x,z; + int x,z; if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) { levels[0]->getLevelData()->setXStronghold(x); @@ -691,7 +691,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring // 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 +710,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); @@ -819,7 +819,7 @@ void MinecraftServer::Suspend() // Save the start time QueryPerformanceCounter( &qwTime ); if(m_bLoaded && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled())) - { + { if (players != NULL) { players->saveAll(NULL); @@ -879,7 +879,7 @@ void MinecraftServer::stopServer() app.DebugPrintf("Stopping server\n"); // 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 @@ -894,7 +894,7 @@ void MinecraftServer::stopServer() #endif // if trial version or saving is disabled, then don't save anything if(m_saveOnExit && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled())) - { + { if (players != NULL) { players->saveAll(Minecraft::GetInstance()->progressRenderer, true); @@ -1044,7 +1044,7 @@ CommandDispatcher *MinecraftServer::getCommandDispatcher() } extern int c0a, c0b, c1a, c1b, c1c, c2a, c2b; -void MinecraftServer::run(int64_t seed, void *lpParameter) +void MinecraftServer::run(__int64 seed, void *lpParameter) { NetworkGameInitData *initData = NULL; DWORD initSettings = 0; @@ -1066,7 +1066,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) if(pLevelData && pLevelData->getHasStronghold()==false) { - int x,z; + int x,z; if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) { pLevelData->setXStronghold(x); @@ -1075,18 +1075,18 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) } } - int64_t lastTime = System::currentTimeMillis(); - int64_t unprocessedTime = 0; + __int64 lastTime = System::currentTimeMillis(); + __int64 unprocessedTime = 0; while (running && !s_bServerHalted) { - int64_t now = System::currentTimeMillis(); + __int64 now = System::currentTimeMillis(); // 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_t passedTime = now - lastTime; + __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?"); @@ -1112,13 +1112,13 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) else { // int tickcount = 0; -// int64_t beforeall = System::currentTimeMillis(); +// __int64 beforeall = System::currentTimeMillis(); while (unprocessedTime > MS_PER_TICK) { unprocessedTime -= MS_PER_TICK; -// int64_t before = System::currentTimeMillis(); +// __int64 before = System::currentTimeMillis(); tick(); -// int64_t after = System::currentTimeMillis(); +// __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 @@ -1135,7 +1135,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) // app.DebugPrintf("Not considering cycling: %d - %d -> %d > %d\n",time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); // } } -// int64_t afterall = System::currentTimeMillis(); +// __int64 afterall = System::currentTimeMillis(); // PIXReportCounter(L"Server time all",(float)(afterall-beforeall)); // PIXReportCounter(L"Server ticks",(float)tickcount); } @@ -1179,7 +1179,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) } } - // Process delayed actions + // Process delayed actions eXuiServerAction eAction; LPVOID param; for(int i=0;isaveAll(Minecraft::GetInstance()->progressRenderer); } - + players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); for (unsigned int j = 0; j < levels.length; j++) @@ -1255,14 +1255,14 @@ void MinecraftServer::run(int64_t 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 ) { saveGameRules(); - levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); + levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); } app.LeaveSaveNotificationSection(); break; @@ -1287,19 +1287,19 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) case eXuiServerAction_PauseServer: m_isServerPaused = ( (size_t) param == TRUE ); if( m_isServerPaused ) - { + { m_serverPausedEvent->Set(); } break; case eXuiServerAction_ToggleRain: - { + { bool isRaining = levels[0]->getLevelData()->isRaining(); levels[0]->getLevelData()->setRaining(!isRaining); levels[0]->getLevelData()->setRainTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); } break; case eXuiServerAction_ToggleThunder: - { + { bool isThundering = levels[0]->getLevelData()->isThundering(); levels[0]->getLevelData()->setThundering(!isThundering); levels[0]->getLevelData()->setThunderTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); @@ -1318,7 +1318,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) case eXuiServerAction_ExportSchematic: #ifndef _CONTENT_PACKAGE app.EnterSaveNotificationSection(); - + //players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); if( !s_bServerHalted ) @@ -1337,7 +1337,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) File dataFile = File( targetFileDir, wstring(filename) ); if(dataFile.exists()) dataFile._delete(); FileOutputStream fos = FileOutputStream(dataFile); - DataOutputStream dos = DataOutputStream(&fos); + DataOutputStream dos = DataOutputStream(&fos); ConsoleSchematicFile::generateSchematicFile(&dos, levels[0], initData->startX, initData->startY, initData->startZ, initData->endX, initData->endY, initData->endZ, initData->bSaveMobs, initData->compressionType); dos.close(); @@ -1354,7 +1354,7 @@ void MinecraftServer::run(int64_t 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_yRot, pos->m_elev ); shared_ptr player = players->players.at(pos->player); @@ -1368,7 +1368,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) #endif break; } - + app.SetXuiServerAction(i,eXuiServerAction_Idle); } @@ -1447,7 +1447,7 @@ void MinecraftServer::tick() AABB::resetPool(); Vec3::resetPool(); - + tickCount++; // 4J We need to update client difficulty levels based on the servers @@ -1479,11 +1479,11 @@ void MinecraftServer::tick() players->broadcastAll( shared_ptr( new SetTimePacket(level->getTime() ) ), level->dimension->id); } // #ifndef __PS3__ - static int64_t stc = 0; - int64_t st0 = System::currentTimeMillis(); + static __int64 stc = 0; + __int64 st0 = System::currentTimeMillis(); PIXBeginNamedEvent(0,"Level tick %d",i); ((Level *)level)->tick(); - int64_t st1 = System::currentTimeMillis(); + __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...) @@ -1491,7 +1491,7 @@ void MinecraftServer::tick() // printf("lights: %d\n",level->getLightsToUpdate()); while(level->updateLights() ) ; - int64_t st2 = System::currentTimeMillis(); + __int64 st2 = System::currentTimeMillis(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Entity tick %d",i); // 4J added to stop ticking entities in levels when players are not in those levels. @@ -1519,7 +1519,7 @@ void MinecraftServer::tick() level->getTracker()->tick(); PIXEndNamedEvent(); - int64_t st3 = System::currentTimeMillis(); + __int64 st3 = System::currentTimeMillis(); // printf(">>>>>>>>>>>>>>>>>>>>>> Tick %d %d %d : %d\n", st1 - st0, st2 - st1, st3 - st2, st0 - stc ); stc = st0; // #endif// __PS3__ @@ -1564,7 +1564,7 @@ void MinecraftServer::handleConsoleInputs() } } -void MinecraftServer::main(int64_t seed, void *lpParameter) +void MinecraftServer::main(__int64 seed, void *lpParameter) { #if __PS3__ ShutdownManager::HasStarted(ShutdownManager::eServerThread ); diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h index f63aeb0b..e61001a3 100644 --- a/Minecraft.Client/MinecraftServer.h +++ b/Minecraft.Client/MinecraftServer.h @@ -23,14 +23,14 @@ class CommandDispatcher; typedef struct _LoadSaveDataThreadParam { LPVOID data; - int64_t fileSize; + __int64 fileSize; const wstring saveName; - _LoadSaveDataThreadParam(LPVOID data, int64_t filesize, const wstring &saveName) : data( data ), fileSize( filesize ), saveName( saveName ) {} + _LoadSaveDataThreadParam(LPVOID data, __int64 filesize, const wstring &saveName) : data( data ), fileSize( filesize ), saveName( saveName ) {} } LoadSaveDataThreadParam; typedef struct _NetworkGameInitData { - int64_t seed; + __int64 seed; LoadSaveDataThreadParam *saveData; DWORD settings; LevelGenerationOptions *levelGen; @@ -125,9 +125,9 @@ public: ~MinecraftServer(); private: // 4J Added - LoadSaveDataThreadParam - bool initServer(int64_t seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed); + bool initServer(__int64 seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed); void postProcessTerminate(ProgressRenderer *mcprogress); - bool loadLevel(LevelStorageSource *storageSource, const wstring& name, int64_t levelSeed, LevelType *pLevelType, NetworkGameInitData *initData); + bool loadLevel(LevelStorageSource *storageSource, const wstring& name, __int64 levelSeed, LevelType *pLevelType, NetworkGameInitData *initData); void setProgress(const wstring& status, int progress); void endProgress(); void saveAllChunks(); @@ -154,7 +154,7 @@ public: public: void halt(); - void run(int64_t seed, void *lpParameter); + void run(__int64 seed, void *lpParameter); void broadcastStartSavingPacket(); void broadcastStopSavingPacket(); @@ -165,7 +165,7 @@ public: void handleConsoleInput(const wstring& msg, ConsoleInputSource *source); void handleConsoleInputs(); // void addTickable(Tickable tickable); // 4J removed - static void main(int64_t seed, void *lpParameter); + static void main(__int64 seed, void *lpParameter); static void HaltServer(bool bPrimaryPlayerSignedOut=false); File *getFile(const wstring& name); @@ -185,9 +185,9 @@ private: static MinecraftServer *server; static bool setTimeOfDayAtEndOfTick; - static int64_t setTimeOfDay; + static __int64 setTimeOfDay; static bool setTimeAtEndOfTick; - static int64_t setTime; + static __int64 setTime; static bool m_bPrimaryPlayerSignedOut; // 4J-PB added to tell the stopserver not to save the game - another player may have signed in in their place, so ProfileManager.IsSignedIn isn't enough static bool s_bServerHalted; // 4J Stu Added so that we can halt the server even before it's been created properly @@ -211,9 +211,9 @@ public: public: static PlayerList *getPlayerList() { if( server != NULL ) return server->players; else return NULL; } - static void SetTimeOfDay(int64_t time) { setTimeOfDayAtEndOfTick = true; setTimeOfDay = time; } - static void SetTime(int64_t time) { setTimeAtEndOfTick = true; setTime = time; } - + static void SetTimeOfDay(__int64 time) { setTimeOfDayAtEndOfTick = true; setTimeOfDay = time; } + static void SetTime(__int64 time) { setTimeAtEndOfTick = true; setTime = time; } + C4JThread::Event* m_serverPausedEvent; private: // 4J Added @@ -241,5 +241,5 @@ public: void Suspend(); bool IsSuspending(); - // 4J Stu - A load of functions were all added in 1.0.1 in the ServerInterface, but I don't think we need any of them + // 4J Stu - A load of functions were all added in 1.0.1 in the ServerInterface, but I don't think we need any of them }; diff --git a/Minecraft.Client/Orbis/Iggy/include/rrCore.h b/Minecraft.Client/Orbis/Iggy/include/rrCore.h index e72c3466..e88b5f8c 100644 --- a/Minecraft.Client/Orbis/Iggy/include/rrCore.h +++ b/Minecraft.Client/Orbis/Iggy/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed int64_t - #define RAD_UINTa __w64 uint64_t + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/Orbis/Miles/include/mss.h b/Minecraft.Client/Orbis/Miles/include/mss.h index 754f536b..531dcbc9 100644 --- a/Minecraft.Client/Orbis/Miles/include/mss.h +++ b/Minecraft.Client/Orbis/Miles/include/mss.h @@ -39,7 +39,7 @@ // doc system stuff #ifndef EXPAPI -#define EXPAPI +#define EXPAPI #endif #ifndef EXPTYPE #define EXPTYPE @@ -69,10 +69,10 @@ // For docs EXPGROUP(_NullGroup) #define MilesVersion "9.3m" EXPMACRO -#define MilesMajorVersion 9 EXPMACRO +#define MilesMajorVersion 9 EXPMACRO #define MilesMinorVersion 3 EXPMACRO -#define MilesBuildNumber 11 EXPMACRO -#define MilesCustomization 0 EXPMACRO +#define MilesBuildNumber 11 EXPMACRO +#define MilesCustomization 0 EXPMACRO EXPGROUP(_RootGroup) @@ -273,14 +273,14 @@ typedef void VOIDFUNC(void); //================ EXPGROUP(Basic Types) -#define AILCALL EXPTAG(AILCALL) +#define AILCALL EXPTAG(AILCALL) /* Internal calling convention that all external Miles functions use. Usually cdecl or stdcall on Windows. */ -#define AILCALLBACK EXPTAG(AILCALLBACK docproto) +#define AILCALLBACK EXPTAG(AILCALLBACK docproto) /* Calling convention that user supplied callbacks from Miles use. @@ -326,7 +326,7 @@ RADDEFSTART typedef CHAR *LPSTR, *PSTR; #ifdef IS_WIN64 - typedef uint64_t ULONG_PTR, *PULONG_PTR; + typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; #else #ifdef _Wp64 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 @@ -348,13 +348,13 @@ RADDEFSTART typedef struct HWAVEOUT__ *HWAVEOUT; typedef HWAVEIN *LPHWAVEIN; typedef HWAVEOUT *LPHWAVEOUT; - + #ifndef WAVE_MAPPER #define WAVE_MAPPER ((UINT)-1) #endif typedef struct waveformat_tag *LPWAVEFORMAT; - + typedef struct HMIDIOUT__ *HMIDIOUT; typedef HMIDIOUT *LPHMIDIOUT; typedef struct HWND__ *HWND; @@ -368,9 +368,9 @@ RADDEFSTART // If compiling MSS DLL, use __declspec(dllexport) for both // declarations and definitions // - + #ifdef IS_WIN32 - + #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) #define AILLIBCALLBACK __stdcall #define AILCALL __stdcall @@ -382,20 +382,20 @@ RADDEFSTART #define AILCALLBACK __cdecl #define AILEXPORT __cdecl #endif - + #ifdef __RADINDLL__ #define DXDEC __declspec(dllexport) #define DXDEF __declspec(dllexport) #else - + #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) #define DXDEC extern #else #define DXDEC __declspec(dllimport) #endif - + #endif - + #ifdef IS_WIN64 #define MSSDLLNAME "MSS64.DLL" #define MSS_REDIST_DIR_NAME "redist64" @@ -403,11 +403,11 @@ RADDEFSTART #define MSSDLLNAME "MSS32.DLL" #define MSS_REDIST_DIR_NAME "redist" #endif - + #define MSS_DIR_SEP "\\" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - + #endif typedef void * LPVOID; @@ -420,7 +420,7 @@ RADDEFSTART #define AILLIBCALLBACK #define AILCALL #define AILEXPORT - #define AILCALLBACK + #define AILCALLBACK #elif defined(__RADX86__) #define AILLIBCALLBACK __attribute__((cdecl)) #define AILCALL __attribute__((cdecl)) @@ -437,7 +437,7 @@ RADDEFSTART #define DXDEC extern #define DXDEF #endif - + #ifdef __RADX64__ #define MSS_REDIST_DIR_NAME "redist/x64" #elif defined(IS_X86) @@ -447,7 +447,7 @@ RADDEFSTART #else #error "No Redist Dir Specified" #endif - + #define MSS_DIR_SEP "/" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP @@ -714,7 +714,7 @@ typedef enum #ifndef FILE_ERRS #define FILE_ERRS - + #define AIL_NO_ERROR 0 #define AIL_IO_ERROR 1 #define AIL_OUT_OF_MEMORY 2 @@ -736,9 +736,9 @@ EXPTYPEBEGIN typedef SINTa HMSSENUM; EXPTYPEEND /* specifies a type used to enumerate through a list of properties. - + $:MSS_FIRST use this value to start the enumeration process. - + The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call the enumeration function until it returns 0. @@ -751,7 +751,7 @@ the enumeration function until it returns 0. // Preference names and default values // -#define AIL_MM_PERIOD 0 +#define AIL_MM_PERIOD 0 #define DEFAULT_AMP 1 // Default MM timer period = 5 msec. #define AIL_TIMERS 1 @@ -1877,7 +1877,7 @@ typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D posi F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. F32 spread; - + HSAMPLE owner; // May be NULL if used for temporary/internal calculations AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired @@ -1915,7 +1915,7 @@ typedef struct _SAMPLE // Sample instance S32 index; // Numeric index of this sample SMPBUF buf[8]; // Source data buffers - + U32 src_fract; // Fractional part of source address U32 mix_delay; // ms until start mixing (decreased every buffer mix) @@ -1924,7 +1924,7 @@ typedef struct _SAMPLE // Sample instance U64 mix_bytes; // total number of bytes sent to the mixer for this sample. S32 group_id; // ID for grouped operations. - + // size of the next dynamic arrays U32 chan_buf_alloced; U32 chan_buf_used; @@ -1946,10 +1946,10 @@ typedef struct _SAMPLE // Sample instance // these are dynamic arrays F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) - + S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # // 99% of the time this is a 1:1 mapping and is zero. - + S32 lp_any_on; // are any of the low pass filters on? S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? @@ -1989,7 +1989,7 @@ typedef struct _SAMPLE // Sample instance U32 low_pass_changed; // bit mask for what channels changed. - + S32 bus; // Bus assignment for this sample. S32 bus_comp_sends; // Which buses this bus routes compressor input to. S32 bus_comp_installed; // Nonzero if we have a compressor installed. @@ -2042,7 +2042,7 @@ typedef struct _SAMPLE // Sample instance SPINFO pipeline[N_SAMPLE_STAGES]; S32 n_active_filters; // # of SP_FILTER_n stages active - + // // 3D-related state for all platforms (including Xbox) // @@ -2113,14 +2113,14 @@ DXDEC void AILCALL AIL_serve(void); #ifdef IS_MAC typedef void * LPSTR; - + #define WHDR_DONE 0 - + typedef struct _WAVEIN { long temp; } * HWAVEIN; - + typedef struct _WAVEHDR { S32 dwFlags; @@ -2133,7 +2133,7 @@ DXDEC void AILCALL AIL_serve(void); S32 dwLoops; void * lpNext; U32 * reserved; - + } WAVEHDR, * LPWAVEHDR; #endif @@ -2145,7 +2145,7 @@ typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver #ifdef IS_MAC #define AIL_DIGITAL_INPUT_DEFAULT 0 - + typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver { U32 tag; // HDIN @@ -2478,7 +2478,7 @@ typedef struct _DIG_DRIVER // Handle to digital audio driver U32 last_ds_play; U32 last_ds_write; U32 last_ds_move; - + #endif #ifdef IS_X86 @@ -2661,7 +2661,7 @@ typedef struct _SEQUENCE // XMIDI sequence state table void const *EVNT; U8 const *EVNT_ptr; // Current event pointer - + U8 *ICA; // Indirect Controller Array AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler @@ -3121,13 +3121,13 @@ DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); #elif defined(__RADANDROID__) DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); - + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); #define AIL_open_digital_driver(frequency, bits, channel, flags) \ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) - + #elif defined(IS_PSP2) DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); @@ -3221,7 +3221,7 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire { Str255 version_name; } MSS_VersionType; - + #define AIL_MSS_version(str,len) \ { \ long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ @@ -3269,11 +3269,11 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire } \ } \ } - + #endif DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - + DXDEC S32 AILCALL AIL_digital_handle_reacquire (HDIGDRIVER drvr); @@ -3339,18 +3339,18 @@ DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 c $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only - affected when popped. + affected when popped. $- - If you want more control over whether a sample will be affected by a push or a pop operation, + If you want more control over whether a sample will be affected by a push or a pop operation, see $AIL_set_sample_level_mask. - + */ DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); /* - Pops the current system state and returns the system to the way it + Pops the current system state and returns the system to the way it was before the last push. $:dig The driver to pop. @@ -3374,7 +3374,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); $:S The sample to set the mask for. $:mask The bitmask of levels for which the sample will play. - Under normal push/pop operations, a sample's mask is set when it is + Under normal push/pop operations, a sample's mask is set when it is started to the level the system is at. If the system is pushed without a reset, then the mask is adjusted to include the new level. When a system is popped, if the sample is going to continue playing, @@ -3435,7 +3435,7 @@ DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); $:return The HSAMPLE for the new bus. A bus allows you to treat a group of samples as one sample. With the bus sample you can - do almost all of the things you can do with a normal sample handle. The only exception + do almost all of the things you can do with a normal sample handle. The only exception is you can't adjust the playback rate of the sample. Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. @@ -3495,7 +3495,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); /* - Installs the Compressor filter on to a bus, using another bus as the input for + Installs the Compressor filter on to a bus, using another bus as the input for compression/limiting. $:dig The driver the busses exist on. @@ -3508,7 +3508,7 @@ DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_inde its signal strength to the filter, allowing it to attenuate the bus_index bus based on another bus's contents. - To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and + To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties are documented under $(Compressor Filter) */ @@ -4325,7 +4325,7 @@ typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); #define MSS_STREAM_CHUNKS 8 -typedef struct _STREAM +typedef struct _STREAM { S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream S32 using_ASI; // 1 if using ASI decoder to uncompress stream data @@ -4349,7 +4349,7 @@ typedef struct _STREAM S32 read_IO_index; // index of buffer to be loaded into Miles next S32 bufsize; // size of each buffer - + U32 datarate; // datarate in bytes per second S32 filerate; // original datarate of the file S32 filetype; // file format type @@ -4987,7 +4987,7 @@ typedef struct OGG_INFO; DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, - U8 *Ogg_file_image, + U8 *Ogg_file_image, S32 Ogg_file_size); DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); @@ -5102,10 +5102,10 @@ DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); // 3D-related calls // -DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, +DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, S32 bus_index); -DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, +DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, S32 bus_index, S32 room_type); @@ -5180,7 +5180,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSS $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If + This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be called otherwise. @@ -5195,8 +5195,8 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, M $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having an exclusion that varies as a function of distance to the listener. If - a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion + This marks a sample as having an exclusion that varies as a function of distance to the listener. If + a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion affects reverb wet level. The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. @@ -5230,7 +5230,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECT other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional source. - If there is neither spread falloff nor volume falloff specified, spread will be automatically applied + If there is neither spread falloff nor volume falloff specified, spread will be automatically applied when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff and $AIL_set_sample_3D_volume_falloff. @@ -5243,7 +5243,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); $:S Sample to affect. $:spread The value to set the spread to. - Spread is how much the directionality of a sample "spreads" to more speakers - emulating + Spread is how much the directionality of a sample "spreads" to more speakers - emulating the effect a sound has when it occupies more than a point source. For instance, a sound point source that sits directly to the left of the listener would have a very strong left speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be @@ -5392,7 +5392,7 @@ EXPGROUP(Miles High Level Event System) EXPTYPE typedef struct MSSSOUNDBANK {}; /* Internal structure. - + Use $HMSOUNDBANK instead. */ @@ -5401,7 +5401,7 @@ EXPTYPE typedef struct MSSSOUNDBANK {}; EXPTYPE typedef struct SoundBank *HMSOUNDBANK; /* Describes a handle to an open sound bank. - + This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. */ @@ -5424,7 +5424,7 @@ DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); Close a soundbank previously opened with $AIL_open_soundbank. $:bank Soundbank to close. - + Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from this soundbank are no longer valid. */ @@ -5448,7 +5448,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. - The name of the bank is the name used in asset names. This is distinct from the + The name of the bank is the name used in asset names. This is distinct from the file name of the bank. The return value should not be deleted. @@ -5457,7 +5457,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); /* Returns the amount of data used by the soundbank management structures. - + $:bank Soundbank to query. $:return Total memory allocated. @@ -5476,7 +5476,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sound presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5503,7 +5503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMS $:return Returns 0 when enumeration is complete. Enumerates the environment presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5530,7 +5530,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sounds available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* SoundName = 0; @@ -5549,7 +5549,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* Note that name should NOT be deleted by the caller - this points at memory owned by Miles. */ - + DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); /* Enumerate the events stored in a soundbank. @@ -5561,7 +5561,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, $:return Returns 0 when enumeration is complete. Enumerates the events available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* EventName = 0; @@ -5624,7 +5624,7 @@ DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. This will alter the properties on a given sample, based on the given preset. -*/ +*/ DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); /* @@ -5644,7 +5644,7 @@ DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK ba $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. Presets may or may not affect any given property. Only the properties affected by the specified - preset will have their values restored to default. + preset will have their values restored to default. */ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); @@ -5658,7 +5658,7 @@ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPO $:isfloat nonzero if the output needs to be a float. The function callback should convert variable expressions in to an output value of the - requested type. + requested type. */ DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); @@ -5777,7 +5777,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name $:name The name of the sound asset to find. $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. - $:return Returns the byte size of the buffer required for out_name. + $:return Returns the byte size of the buffer required for out_name. This function must be called in order to resolve the sound asset name to something that can be used by miles. To ensure safe buffer containment, call @@ -5832,7 +5832,7 @@ typedef struct _MEMDUMP* HMEMDUMP; ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." - Discussion = "Primarily designed for offline use, this function is the first step in + Discussion = "Primarily designed for offline use, this function is the first step in creating an event that can be consumed by the MilesEvent system. Usage is as follows: HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); @@ -5850,7 +5850,7 @@ typedef struct _MEMDUMP* HMEMDUMP; Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following $AIL_complete_event_queue_processing. - + Events are generally tailored to the MilesEvent system, even though there is nothing preventing you from writing your own event system, or creation ui. " @@ -5906,7 +5906,7 @@ EXPTYPEEND /* Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. - $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same + $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same sound to play twice in a row. This is the only selection type that doesn't require a state variable. $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. @@ -5926,10 +5926,10 @@ EXPTYPEEND Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." - In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. - If there are multiple names listed, the sound will be chosen at random based on the given weights. This + In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. + If there are multiple names listed, the sound will be chosen at random based on the given weights. This string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always - terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use + terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use an empty string as an entry." In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" @@ -5944,7 +5944,7 @@ EXPTYPEEND In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." - In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound + In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound with a priority strictly less than the given priority." In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." @@ -5969,19 +5969,19 @@ DXDEC S32 AILCALL AIL_add_start_sound_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_SoundNames, - const char* i_PresetName, + const char* i_PresetName, U8 i_PresetIsDynamic, const char* i_EventName, const char* i_StartMarker, const char* i_EndMarker, char const* i_StateVar, char const* i_VarInit, - const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, + const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, const char* i_StartOffset, F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, F32 i_FadeInTime, - U8 i_EvictionType, + U8 i_EvictionType, U8 i_SelectType ); @@ -6004,7 +6004,7 @@ AIL_add_start_sound_event_step( In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to be called with the same parameters. - + If you are using MilesEvent, the data is refcounted so the sound will not be freed until all samples using it complete." } @@ -6089,7 +6089,7 @@ DXDEC S32 AILCALL AIL_add_control_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, const char* i_PresetName, U8 i_PresetApplyType, @@ -6191,7 +6191,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Defines a named blend function to be referenced by a blended sound later. $:i_Event The event to add the step to. - $:i_Name The name of the blend. This is the name that will be + $:i_Name The name of the blend. This is the name that will be referenced by the state variable in start sound, as well as the variable name to set by the game to update the blend for an instance. $:i_SoundCount The number of sounds this blend will affect. Max 10. @@ -6226,7 +6226,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Miles max sample count." } */ -DXDEC S32 AILCALL +DXDEC S32 AILCALL AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); /*! @@ -6257,8 +6257,8 @@ AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitNa AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" } */ -DXDEC S32 AILCALL -AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, +DXDEC S32 AILCALL +AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, const char* i_Labels, U8 i_IsDynamic ); @@ -6272,13 +6272,13 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * n thus shouldn't be checked via strlen, etc. $:return Returns 0 on fail. - Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, + Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, rather than inspected directly. */ DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); /* - Clears all persistent state in the runtime. + Clears all persistent state in the runtime. $:i_Event The event to add the step to. @@ -6311,7 +6311,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Ev DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); /* Adds a step to define a variable that oscillates over time. - + $:i_Event The event to add the step to. $:i_Name The nane of the variable to oscillate. $:i_Base The value to oscillate around, or a variable name to use as the base. @@ -6327,15 +6327,15 @@ DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); /* Adds a step to set and move a variable over time on a curve. - + $:i_Event The event to add the step to. $:i_Name The variable to move. $:i_Times The midpoint and final times for the curves $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) $:i_Values The initial, midpoint, and final values for the variable. - + The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. - + If an existing move var exists when the new one is added, the old one is replaced. */ @@ -6450,7 +6450,7 @@ struct EVENT_STEP_INFO U8 isdynamic; } persist; - struct + struct { MSSSTRINGC name; MSSSTRINGC labels; @@ -6522,7 +6522,7 @@ struct EVENT_STEP_INFO the string location of the next event step in the buffer." Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be - used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the + used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the next step. In this manner it can be used in a loop: // Create an event to stop all sounds. @@ -6610,11 +6610,11 @@ EXPTYPE typedef void* HEVENTSYSTEM; DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); /* Initializes the Miles Event system and associates it with an open digital driver. - + $:dig The digital sound driver that this event system should use. $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). - $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. - Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. + $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. + Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. Use 0 to let Miles to allocate this buffer itself. $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). @@ -6633,8 +6633,8 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); $:return A handle to the event system to use in various high level functions. Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. - - To enqueue events to the new system, use $AIL_enqueue_event_system. + + To enqueue events to the new system, use $AIL_enqueue_event_system. To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. @@ -6646,7 +6646,7 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); /* Shuts down the Miles event system. - + This function will closes everything in the event system - it ignores reference counts. It will free all event memory, sound banks, and samples used by the system. */ @@ -6660,10 +6660,10 @@ DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char c $:return The handle to the newly loaded soundbank (zero on failure). This function opens the sound bank and makes it available to the event system. The filename - is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. + is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', and while using the name 'gamebank' for authoring and auditioning. - + Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds is played, or a sound requiring it plays. @@ -6685,7 +6685,7 @@ DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); Any other data references still existing (queued events, persisted presets, etc) will report errors when used, but will not crash. - + Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. @@ -6698,24 +6698,24 @@ DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name) (EXPAPI removed to prevent release in docs) Searches for an event by name in the event system. - + $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". $:return A pointer to the event contents (or 0, if the event isn't found). - + This function is normally used as the event parameter for $AIL_enqueue_event. It searches one or all open soundbanks for a particular event name. - - This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with + + This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with MILESEVENT_ENQUEUE_BY_NAME. - + Events that are not enqueued by name can not be tracked by the Auditioner. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to a specific system. Used only if you have multiple event systems running. - + $:system The event system to attach the event to. $:return See $AIL_enqueue_event for return description. @@ -6728,10 +6728,10 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); $:name The full name of the event, eg "soundbank/path/to/event". $:return See $AIL_enqueue_event for return description. - - This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. - - For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent + + This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. + + For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) For introduction to the auditioning system, see $integrating_events. @@ -6743,9 +6743,9 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); $:return A token used for passing to functions that add data to the event. - This is used to pass more data to an event that will be executed. For instance, if + This is used to pass more data to an event that will be executed. For instance, if an event is going to spatialize a sound, but there's no need to move the sound over the course of - its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a + its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a sound is started it will use that for its initial position, and there is no need to do any game object <-> event id tracking. @@ -6762,7 +6762,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); The enqueue process is still completely thread safe. No locks are used, however only 8 enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start - will yield the thread until a slot is open. + will yield the thread until a slot is open. The ONLY time that should happen is if events enqueues are started but never ended: @@ -6838,7 +6838,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as user_buffer is never dereferenced. - $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and + $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and carried with the event. During sound enumeration this buffer is made available, and you never have to worry about memory management. $- @@ -6855,7 +6855,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data->game_stat = 1; data->needed_info = 2; - // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound + // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound // completes and we're done using it in the enumeration loop. S32 ptr_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); @@ -6874,7 +6874,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data.game_stat = 1; data.needed_info = 2; - // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use + // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use // a stack variable like this S32 buf_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); @@ -6895,7 +6895,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* nam $:value The value of the variable to set. $:return 0 if the enqueue buffer is full - When a sound starts, the given variable will be set to the given value prior to any possible + When a sound starts, the given variable will be set to the given value prior to any possible references being used by presets. */ @@ -6904,7 +6904,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); Limits the effects of the event to sounds started by the given ID. $:token A token created with $AIL_enqueue_event_start - $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an + $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an event, it will apply to all sounds started by the event, and any events queued by that event. $:return 0 if the enqueue buffer is full @@ -6932,7 +6932,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); $:selection The value to use for selecting the sound to play. $:return 0 if the enqueue buffer is full - The selection index is used to programatically select a sound from the + The selection index is used to programatically select a sound from the loaded banks. The index passed in replaces any numeric value at the end of the sound name existing in any start sound event step. For example, if a start sound event plays "mybank/sound1", and the event is queued with @@ -6969,52 +6969,52 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* even As with all of the enqueue functions it is completely thread-safe. Upon completion of this function, the enqueue slot is release and available for another - $AIL_enqueue_event_start. + $AIL_enqueue_event_start. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. - - $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. + + $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. - $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. - This data is then accessible later, when enumerating the instances. + $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. + This data is then accessible later, when enumerating the instances. $:user_buffer_len Size of the buffer pointed to by user_buffer. $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, - when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if + when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you - execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. + execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. - $:return On success, returns QueuedID value that is unique to this queued event for the rest of this + $:return On success, returns QueuedID value that is unique to this queued event for the rest of this program run (you can use this ID to uniquely identify sounds triggered from this event). - + This function enqueues an event to be triggered - this is how you begin execution of an event. First, you queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to execute an event. - - This function is very lightweight. It does nothing more than post the event and data to a + + This function is very lightweight. It does nothing more than post the event and data to a command buffer that gets executed via $AIL_begin_event_queue_processing. The user_buffer parameter can be used in different ways. If no flags are passed in, then Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with the queued sound - you can then free the user_buffer data completely! This lets Miles keep track - of all your sound related memory directly and is the normal way to use the system (it is very + of all your sound related memory directly and is the normal way to use the system (it is very convenient once you get used to it). If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will simply be associated with each sound that this event may start. In this case, user_buffer_len is ignored. - - In both cases, when you later enumerate the sound instances, you can access your sound data + + In both cases, when you later enumerate the sound instances, you can access your sound data with the $(MILESEVENTSOUNDINFO::UserBuffer) field. - + You can call this function from any number threads - it's designed to be called from anywhere in your game. If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done - by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and + by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. */ @@ -7044,23 +7044,23 @@ DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); /* Begin execution of all of the enqueued events. - $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events + $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events (out of memory, bank file not found, bad data, etc). You can get the specific error by calling $AIL_last_error. - + This function executes all the events currently in the queue. This is where all major processing takes place in the event system. - + Once you execute this functions, then sound instances will be in one of three states: - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7082,7 +7082,7 @@ ${ MILESEVENTSOUNDINFO Info; HMSSENUM SoundEnum = MSS_FIRST; - while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) { game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue @@ -7098,13 +7098,13 @@ ${ } } - $AIL_complete_event_queue_processing( ); - $} - - Note that if any event step drastically fails, the rest of the command queue is + $AIL_complete_event_queue_processing( ); + $} + + Note that if any event step drastically fails, the rest of the command queue is skipped, and this function returns 0! For this reason, you shouldn't assume that a start sound event will always result in a completed sound later. - + Therefore, you should allocate memory that you want associated with a sound instance during the enumeration loop, rather than at enqueue time. Otherwise, you need to detect that the sound didn't start and then free the memory (which can be complicated). @@ -7120,7 +7120,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO HSTREAM Stream; void* UserBuffer; S32 UserBufferLen; - S32 Status; + S32 Status; U32 Flags; S32 UsedDelay; F32 UsedVolume; @@ -7130,10 +7130,10 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO } MILESEVENTSOUNDINFO; /* Sound instance data that is associated with each active sound instance. - + $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound - was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from + was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from $AIL_enqueue_event, and EventID represents the completion event. $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). $:Sample The $HSAMPLE for this playing sound. @@ -7148,7 +7148,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted and is only valid for the until the next call in to Miles. $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. - + This structure is returned by the $AIL_enumerate_sound_instances function. It returns information about an active sound instance. */ @@ -7157,7 +7157,7 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7183,14 +7183,14 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will // get 20. $} - + */ DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7265,7 +7265,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, the sound starting. Generally you don't need to do this manually, since the sound designer should do this, however if you need to restart a sound that stopped - for example a stream that went to error - you will have to set the start position via code. - + However, since there can be a delay between the time the sound is first seen in the sound iteration and the time it gets set to the data, start positions set via the low level miles calls can get lost, so use this. @@ -7281,11 +7281,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. - $:info Returns the data for each sound instance. + $:info Returns the data for each sound instance. $:return Returns 0 when enumeration is complete. Enumerates the sound instances. This will generally be used between - calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to + calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to manage the sound instances. The label_query is a list of labels to match, separated by commas. By default, comma-separated @@ -7302,11 +7302,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7315,7 +7315,7 @@ ${ HMSSENUM SoundEnum = MSS_FIRST; MILESEVENTSOUNDINFO Info; - while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) { if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) { @@ -7330,23 +7330,23 @@ $} EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; #define MILESEVENT_SOUND_STATUS_PENDING 0x1 -#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 +#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 #define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). - + These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. */ @@ -7360,13 +7360,13 @@ EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event and couldn't find anything in the loaded banks. $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, or a limit on the sound itself. - $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. + $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. The sound will start when sufficient data has been loaded to hopefully avoid a skip. $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible that the sound playback will catch up to the read position under poor I/O conditions. @@ -7375,7 +7375,7 @@ EXPTYPEEND sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media was removed during load, or the file was not found. - + These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances may have more than one flag, logically 'or'ed together. */ @@ -7383,16 +7383,16 @@ EXPTYPEEND DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); /* Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). - + $:return Returns 0 on failure. - This function must be called as a pair with $AIL_begin_event_queue_processing. - - In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't - started playing yet. Old sound instances that have finished playing are still valid - they - haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances + This function must be called as a pair with $AIL_begin_event_queue_processing. + + In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't + started playing yet. Old sound instances that have finished playing are still valid - they + haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances and frees the completed ones - it's the 2nd half of the event processing. - + Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound instances. */ @@ -7400,7 +7400,7 @@ DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a stop sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7408,7 +7408,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, this function accomplishes that, and is captured by the auditioner for replay. @@ -7417,7 +7417,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a pause sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7425,7 +7425,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, this function accomplishes that, and is captured by the auditioner for replay. @@ -7434,7 +7434,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a resume sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7442,17 +7442,17 @@ DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U6 Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, this function accomplishes that, and is captured by the auditioner for replay. */ -DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, +DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); /* Allows the programmer to manually enqueue a start sound event into the event system. - + $:bank The bank containing the sound to start. $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. @@ -7463,10 +7463,10 @@ DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. $:return Returns a non-zero EnqueueID on success. - Enqueues an event to start the specified sound asset. - + Enqueues an event to start the specified sound asset. + Usually the programmer should trigger an event that the sound designer has specifically - create to start the appropriate sounds, but this function gives the programmer + create to start the appropriate sounds, but this function gives the programmer manual control, if necessary. This function is not captured by the auditioner. */ @@ -7488,7 +7488,7 @@ DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char co Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based on the settings in the event step). - + Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. Note that this replaces those events, it does not supplement. */ @@ -7503,7 +7503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS that this pointer can change frame to frame and should be immediately copied to a client-allocated buffer if persistence is desired. $:return Returns 0 when enumeration is complete. - + This function lets you enumerate all the persisting presets that are currently active in the system. It is mostly a debugging aid. */ @@ -7511,12 +7511,12 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); /* Returns a big string describing the current state of the event system. - - $:return String description of current systems state. + + $:return String description of current systems state. This function is a debugging aid - it can be used to show all of the active allocations, active sounds, etc. - + You must delete the pointer returned from this function with $AIL_mem_free_lock. */ @@ -7535,7 +7535,7 @@ EXPTYPE typedef struct _MILESEVENTSTATE } MILESEVENTSTATE; /* returns the current state of the Miles Event System. - + $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. $:HeapRemaining The number of bytes in HeapSize that is remaining. @@ -7615,7 +7615,7 @@ EXPTYPE typedef struct _MILESBANKFUNCTIONS } MILESBANKFUNCTIONS; /* specifies callbacks for each of the Miles event system. - + $:FreeAll Callback that tells you to free all user-side bank memory. $:GetPreset Callback to retrieve a sound preset. $:GetEnvironment Callback to retrieve an environment preset. @@ -7645,13 +7645,13 @@ DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleC In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). - + */ DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); /* Allows you to override the internal bank file resource management.. - + $:Functions A pointer to a structure containing all the callback functions. This function is used to completely override the high-level resource management system. @@ -7856,7 +7856,7 @@ EXPTYPEEND $:MILES_PLAT_IPHONE Apple iDevices $:MILES_PLAT_LINUX Linux Flavors $:MILES_PLAT_WII Nintendo Wii - $:MILES_PLAT_PSP2 Sony NGP + $:MILES_PLAT_PSP2 Sony NGP Values representing the various platforms the high level tool allows. */ @@ -7891,11 +7891,11 @@ EXPGROUP(Miles High Level Event System) DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); /* Returns an information structure about the current state of the Miles Event System. - + $:system The system to retrieve information for, or zero for the default system. $:state A pointer to a structure to receive the state information. - This function is a debugging aid - it returns information for the event system. + This function is a debugging aid - it returns information for the event system. */ DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); @@ -7923,7 +7923,7 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); // Callback for the error handler. EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); /* - The function prototype to use for a callback that will be made when the event system + The function prototype to use for a callback that will be made when the event system encounters an unrecoverable error. $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. @@ -7937,7 +7937,7 @@ EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_ EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); /* The function definition to use when defining your own random function. - + You can define a function with this prototype and pass it to $AIL_register_random if you want to tie the Miles random calls in with your game's (for logging and such). */ @@ -7953,7 +7953,7 @@ DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_Error can sometimes be somewhat invisible. This function allows you to see what went wrong, when it went wrong. - The basic usage is to have the callback check $AIL_last_error() for the overall category of + The basic usage is to have the callback check $AIL_last_error() for the overall category of failure. The parameter passed to the callback might provide some context, but it can and will be zero on occasion. Generally it will represent the resource string that is being worked on when the error occurred. @@ -8009,7 +8009,7 @@ typedef C8 * (AILCALL *FLT_ERROR)(void); typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, MSS_FREE_TYPE * pfree, - UINTa user, + UINTa user, HDIGDRIVER dig, void * memory); typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); diff --git a/Minecraft.Client/Orbis/Miles/include/rrCore.h b/Minecraft.Client/Orbis/Miles/include/rrCore.h index 4ba70d3a..e88b5f8c 100644 --- a/Minecraft.Client/Orbis/Miles/include/rrCore.h +++ b/Minecraft.Client/Orbis/Miles/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.cpp b/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.cpp index 3f621046..5c02cb08 100644 --- a/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.cpp +++ b/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.cpp @@ -21,8 +21,8 @@ int (* SQRNetworkManager_Orbis::s_SignInCompleteCallbackFn)(void *pParam, bool b void * SQRNetworkManager_Orbis::s_SignInCompleteParam = NULL; sce::Toolkit::NP::PresenceDetails SQRNetworkManager_Orbis::s_lastPresenceInfo; -int64_t SQRNetworkManager_Orbis::s_lastPresenceTime = 0; -int64_t SQRNetworkManager_Orbis::s_resendPresenceTime = 0; +__int64 SQRNetworkManager_Orbis::s_lastPresenceTime = 0; +__int64 SQRNetworkManager_Orbis::s_resendPresenceTime = 0; bool SQRNetworkManager_Orbis::s_presenceStatusDirty = false; bool SQRNetworkManager_Orbis::s_presenceDataDirty = false; @@ -51,7 +51,7 @@ int g_numRUDPContextsBound = 0; //unsigned int SQRNetworkManager_Orbis::RoomSyncData::playerCount = 0; // This maps internal to extern states, and needs to match element-by-element the eSQRNetworkManagerInternalState enumerated type -const SQRNetworkManager_Orbis::eSQRNetworkManagerState SQRNetworkManager_Orbis::m_INTtoEXTStateMappings[SQRNetworkManager_Orbis::SNM_INT_STATE_COUNT] = +const SQRNetworkManager_Orbis::eSQRNetworkManagerState SQRNetworkManager_Orbis::m_INTtoEXTStateMappings[SQRNetworkManager_Orbis::SNM_INT_STATE_COUNT] = { SNM_STATE_INITIALISING, // SNM_INT_STATE_UNINITIALISED SNM_STATE_INITIALISING, // SNM_INT_STATE_SIGNING_IN @@ -143,7 +143,7 @@ void SQRNetworkManager_Orbis::Initialise() assert( m_state == SNM_INT_STATE_UNINITIALISED ); - + //Initialize libnetctl ret = sceNetCtlInit(); if( ( ret < 0 /*&& ret != CELL_NET_CTL_ERROR_NOT_TERMINATED*/ ) || ForceErrorPoint( SNM_FORCE_ERROR_NET_CTL_INIT ) ) @@ -172,14 +172,14 @@ void SQRNetworkManager_Orbis::Initialise() SonyHttp::init(); ret = sceNpSetNpTitleId(GetSceNpTitleId(), GetSceNpTitleSecret()); - if (ret < 0) + if (ret < 0) { app.DebugPrintf("sceNpSetNpTitleId failed, ret=%x\n", ret); assert(0); } ret = sceRudpEnableInternalIOThread(RUDP_THREAD_STACK_SIZE, RUDP_THREAD_PRIORITY); - if(ret < 0) + if(ret < 0) { app.DebugPrintf("sceRudpEnableInternalIOThread failed with error code 0x%08x\n", ret); assert(0); @@ -192,7 +192,7 @@ void SQRNetworkManager_Orbis::Initialise() else { // On Orbis, PSN sign in is only handled by the XMB - SetState(SNM_INT_STATE_IDLE); + SetState(SNM_INT_STATE_IDLE); } SonyVoiceChat_Orbis::init(); @@ -299,7 +299,7 @@ void SQRNetworkManager_Orbis::InitialiseAfterOnline() ret = sceNpMatching2CreateContext(¶m, &m_matchingContext); - + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT ) ) { app.DebugPrintf("SQRNetworkManager_Orbis::InitialiseAfterOnline - sceNpMatching2CreateContext failed with error 0x%08x\n", ret); @@ -398,7 +398,7 @@ void SQRNetworkManager_Orbis::Tick() { // make sure we've removed all the remote players and killed the udp connections before we bail out if(m_RudpCtxToPlayerMap.size() == 0) - ResetToIdle(); + ResetToIdle(); } EnterCriticalSection(&m_csStateChangeQueue); @@ -451,7 +451,7 @@ void SQRNetworkManager_Orbis::tickErrorDialog() if(s_errorDialogRunning) { SceErrorDialogStatus s = sceErrorDialogUpdateStatus(); - switch (s) + switch (s) { case SCE_ERROR_DIALOG_STATUS_NONE: assert(0); @@ -465,9 +465,9 @@ void SQRNetworkManager_Orbis::tickErrorDialog() case SCE_ERROR_DIALOG_STATUS_FINISHED: sceErrorDialogTerminate(); s_errorDialogRunning = false; - + // Start callback timer - s_SignInCompleteCallbackPending = true; + s_SignInCompleteCallbackPending = true; s_errorDialogClosed = System::currentTimeMillis(); break; } @@ -490,9 +490,9 @@ void SQRNetworkManager_Orbis::tickErrorDialog() SceSystemServiceStatus status = SceSystemServiceStatus(); sceSystemServiceGetStatus(&status); bool systemUiDisplayed = status.isInBackgroundExecution || status.isSystemUiOverlaid; - + if (systemUiDisplayed) - { + { // Wait till the system goes away } else @@ -583,7 +583,7 @@ void SQRNetworkManager_Orbis::ErrorHandlingTick() DeleteServerContext(); break; } - + } // Start hosting a game, by creating a room & joining it. We explicity create a server context here (via GetServerContext) as Sony suggest that @@ -643,7 +643,7 @@ void SQRNetworkManager_Orbis::UpdateExternalRoomData() { if( m_offlineGame ) return; if( m_isHosting ) - { + { SceNpMatching2SetRoomDataExternalRequest reqParam; memset( &reqParam, 0, sizeof(reqParam) ); reqParam.roomId = m_room; @@ -774,13 +774,13 @@ int SQRNetworkManager_Orbis::BasicEventThreadProc( void *lpParameter ) do { ret = sceKernelWaitEqueue(manager->m_basicEventQueue, &event, 1, &outEv, NULL); - + // If the sys_event_t we've sent here from the handler has a non-zero data1 element, this is to signify that we should terminate the thread if( event.udata == 0 ) { // int iEvent; // SceNpUserInfo from; -// uint8_t buffer[SCE_NP_BASIC_MAX_MESSAGE_SIZE]; +// uint8_t buffer[SCE_NP_BASIC_MAX_MESSAGE_SIZE]; // size_t bufferSize = SCE_NP_BASIC_MAX_MESSAGE_SIZE; // int ret = sceNpBasicGetEvent(&iEvent, &from, &buffer, &bufferSize); // if( ret == 0 ) @@ -788,7 +788,7 @@ int SQRNetworkManager_Orbis::BasicEventThreadProc( void *lpParameter ) // if( iEvent == SCE_NP_BASIC_EVENT_INCOMING_BOOTABLE_INVITATION ) // { // // 4J Stu - Don't do this here as it can be very disruptive to gameplay. Players can bring this up from LoadOrJoinMenu, PauseMenu and InGameInfoMenu -// //sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); +// //sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); // } // if( iEvent == SCE_NP_BASIC_EVENT_RECV_INVITATION_RESULT ) // { @@ -835,12 +835,12 @@ int SQRNetworkManager_Orbis::GetFriendsThreadProc( void* lpParameter ) return 0; } - if (friendList.hasResult()) + if (friendList.hasResult()) { - sce::Toolkit::NP::FriendsList::const_iterator iter ; + sce::Toolkit::NP::FriendsList::const_iterator iter ; int i = 1 ; bool noFriends = true; - for (iter = friendList.get()->begin(); iter != friendList.get()->end() ; ++iter,i++) + for (iter = friendList.get()->begin(); iter != friendList.get()->end() ; ++iter,i++) { manager->m_friendCount++; noFriends = false; @@ -848,7 +848,7 @@ int SQRNetworkManager_Orbis::GetFriendsThreadProc( void* lpParameter ) app.DebugPrintf("Online Name: %s\n",iter->npid.handle.data); app.DebugPrintf("------------------------\n"); - + sce::Toolkit::NP::PresenceRequest presenceRequest; sce::Toolkit::NP::Utilities::Future presenceInfo; memset(&presenceRequest,0,sizeof(presenceRequest)); @@ -858,11 +858,11 @@ int SQRNetworkManager_Orbis::GetFriendsThreadProc( void* lpParameter ) ret = sce::Toolkit::NP::Presence::Interface::getPresence(&presenceRequest,&presenceInfo,false); - if( ret < 0 ) + if( ret < 0 ) { app.DebugPrintf("getPresence() error. ret = 0x%x\n", ret); } - else + else { app.DebugPrintf("\nPresence Data Retrieved:\n"); app.DebugPrintf("Platform Type: %s\n", presenceInfo.get()->platformType.c_str()); @@ -897,13 +897,13 @@ int SQRNetworkManager_Orbis::GetFriendsThreadProc( void* lpParameter ) } } } - else if (friendList.hasError()) + else if (friendList.hasError()) { app.DebugPrintf( "Error occurred while retrieving FriendsList, ret = 0x%x\n", friendList.getError()); app.DebugPrintf("Check sign-in status\n"); } - + return 0; } @@ -944,7 +944,7 @@ bool SQRNetworkManager_Orbis::IsReadyToPlayOrIdle() // Consider as "in session" from the moment that a game is created or joined, until the point where the game itself has been told via state change that we are now idle. The -// game code requires IsInSession to return true as soon as it has asked to do one of these things (even if the state system hasn't really caught up with this request yet), and +// game code requires IsInSession to return true as soon as it has asked to do one of these things (even if the state system hasn't really caught up with this request yet), and // it also requires that it is informed of the state changes leading up to not being in the session, before this should report false. bool SQRNetworkManager_Orbis::IsInSession() { @@ -1119,7 +1119,7 @@ bool SQRNetworkManager_Orbis::JoinRoom(SceNpMatching2RoomId roomId, SceNpMatchin m_localPlayerJoinMask = localPlayerMask; m_localPlayerCount = 0; m_localPlayerJoined = 0; - + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) { if( localPlayerMask & ( 1 << i ) ) m_localPlayerCount++; @@ -1240,7 +1240,7 @@ bool SQRNetworkManager_Orbis::AddLocalPlayerByUserIndex(int idx) // Sync this back out to our networked clients... SyncRoomData(); - + UpdateRemotePlay(); // no connections being made because we're all on the host, so add this player to the existing connections @@ -1264,7 +1264,7 @@ bool SQRNetworkManager_Orbis::AddLocalPlayerByUserIndex(int idx) memset(&reqParam, 0, sizeof(reqParam)); memset(&binAttr, 0, sizeof(binAttr)); - + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; binAttr.ptr = &m_localPlayerJoinMask; binAttr.size = sizeof(m_localPlayerJoinMask); @@ -1357,7 +1357,7 @@ bool SQRNetworkManager_Orbis::RemoveLocalPlayerByUserIndex(int idx) memset(&reqParam, 0, sizeof(reqParam)); memset(&binAttr, 0, sizeof(binAttr)); - + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; binAttr.ptr = &m_localPlayerJoinMask; binAttr.size = sizeof(m_localPlayerJoinMask); @@ -1395,7 +1395,7 @@ void SQRNetworkManager_Orbis::UpdateRemotePlay() extern uint8_t *mallocAndCreateUTF8ArrayFromString(int iID); -// Bring up a Gui to send an invite so a player that the user can select. This invite will contain the room Id so that +// Bring up a Gui to send an invite so a player that the user can select. This invite will contain the room Id so that void SQRNetworkManager_Orbis::SendInviteGUI() { if(s_bInviteDialogRunning) @@ -1403,7 +1403,7 @@ void SQRNetworkManager_Orbis::SendInviteGUI() app.DebugPrintf("SendInviteGUI - Invite dialog is already running so ignoring request\n"); return; } - + s_bInviteDialogRunning = true; //Set invitation information - this is now exactly the same as the presence information that we synchronise out. @@ -1428,7 +1428,7 @@ void SQRNetworkManager_Orbis::SendInviteGUI() messData.dialogFlag = SCE_TOOLKIT_NP_DIALOG_TYPE_USER_EDITABLE; messData.npIdsCount = 2; // TODO: Set this to the number of available slots messData.npIds = NULL; - messData.userInfo.userId = userId; + messData.userInfo.userId = userId; // Set expire to maximum messData.expireMinutes = 0; @@ -1451,9 +1451,9 @@ void SQRNetworkManager_Orbis::SendInviteGUI() // int ret = sce::Toolkit::NP::Messaging::Interface::sendMessage(&messData, SCE_TOOLKIT_NP_MESSAGE_TYPE_INVITE); free(subject); - free(body); + free(body); - if(ret < SCE_TOOLKIT_NP_SUCCESS ) + if(ret < SCE_TOOLKIT_NP_SUCCESS ) { s_bInviteDialogRunning = false; app.DebugPrintf("Send Message failed 0x%x ...\n",ret); @@ -1513,7 +1513,7 @@ void SQRNetworkManager_Orbis::TickInviteGUI() int32_t ret = sceGameCustomDataDialogGetResult( &dialogResult ); if( SCE_OK != ret ) - { + { app.DebugPrintf( "***** sceGameCustomDataDialogGetResult error:0x%x\n", ret); } sceGameCustomDataDialogClose(); @@ -1536,7 +1536,7 @@ void SQRNetworkManager_Orbis::GetInviteDataAndProcess(sce::Toolkit::NP::MessageA } // InvitationInfoRequest requestInfo; // sce::Toolkit::NP::Utilities::Future< NpSessionInvitationInfo > inviteInfo; -// +// // requestInfo.invitationId = pInvite->invitationId; // requestInfo.userInfo.npId = pInvite->onlineId; // int err = sce::Toolkit::NP::Sessions::Interface::getInvitationInfo(&requestInfo, &inviteInfo, false); @@ -1555,21 +1555,21 @@ void SQRNetworkManager_Orbis::GetInviteDataAndProcess(sce::Toolkit::NP::MessageA // { // app.DebugPrintf("getInvitationInfo error 0x%08x", err); // } -// -// -// +// +// +// // INVITE_INFO *invite = &m_inviteReceived[m_inviteIndex]; // m_inviteIndex = ( m_inviteIndex + 1 ) % MAX_SIMULTANEOUS_INVITES; // size_t dataSize = sizeof(INVITE_INFO); // int ret = sceNpBasicRecvMessageAttachmentLoad(id, invite, &dataSize); -// +// // // If we fail ( which we might do if we aren't online at this point) then zero the invite information and we'll try and get it later after (possibly) signing in // if( ret != 0 ) // { // memset(invite, 0, sizeof( INVITE_INFO ) ); // s_lastInviteIdToRetry = id; // } -// +// // m_gameBootInvite = invite; } @@ -1647,7 +1647,7 @@ void SQRNetworkManager_Orbis::MapRoomSlotPlayers(int roomSlotPlayerCount/*=-1*/) { EnterCriticalSection(&m_csRoomSyncData); - // If we pass an explicit roomSlotPlayerCount, it is because we are removing a player, and this is the count of slots that there were *before* the removal. + // If we pass an explicit roomSlotPlayerCount, it is because we are removing a player, and this is the count of slots that there were *before* the removal. bool zeroLastSlot = false; if( roomSlotPlayerCount == -1 ) { @@ -1751,7 +1751,7 @@ void SQRNetworkManager_Orbis::MapRoomSlotPlayers(int roomSlotPlayerCount/*=-1*/) } else { - FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_REMOTE, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_REMOTE, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); // On client, UIDs flow from m_roomSyncData->player data } } @@ -1844,7 +1844,7 @@ bool SQRNetworkManager_Orbis::AddRemotePlayersAndSync( SceNpMatching2RoomMemberI } // We want to keep all players from a particular machine together, so search through the room sync data to see if we can find - // any pre-existing players from this machine. + // any pre-existing players from this machine. int firstIdx = -1; for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) { @@ -1950,7 +1950,7 @@ void SQRNetworkManager_Orbis::RemoveRemotePlayersAndSync( SceNpMatching2RoomMemb // Update mapping from the room slot players to SQRNetworkPlayer instances MapRoomSlotPlayers(); - + // And then synchronise this out to all other machines SyncRoomData(); @@ -1993,7 +1993,7 @@ void SQRNetworkManager_Orbis::RemoveNetworkPlayers( int mask ) removePlayerFromVoiceChat(player); // Delete the player itself and the mapping from context to player map as this context is no longer valid - delete player; + delete player; } else { @@ -2107,7 +2107,7 @@ bool SQRNetworkManager_Orbis::GetMatchingContext(eSQRNetworkManagerInternalState // Starts the process of obtaining a server context. This is an asynchronous operation, at the end of which (if successful), we'll be creating // a room. General procedure followed here is as suggested by Sony - we get a list of servers, then pick a random one, and see if it is available. -// If not we just cycle round trying other random ones until we either find an available one or fail. +// If not we just cycle round trying other random ones until we either find an available one or fail. bool SQRNetworkManager_Orbis::GetServerContext() { assert(m_state == SNM_INT_STATE_IDLE); @@ -2165,7 +2165,7 @@ bool SQRNetworkManager_Orbis::GetServerContext(SceNpMatching2ServerId serverId) // ( serverCount == SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_STARTED ) ) // Also checking for this as a means of simulating the previous error // { // sceNpMatching2DestroyContext(m_matchingContext); -// m_matchingContextValid = false; +// m_matchingContextValid = false; // if( !GetMatchingContext(SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT) ) return false; // } // } @@ -2298,7 +2298,7 @@ void SQRNetworkManager_Orbis::NetworkPlayerConnectionComplete(SQRNetworkPlayer * if( ( !wasReady ) && ( isReady ) ) { - HandlePlayerJoined( player ); + HandlePlayerJoined( player ); } } @@ -2327,7 +2327,7 @@ void SQRNetworkManager_Orbis::NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *pl if( ( !wasReady ) && ( isReady ) ) { - HandlePlayerJoined( player ); + HandlePlayerJoined( player ); } } @@ -2345,7 +2345,7 @@ void SQRNetworkManager_Orbis::NetworkPlayerInitialDataReceived(SQRNetworkPlayer if( ( !wasReady ) && ( isReady ) ) { - HandlePlayerJoined( player ); + HandlePlayerJoined( player ); } } @@ -2361,7 +2361,7 @@ void SQRNetworkManager_Orbis::HandlePlayerJoined(SQRNetworkPlayer *player) { if( m_listener ) { - m_listener->HandlePlayerJoined( player ); + m_listener->HandlePlayerJoined( player ); } app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> HandlePlayerJoined\n"); @@ -2425,7 +2425,7 @@ std::string getIPAddressString(SceNetInAddr add) { char str[32]; unsigned char *vals = (unsigned char*)&add.s_addr; - sprintf(str, "%d.%d.%d.%d", (int)vals[0], (int)vals[1], (int)vals[2], (int)vals[3]); + sprintf(str, "%d.%d.%d.%d", (int)vals[0], (int)vals[1], (int)vals[2], (int)vals[3]); return std::string(str); } @@ -2495,7 +2495,7 @@ bool SQRNetworkManager_Orbis::CreateVoiceRudpConnections(SceNpMatching2RoomId ro SQRVoiceConnection* pConnection = SonyVoiceChat_Orbis::getVoiceConnectionFromRoomMemberID(peerMemberId); if(pConnection == NULL) { - + // Create an Rudp context for the voice connection, this will happen regardless of whether the peer is client or host int rudpCtx; ret = sceRudpCreateContext( RudpContextCallback, this, &rudpCtx ); @@ -2510,7 +2510,7 @@ bool SQRNetworkManager_Orbis::CreateVoiceRudpConnections(SceNpMatching2RoomId ro g_numRUDPContextsBound++; app.DebugPrintf(sc_verbose, "-----------------::::::::::::: sceRudpBind\n" ); - ret = sceRudpInitiate( rudpCtx, (SceNetSockaddr*)&sinp2pPeer, sizeof(sinp2pPeer), 0); + ret = sceRudpInitiate( rudpCtx, (SceNetSockaddr*)&sinp2pPeer, sizeof(sinp2pPeer), 0); if(ret < 0){ app.DebugPrintf("sceRudpInitiate %s failed : 0x%08x\n", getIPAddressString(sinp2pPeer.sin_addr).c_str(), ret); assert(0); } if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_INIT2) ) return false; app.DebugPrintf(sc_verbose, "-----------------::::::::::::: sceRudpInitiate\n" ); @@ -2521,7 +2521,7 @@ bool SQRNetworkManager_Orbis::CreateVoiceRudpConnections(SceNpMatching2RoomId ro pConnection = SonyVoiceChat_Orbis::addRemoteConnection(rudpCtx, peerMemberId); } - + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) { bool bMaskVal = ( playerMask & ( 1 << i ) ); @@ -2544,11 +2544,11 @@ bool SQRNetworkManager_Orbis::CreateRudpConnections(SceNpMatching2RoomId roomId, memset(&sinp2pPeer, 0, sizeof(sinp2pPeer)); sinp2pPeer.sin_len = sizeof(sinp2pPeer); sinp2pPeer.sin_family = AF_INET; - + int ret = sceNpMatching2SignalingGetConnectionStatus(m_matchingContext, roomId, peerMemberId, &connStatus, &sinp2pPeer.sin_addr, &sinp2pPeer.sin_port); app.DebugPrintf(CMinecraftApp::USER_RR,"sceNpMatching2SignalingGetConnectionStatus returned 0x%x, connStatus %d peer add:%s peer port:0x%x\n",ret, connStatus,getIPAddressString(sinp2pPeer.sin_addr).c_str(),sinp2pPeer.sin_port); - // Set vport + // Set vport sinp2pPeer.sin_vport = sceNetHtons(1); // Create socket & bind, if we don't already have one @@ -2706,7 +2706,7 @@ void SQRNetworkManager_Orbis::ContextCallback(SceNpMatching2ContextId id, SceNp manager->m_state == SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT || manager->m_state == SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT) { - // matching context failed to start (this can happen when you block the IP addresses of the matching servers on your router + // matching context failed to start (this can happen when you block the IP addresses of the matching servers on your router // agent-0101.ww.sp-int.matching.playstation.net (198.107.157.191) // static-resource.sp-int.community.playstation.net (203.105.77.140) app.DebugPrintf("SQRNetworkManager_Orbis::ContextCallback - Error\n"); @@ -2771,7 +2771,7 @@ void SQRNetworkManager_Orbis::ContextCallback(SceNpMatching2ContextId id, SceNp // unsigned int type, attributes; // CellGameContentSize gameSize;` // char dirName[CELL_GAME_DIRNAME_SIZE]; -// +// // if( g_bBootedFromInvite ) // { // manager->GetInviteDataAndProcess(SCE_NP_BASIC_SELECTED_INVITATION_DATA); @@ -2789,7 +2789,7 @@ void SQRNetworkManager_Orbis::ContextCallback(SceNpMatching2ContextId id, SceNp assert(false); break; case SCE_NP_MATCHING2_CONTEXT_EVENT_START_OVER: - + app.DebugPrintf("SCE_NP_MATCHING2_CONTEXT_EVENT_START_OVER\n"); app.DebugPrintf("eventCause=%u, errorCode=0x%08x\n", eventCause, errorCode); @@ -2950,7 +2950,7 @@ void SQRNetworkManager_Orbis::DefaultRequestCallback(SceNpMatching2ContextId id, if( success1 ) { success2 = manager->CreateRudpConnections(manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, playerMask, pRoomMemberData->roomMemberDataInternal->memberId); - if( success2 ) + if( success2 ) { bool ret = manager->CreateVoiceRudpConnections( manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, 0); assert(ret == true); @@ -3055,7 +3055,7 @@ void SQRNetworkManager_Orbis::DefaultRequestCallback(SceNpMatching2ContextId id, void SQRNetworkManager_Orbis::RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, const void *data, void *arg) { SQRNetworkManager_Orbis *manager = (SQRNetworkManager_Orbis *)arg; - + bool gotEventData = false; switch( event ) { @@ -3186,7 +3186,7 @@ void SQRNetworkManager_Orbis::RoomEventCallback(SceNpMatching2ContextId id, SceN int oldMask = manager->GetOldMask( pRoomMemberData->newRoomMemberDataInternal->memberId ); int addedMask = manager->GetAddedMask(playerMask, oldMask ); int removedMask = manager->GetRemovedMask(playerMask, oldMask ); - + if( addedMask != 0 ) { bool success = manager->AddRemotePlayersAndSync( pRoomMemberData->newRoomMemberDataInternal->memberId, addedMask ); @@ -3203,7 +3203,7 @@ void SQRNetworkManager_Orbis::RoomEventCallback(SceNpMatching2ContextId id, SceN memset(&reqParam, 0, sizeof(reqParam)); memset(&binAttr, 0, sizeof(binAttr)); - + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; binAttr.ptr = &oldMask; binAttr.size = sizeof(oldMask); @@ -3265,7 +3265,7 @@ void SQRNetworkManager_Orbis::RoomEventCallback(SceNpMatching2ContextId id, SceN } } } - + } } break; @@ -3426,7 +3426,7 @@ void SQRNetworkManager_Orbis::SysUtilCallback(uint64_t status, uint64_t param, v // } // return; // } -// +// // if( netstart_result.result != 0 ) // { // // Failed, or user may have decided not to sign in - maybe need to differentiate here @@ -3440,7 +3440,7 @@ void SQRNetworkManager_Orbis::SysUtilCallback(uint64_t status, uint64_t param, v // s_SignInCompleteCallbackFn = NULL; // } // } -// +// // break; // case CELL_SYSUTIL_NET_CTL_NETSTART_UNLOADED: // break; @@ -3608,7 +3608,7 @@ void SQRNetworkManager_Orbis::NetCtlCallback(int eventType, void *arg) if( eventType == SCE_NET_CTL_EVENT_TYPE_DISCONNECTED)// CELL_NET_CTL_EVENT_LINK_DISCONNECTED ) { manager->m_bLinkDisconnected = true; - manager->m_listener->HandleDisconnect(false); + manager->m_listener->HandleDisconnect(false); } else //if( event == CELL_NET_CTL_EVENT_ESTABLISH ) { @@ -3762,7 +3762,7 @@ void SQRNetworkManager_Orbis::GetExtDataForRoom( SceNpMatching2RoomId roomId, vo if( ret == SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_STARTED ) // Also checking for this as a means of simulating the previous error { sceNpMatching2DestroyContext(m_matchingContext); - m_matchingContextValid = false; + m_matchingContextValid = false; if( !GetMatchingContext(SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT) ) { // No matching context, and failed to try and make one. We're really broken here. @@ -3789,7 +3789,7 @@ bool SQRNetworkManager_Orbis::ForceErrorPoint(eSQRForceError error) return false; } #else -bool SQRNetworkManager_Orbis::aForceError[SNM_FORCE_ERROR_COUNT] = +bool SQRNetworkManager_Orbis::aForceError[SNM_FORCE_ERROR_COUNT] = { false, // SNM_FORCE_ERROR_NP2_INIT false, // SNM_FORCE_ERROR_NET_INITIALIZE_NETWORK @@ -3919,7 +3919,7 @@ void SQRNetworkManager_Orbis::AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(v ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA,1,iPad,ErrorPSNDisconnectedDialogReturned,pParam, app.GetStringTable()); } -} +} int SQRNetworkManager_Orbis::SetRichPresence(const void *data) { @@ -3971,13 +3971,13 @@ void SQRNetworkManager_Orbis::SendLastPresenceInfo() // On PS4 we can't set the status and the data at the same time unsigned int options = 0; - if( s_presenceDataDirty ) + if( s_presenceDataDirty ) { // Prioritise data over status as it is critical to discovering the network game s_lastPresenceInfo.presenceType = SCE_TOOLKIT_NP_PRESENCE_DATA; } - else if( s_presenceStatusDirty ) - { + else if( s_presenceStatusDirty ) + { s_lastPresenceInfo.presenceType = SCE_TOOLKIT_NP_PRESENCE_STATUS; } else @@ -4065,7 +4065,7 @@ void SQRNetworkManager_Orbis::removePlayerFromVoiceChat( SQRNetworkPlayer* pPlay { if(pPlayer->IsLocal()) { - + SonyVoiceChat_Orbis::disconnectLocalPlayer(pPlayer->GetLocalPlayerIndex()); } else @@ -4097,7 +4097,7 @@ void SQRNetworkManager_Orbis::removePlayerFromVoiceChat( SQRNetworkPlayer* pPlay void SQRNetworkManager_Orbis::TickNotify() { if (g_NetworkManager.IsInSession() && !g_NetworkManager.IsLocalGame()) - { + { long long currentTime = System::currentTimeMillis(); // Note: interval at which to notify Sony of realtime play, according to docs an interval greater than 1 sec is bad @@ -4109,7 +4109,7 @@ void SQRNetworkManager_Orbis::TickNotify() m_lastNotifyTime = currentTime; for(int i = 0; i < XUSER_MAX_COUNT; i++) { - if (ProfileManager.IsSignedInLive(i)) + if (ProfileManager.IsSignedInLive(i)) { NotifyRealtimePlusFeature(i); } @@ -4143,8 +4143,8 @@ void SQRNetworkManager_Orbis::NotifyRealtimePlusFeature(int iQuadrant) // { // app.DebugPrintf("============ Calling CallSignInCompleteCallback and s_SignInCompleteCallbackFn is OK\n"); // bool isSignedIn = ProfileManager.IsSignedInLive(s_SignInCompleteCallbackPad); -// -// s_SignInCompleteCallbackFn(s_SignInCompleteParam, isSignedIn, s_SignInCompleteCallbackPad); +// +// s_SignInCompleteCallbackFn(s_SignInCompleteParam, isSignedIn, s_SignInCompleteCallbackPad); // s_SignInCompleteCallbackFn = NULL; // s_SignInCompleteCallbackPad = -1; // } diff --git a/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.h b/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.h index cb7cafa9..5b19f63e 100644 --- a/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.h +++ b/Minecraft.Client/Orbis/Network/SQRNetworkManager_Orbis.h @@ -29,7 +29,7 @@ class SQRNetworkManager_Orbis : public SQRNetworkManager public: SQRNetworkManager_Orbis(ISQRNetworkManagerListener *listener); - // General + // General void Tick(); void Initialise(); void Terminate(); @@ -111,7 +111,7 @@ private: bool m_offlineSQR; int m_resendExternalRoomDataCountdown; bool m_matching2initialised; - PresenceSyncInfo m_inviteReceived[MAX_SIMULTANEOUS_INVITES]; + PresenceSyncInfo m_inviteReceived[MAX_SIMULTANEOUS_INVITES]; int m_inviteIndex; static PresenceSyncInfo *m_gameBootInvite; static PresenceSyncInfo m_gameBootInvite_data; @@ -222,9 +222,9 @@ private: std::vector m_aFriendSearchResults; // Rudp management and local players - std::unordered_map m_RudpCtxToPlayerMap; + std::unordered_map m_RudpCtxToPlayerMap; - std::unordered_map m_NetAddrToVoiceConnectionMap; + std::unordered_map m_NetAddrToVoiceConnectionMap; bool CreateRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask, SceNpMatching2RoomMemberId playersPeerMemberId); bool CreateVoiceRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask); @@ -325,8 +325,8 @@ private: static sce::Toolkit::NP::PresenceDetails s_lastPresenceInfo; static const int MIN_PRESENCE_RESEND_TIME = 30 * 1000; // Minimum presence send rate - doesn't seem possible to find out what this actually should be - static int64_t s_lastPresenceTime; - static int64_t s_resendPresenceTime; + static __int64 s_lastPresenceTime; + static __int64 s_resendPresenceTime; static bool s_presenceStatusDirty; static bool s_presenceDataDirty; @@ -337,7 +337,7 @@ private: // Debug static long long s_roomStartTime; - + // Error dialog static bool s_errorDialogRunning; diff --git a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp index 661a1528..d3a21ac4 100644 --- a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp +++ b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp @@ -24,9 +24,9 @@ int32_t hBGMAudio; //static char sc_loadPath[] = {"/app0/"}; //const char* getConsoleHomePath() { return sc_loadPath; } -char* getUsrDirPath() -{ - return usrdirPath; +char* getUsrDirPath() +{ + return usrdirPath; } @@ -34,7 +34,7 @@ int _wcsicmp( const wchar_t * dst, const wchar_t * src ) { wchar_t f,l; - // validation section + // validation section // _VALIDATE_RETURN(dst != NULL, EINVAL, _NLSCMPERROR); // _VALIDATE_RETURN(src != NULL, EINVAL, _NLSCMPERROR); @@ -61,7 +61,7 @@ size_t wcsnlen(const wchar_t *wcs, size_t maxsize) } -VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) +VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) { SceRtcDateTime dateTime; int err = sceRtcGetCurrentClock(&dateTime, 0); @@ -78,8 +78,8 @@ VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) } BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { ORBIS_STUBBED; return false; } BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) { ORBIS_STUBBED; return false; } -VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) -{ +VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) +{ SceRtcDateTime dateTime; int err = sceRtcGetCurrentClockLocalTime(&dateTime); assert(err == SCE_OK ); @@ -95,21 +95,21 @@ VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) } HANDLE CreateEvent(void* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName) { ORBIS_STUBBED; return NULL; } -VOID Sleep(DWORD dwMilliseconds) -{ +VOID Sleep(DWORD dwMilliseconds) +{ C4JThread::Sleep(dwMilliseconds); } BOOL SetThreadPriority(HANDLE hThread, int nPriority) { ORBIS_STUBBED; return FALSE; } DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { ORBIS_STUBBED; return false; } -LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) -{ +LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) +{ return sceAtomicCompareAndSwap32((int32_t*)Destination, (int32_t)Comperand, (int32_t)Exchange); } -LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) -{ +LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) +{ return sceAtomicCompareAndSwap64((int64_t*)Destination, (int64_t)Comperand, (int64_t)Exchange); } @@ -135,10 +135,10 @@ VOID OrbisInit() sceSysmoduleLoadModule(SCE_SYSMODULE_RUDP); sceSysmoduleLoadModule(SCE_SYSMODULE_NP_MATCHING2); sceSysmoduleLoadModule(SCE_SYSMODULE_INVITATION_DIALOG); - sceSysmoduleLoadModule(SCE_SYSMODULE_NP_PARTY ); - sceSysmoduleLoadModule(SCE_SYSMODULE_GAME_CUSTOM_DATA_DIALOG ); - sceSysmoduleLoadModule(SCE_SYSMODULE_NP_SCORE_RANKING ); - sceSysmoduleLoadModule(SCE_SYSMODULE_NP_AUTH ); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_PARTY ); + sceSysmoduleLoadModule(SCE_SYSMODULE_GAME_CUSTOM_DATA_DIALOG ); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_SCORE_RANKING ); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_AUTH ); sceSysmoduleLoadModule(SCE_SYSMODULE_NP_COMMERCE); sceSysmoduleLoadModule(SCE_SYSMODULE_REMOTE_PLAY); sceSysmoduleLoadModule(SCE_SYSMODULE_ERROR_DIALOG); @@ -173,7 +173,7 @@ VOID OrbisInit() hBGMAudio=sceAudioOutOpen( SCE_USER_SERVICE_USER_ID_SYSTEM, SCE_AUDIO_OUT_PORT_TYPE_BGM,0, - 256, + 256, 48000, 2); @@ -195,7 +195,7 @@ int32_t GetAudioBGMHandle() return hBGMAudio; } -VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) { char name[1] = {0}; @@ -209,7 +209,7 @@ VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) } -VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) +VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) { InitializeCriticalSection(CriticalSection); } @@ -220,9 +220,9 @@ VOID DeleteCriticalSection(PCRITICAL_SECTION CriticalSection) assert(err == SCE_OK); } -extern CRITICAL_SECTION g_singleThreadCS; +extern CRITICAL_SECTION g_singleThreadCS; -VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) { int err = scePthreadMutexLock(&CriticalSection->mutex); assert(err == SCE_OK || err == SCE_KERNEL_ERROR_EDEADLK ); @@ -240,7 +240,7 @@ VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) } -VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) { if(--CriticalSection->m_cLock == 0 ) { @@ -255,7 +255,7 @@ VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) ULONG TryEnterCriticalSection(PCRITICAL_SECTION CriticalSection) { - int err = scePthreadMutexTrylock(&CriticalSection->mutex); + int err = scePthreadMutexTrylock(&CriticalSection->mutex); if((err == SCE_OK || err == SCE_KERNEL_ERROR_EDEADLK )) { CriticalSection->m_cLock++; @@ -266,20 +266,20 @@ ULONG TryEnterCriticalSection(PCRITICAL_SECTION CriticalSection) DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds) { ORBIS_STUBBED; return 0; } -BOOL CloseHandle(HANDLE hObject) -{ +BOOL CloseHandle(HANDLE hObject) +{ sceFiosFHCloseSync(NULL,(SceFiosFH)((int64_t)hObject)); return true; -// ORBIS_STUBBED; -// return false; +// ORBIS_STUBBED; +// return false; } BOOL SetEvent(HANDLE hEvent) { ORBIS_STUBBED; return false; } HMODULE GetModuleHandle(LPCSTR lpModuleName) { ORBIS_STUBBED; return 0; } -DWORD GetCurrentThreadId(VOID) -{ +DWORD GetCurrentThreadId(VOID) +{ return 0; // TODO } DWORD WaitForMultipleObjectsEx(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds,BOOL bAlertable ) { ORBIS_STUBBED; return 0; } @@ -302,10 +302,10 @@ public: void* m_virtualAddr; uint64_t m_size; - PageInfo(off_t physAddr, void* virtualAddr, uint64_t size) + PageInfo(off_t physAddr, void* virtualAddr, uint64_t size) : m_physAddr(physAddr) , m_virtualAddr(virtualAddr) - , m_size(size) + , m_size(size) {} }; void* m_virtualAddr; @@ -313,7 +313,7 @@ public: std::vector m_pagesAllocated; uint64_t m_allocatedSize; - OrbisVAlloc(void* addr, uint64_t size) + OrbisVAlloc(void* addr, uint64_t size) : m_virtualAddr(addr) , m_virtualSize(size) , m_allocatedSize(0) @@ -331,7 +331,7 @@ public: { uint64_t sizeToAdd = size - m_allocatedSize; // the extra memory size that we have to add on assert(sizeToAdd >= 0); - + if(sizeToAdd == 0) return m_virtualAddr; // nothing to add @@ -393,8 +393,8 @@ public: static std::vector s_orbisVAllocs; -LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) -{ +LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) +{ if(lpAddress == NULL) { void *pAddr = (void*)SCE_KERNEL_APP_MAP_AREA_START_ADDR; @@ -446,14 +446,14 @@ BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) else if(dwFreeType == MEM_RELEASE) { delete s_orbisVAllocs[idx]; - s_orbisVAllocs.erase(s_orbisVAllocs.begin()+idx); + s_orbisVAllocs.erase(s_orbisVAllocs.begin()+idx); } return TRUE; } -DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) -{ +DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) +{ SceFiosSize FileSize; SceFiosFH fh = (SceFiosFH)((int64_t)hFile); //DWORD FileSizeLow; @@ -468,15 +468,15 @@ DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) return (DWORD)FileSize; } -BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize ) -{ +BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize ) +{ SceFiosSize FileSize; SceFiosFH fh = (SceFiosFH)((int64_t)hFile); FileSize=sceFiosFHGetSize(fh); lpFileSize->QuadPart=FileSize; - return true; + return true; } BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) @@ -496,7 +496,7 @@ BOOL WriteFile( } } -BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) +BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) { SceFiosFH fh = (SceFiosFH)((int64_t)hFile); // sceFiosFHReadSync - Non-negative values are the number of bytes read, 0 <= result <= length. Negative values are error codes. @@ -537,7 +537,7 @@ BOOL SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHi } -HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { char filePath[256]; std::string mountedPath = StorageManager.GetMountedPath(lpFileName); @@ -549,7 +549,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, strcpy(filePath, lpFileName ); else sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); - + #ifndef _CONTENT_PACKAGE app.DebugPrintf("*** Opening %s\n",filePath); #endif @@ -557,9 +557,9 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, SceFiosFH fh; SceFiosOpenParams openParams; ZeroMemory(&openParams, sizeof(SceFiosOpenParams)); - + switch(dwDesiredAccess) - { + { case GENERIC_READ: openParams.openFlags = SCE_FIOS_O_RDONLY; break; case GENERIC_WRITE: @@ -588,21 +588,21 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, return INVALID_HANDLE_VALUE; } //assert( err == SCE_FIOS_OK ); - + return (void*)fh; } BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes){ ORBIS_STUBBED; return false; } BOOL DeleteFileA(LPCSTR lpFileName) { ORBIS_STUBBED; return false; } -// BOOL XCloseHandle(HANDLE a) +// BOOL XCloseHandle(HANDLE a) // { // sceFiosFHCloseSync(NULL,(SceFiosFH)((int64_t)a)); // return true; // } -DWORD GetFileAttributesA(LPCSTR lpFileName) +DWORD GetFileAttributesA(LPCSTR lpFileName) { char filePath[256]; std::string mountedPath = StorageManager.GetMountedPath(lpFileName); @@ -633,7 +633,7 @@ BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { ORBIS_STUBBED; DWORD GetLastError(VOID) { ORBIS_STUBBED; return 0; } -VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) +VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) { SceLibcMallocManagedSize stat; int err = malloc_stats(&stat); @@ -647,20 +647,20 @@ VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) lpBuffer->dwAvailVirtual = stat.maxSystemSize - stat.currentInuseSize; } -DWORD GetTickCount() +DWORD GetTickCount() { - // This function returns the current system time at this function is called. + // This function returns the current system time at this function is called. // The system time is represented the time elapsed since the system starts up in microseconds. uint64_t sysTime = sceKernelGetProcessTime(); - return (DWORD)(sysTime / 1000); + return (DWORD)(sysTime / 1000); } // we should really use libperf for this kind of thing, but this will do for now. -BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) -{ +BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) +{ // microseconds - lpFrequency->QuadPart = (1000 * 1000); - return false; + lpFrequency->QuadPart = (1000 * 1000); + return false; } BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { @@ -671,24 +671,24 @@ BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) #ifndef _FINAL_BUILD -VOID OutputDebugStringW(LPCWSTR lpOutputString) -{ - wprintf(lpOutputString); +VOID OutputDebugStringW(LPCWSTR lpOutputString) +{ + wprintf(lpOutputString); } -VOID OutputDebugStringA(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugStringA(LPCSTR lpOutputString) +{ + printf(lpOutputString); } -VOID OutputDebugString(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugString(LPCSTR lpOutputString) +{ + printf(lpOutputString); } #endif // _CONTENT_PACKAGE BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation) -{ +{ ORBIS_STUBBED; return false; } @@ -696,15 +696,15 @@ HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) { ORB BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) { ORBIS_STUBBED; return false;} errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%d",_Value); else if(_Radix==16) sprintf(_DstBuf,"%lx",_Value); else return -1; return 0; } -errno_t _i64toa_s(int64_t _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } -DWORD XGetLanguage() -{ +DWORD XGetLanguage() +{ unsigned char ucLang = app.GetMinecraftLanguage(0); int iLang; // check if we should override the system language or not - if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) + if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) { sceSystemServiceParamGetInt(SCE_SYSTEM_SERVICE_PARAM_ID_LANG,&iLang); } @@ -747,8 +747,8 @@ DWORD XGetLanguage() } } -DWORD XGetLocale() -{ +DWORD XGetLocale() +{ int iLang; sceSystemServiceParamGetInt(SCE_SYSTEM_SERVICE_PARAM_ID_LANG,&iLang); switch(iLang) @@ -784,7 +784,7 @@ DWORD XGetLocale() } } -DWORD XEnableGuestSignin(BOOL fEnable) -{ - return 0; +DWORD XEnableGuestSignin(BOOL fEnable) +{ + return 0; } \ No newline at end of file diff --git a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.h b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.h index 390a0897..da9f872f 100644 --- a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.h +++ b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.h @@ -14,7 +14,7 @@ DWORD TlsAlloc(VOID); LPVOID TlsGetValue(DWORD dwTlsIndex); BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); -typedef struct _RECT +typedef struct _RECT { LONG left; LONG top; @@ -37,16 +37,16 @@ typedef int errno_t; // // The following field is used for blocking when there is contention for // // the resource // // -// +// // union { // ULONG_PTR RawEvent[4]; // } Synchronization; -// +// // // // // The following three fields control entering and exiting the critical // // section for the resource // // -// +// // LONG LockCount; // LONG RecursionCount; // HANDLE OwningThread; @@ -214,7 +214,7 @@ typedef struct _MEMORYSTATUS { #define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE #define WAIT_TIMEOUT 258L -#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) +#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) #define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) #define MAXUINT_PTR (~((UINT_PTR)0)) @@ -256,17 +256,17 @@ typedef struct _MEMORYSTATUS { #define GENERIC_EXECUTE (0x20000000L) #define GENERIC_ALL (0x10000000L) -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_ATTRIBUTE_READONLY 0x00000001 -#define FILE_ATTRIBUTE_HIDDEN 0x00000002 -#define FILE_ATTRIBUTE_SYSTEM 0x00000004 -#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 -#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 -#define FILE_ATTRIBUTE_DEVICE 0x00000040 -#define FILE_ATTRIBUTE_NORMAL 0x00000080 -#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 #define FILE_FLAG_WRITE_THROUGH 0x80000000 #define FILE_FLAG_OVERLAPPED 0x40000000 @@ -286,38 +286,38 @@ typedef struct _MEMORYSTATUS { #define OPEN_ALWAYS 4 #define TRUNCATE_EXISTING 5 -#define PAGE_NOACCESS 0x01 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 -#define PAGE_USER_READONLY 0x1000 -#define PAGE_USER_READWRITE 0x2000 -#define MEM_COMMIT 0x1000 -#define MEM_RESERVE 0x2000 -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 -#define MEM_FREE 0x10000 -#define MEM_PRIVATE 0x20000 -#define MEM_RESET 0x80000 -#define MEM_TOP_DOWN 0x100000 -#define MEM_NOZERO 0x800000 -#define MEM_LARGE_PAGES 0x20000000 -#define MEM_HEAP 0x40000000 -#define MEM_16MB_PAGES 0x80000000 +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 +#define PAGE_USER_READONLY 0x1000 +#define PAGE_USER_READWRITE 0x2000 +#define MEM_COMMIT 0x1000 +#define MEM_RESERVE 0x2000 +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 +#define MEM_FREE 0x10000 +#define MEM_PRIVATE 0x20000 +#define MEM_RESET 0x80000 +#define MEM_TOP_DOWN 0x100000 +#define MEM_NOZERO 0x800000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_HEAP 0x40000000 +#define MEM_16MB_PAGES 0x80000000 #define IGNORE 0 // Ignore signal #define INFINITE 0xFFFFFFFF // Infinite timeout #define WAIT_FAILED ((DWORD)0xFFFFFFFF) -#define STATUS_WAIT_0 ((DWORD )0x00000000L) +#define STATUS_WAIT_0 ((DWORD )0x00000000L) #define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) -#define STATUS_PENDING ((DWORD )0x00000103L) +#define STATUS_PENDING ((DWORD )0x00000103L) #define STILL_ACTIVE STATUS_PENDING DWORD GetLastError(VOID); @@ -356,9 +356,9 @@ VOID OutputDebugString(LPCSTR lpOutputString); VOID OutputDebugStringA(LPCSTR lpOutputString); errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix); -errno_t _i64toa_s(int64_t _Val, char * _DstBuf, size_t _Size, int _Radix); +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix); -#define __declspec(a) +#define __declspec(a) extern "C" int _wcsicmp (const wchar_t * dst, const wchar_t * src); size_t wcsnlen(const wchar_t *wcs, size_t maxsize); diff --git a/Minecraft.Client/Orbis/OrbisExtras/OrbisTypes.h b/Minecraft.Client/Orbis/OrbisExtras/OrbisTypes.h index a4c19219..006a0060 100644 --- a/Minecraft.Client/Orbis/OrbisExtras/OrbisTypes.h +++ b/Minecraft.Client/Orbis/OrbisExtras/OrbisTypes.h @@ -34,6 +34,8 @@ typedef unsigned int *PUINT; typedef unsigned char byte; +typedef long __int64; +typedef unsigned long __uint64; typedef unsigned int DWORD; typedef int INT; typedef unsigned long ULONG_PTR, *PULONG_PTR; diff --git a/Minecraft.Client/Orbis/Orbis_App.cpp b/Minecraft.Client/Orbis/Orbis_App.cpp index 8c674a47..9af5ee12 100644 --- a/Minecraft.Client/Orbis/Orbis_App.cpp +++ b/Minecraft.Client/Orbis/Orbis_App.cpp @@ -35,7 +35,7 @@ CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp() m_bVoiceChatAndUGCRestricted=false; m_bDisplayFullVersionPurchase=false; - // #ifdef _DEBUG_MENUS_ENABLED + // #ifdef _DEBUG_MENUS_ENABLED // debugOverlayCreated = false; // #endif @@ -333,7 +333,7 @@ int CConsoleMinecraftApp::LoadLocalDLCImage(SONYDLC *pDLCInfo) DWORD dwHigh=0; pDLCInfo->dwImageBytes = GetFileSize(hFile,&dwHigh); - + if(pDLCInfo->dwImageBytes!=0) { DWORD dwBytesRead; @@ -400,7 +400,7 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() StorageManager.SetSaveTitle(wWorldName.c_str()); bool isFlat = false; - int64_t seedValue = BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + __int64 seedValue = BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements NetworkGameInitData *param = new NetworkGameInitData(); param->seed = seedValue; @@ -485,7 +485,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_GetProductList: - { + { m_eCommerce_State=eCommerce_State_GetProductList_Pending; SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); std::list::iterator iter = pCategories->subCategories.begin(); @@ -501,7 +501,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_AddProductInfoDetailed: - { + { m_eCommerce_State=eCommerce_State_AddProductInfoDetailed_Pending; // for each of the products in the categories, get the detailed info. We really only need the long description and price info. @@ -538,7 +538,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_RegisterDLC: - { + { m_eCommerce_State=eCommerce_State_Online; // register the DLC info SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); @@ -625,20 +625,20 @@ SonyCommerce::CategoryInfo *CConsoleMinecraftApp::GetCategoryInfo() return &m_CategoryInfo; } -#endif +#endif void CConsoleMinecraftApp::ClearCommerceDetails() { #ifdef ORBIS_COMMERCE_ENABLED for(int i=0;i* pProductList=&m_ProductListA[i]; + std::vector* pProductList=&m_ProductListA[i]; pProductList->clear(); } if(m_ProductListA!=NULL) { - delete [] m_ProductListA; + delete [] m_ProductListA; m_ProductListA=NULL; } @@ -674,11 +674,11 @@ void CConsoleMinecraftApp::GetDLCSkuIDFromProductList(char * pchDLCProductID, ch { SonyCommerce::ProductInfo Info=*it; if(strcmp(pchDLCProductID,Info.productId)==0) - { + { memcpy(pchSkuID,Info.skuId,SCE_NP_COMMERCE2_SKU_ID_LEN); return; } - } + } } } return; @@ -689,7 +689,7 @@ void CConsoleMinecraftApp::GetDLCSkuIDFromProductList(char * pchDLCProductID, ch void CConsoleMinecraftApp::Checkout(char *pchSkuID) { if(m_eCommerce_State==eCommerce_State_Online) - { + { strcpy(m_pchSkuID,pchSkuID); m_eCommerce_State=eCommerce_State_Checkout; } @@ -698,7 +698,7 @@ void CConsoleMinecraftApp::Checkout(char *pchSkuID) void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) { if(m_eCommerce_State==eCommerce_State_Online) - { + { strcpy(m_pchSkuID,pchSkuID); m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased; } @@ -707,7 +707,7 @@ void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) bool CConsoleMinecraftApp::UpgradeTrial() { if(m_eCommerce_State==eCommerce_State_Online) - { + { m_eCommerce_State=eCommerce_State_UpgradeTrial; return true; } @@ -749,12 +749,12 @@ bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) // { // std::vector* pProductList=&m_ProductListA[i]; // AUTO_VAR(itEnd, pProductList->end()); -// +// // for (AUTO_VAR(it, pProductList->begin()); it != itEnd; it++) // { // SonyCommerce::ProductInfo Info=*it; // if(strcmp(pchTitle,Info.skuId)==0) -// { +// { // ORBIS_STUBBED; // SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_OFF // // if(Info.purchasabilityFlag==SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_OFF) @@ -766,7 +766,7 @@ bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) // // return false; // // } // } -// } +// } // } // } #endif // #ifdef ORBIS_COMMERCE_ENABLED @@ -804,7 +804,7 @@ void CConsoleMinecraftApp::CommerceGetCategoriesCallback(LPVOID lpParam,int err) if(err==0) { pClass->m_ProductListCategoriesC=pClass->m_CategoryInfo.countOfSubCategories; - // allocate the memory for the product info for each categories + // allocate the memory for the product info for each categories if(pClass->m_CategoryInfo.countOfSubCategories>0) { pClass->m_ProductListA = (std::vector *) new std::vector [pClass->m_CategoryInfo.countOfSubCategories]; @@ -838,7 +838,7 @@ void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err { // we're done, so now retrieve the additional product details for each product pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; - pClass->m_bCommerceProductListRetrieved=true; + pClass->m_bCommerceProductListRetrieved=true; } else { @@ -848,21 +848,21 @@ void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err else { pClass->m_eCommerce_State=eCommerce_State_Error; - pClass->m_bCommerceProductListRetrieved=true; + pClass->m_bCommerceProductListRetrieved=true; } } // void CConsoleMinecraftApp::CommerceGetDetailedProductInfoCallback(LPVOID lpParam,int err) // { // CConsoleMinecraftApp *pScene=(CConsoleMinecraftApp *)lpParam; -// +// // if(err==0) // { // pScene->m_eCommerce_State=eCommerce_State_Idle; -// //pScene->m_bCommerceProductListRetrieved=true; +// //pScene->m_bCommerceProductListRetrieved=true; // } // //printf("Callback hit, error 0x%08x\n", err); -// +// // } void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam,int err) @@ -882,7 +882,7 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam { // MGH - change this to a while loop so we can skip empty categories. do - { + { pClass->m_iCurrentCategory++; }while(pClass->m_ProductListA[pClass->m_iCurrentCategory].size() == 0 && pClass->m_iCurrentCategorym_ProductListCategoriesC); @@ -891,12 +891,12 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam { // there are no more categories, so we're done pClass->m_eCommerce_State=eCommerce_State_RegisterDLC; - pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_bProductListAdditionalDetailsRetrieved=true; } else { // continue with the next category - pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; + pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; } } else @@ -908,7 +908,7 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam else { pClass->m_eCommerce_State=eCommerce_State_Error; - pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_bProductListAdditionalDetailsRetrieved=true; pClass->m_iCurrentProduct=0; pClass->m_iCurrentCategory=0; } @@ -1062,9 +1062,9 @@ void CConsoleMinecraftApp::SystemServiceTick() for (int i = 0; i < status.eventNum; i++) { ret = sceSystemServiceReceiveEvent(&event); - if (ret == SCE_OK) + if (ret == SCE_OK) { - switch(event.eventType) + switch(event.eventType) { case SCE_SYSTEM_SERVICE_EVENT_GAME_CUSTOM_DATA: { @@ -1072,7 +1072,7 @@ void CConsoleMinecraftApp::SystemServiceTick() // Processing after invitation //SceNpSessionInvitationEventParam* pInvite = (SceNpSessionInvitationEventParam*)event.data.param; //SQRNetworkManager_Orbis::GetInviteDataAndProcess(pInvite); - break; + break; } case SCE_SYSTEM_SERVICE_EVENT_ON_RESUME: // Resume means that the user signed out (but came back), sensible thing to do is exit to main menu @@ -1217,7 +1217,7 @@ bool CConsoleMinecraftApp::CheckForEmptyStore(int iPad) bool bEmptyStore=true; if(pCategories!=NULL) - { + { if(pCategories->countOfProducts>0) { bEmptyStore=false; @@ -1247,7 +1247,7 @@ bool CConsoleMinecraftApp::CheckForEmptyStore(int iPad) void CConsoleMinecraftApp::ShowPatchAvailableError() { int32_t ret=sceErrorDialogInitialize(); - if ( ret==SCE_OK ) + if ( ret==SCE_OK ) { m_bPatchAvailableDialogRunning = true; @@ -1256,7 +1256,7 @@ void CConsoleMinecraftApp::ShowPatchAvailableError() // 4J-PB - We want to display the option to get the patch now param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED; ret = sceUserServiceGetInitialUser( ¶m.userId ); - if ( ret == SCE_OK ) + if ( ret == SCE_OK ) { ret=sceErrorDialogOpen( ¶m ); } @@ -1266,9 +1266,9 @@ void CConsoleMinecraftApp::ShowPatchAvailableError() void CConsoleMinecraftApp::PatchAvailableDialogTick() { if(m_bPatchAvailableDialogRunning) - { + { SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); - if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) { sceErrorDialogTerminate(); diff --git a/Minecraft.Client/Orbis/user_malloc.cpp b/Minecraft.Client/Orbis/user_malloc.cpp index 1628abbe..6a85e83b 100644 --- a/Minecraft.Client/Orbis/user_malloc.cpp +++ b/Minecraft.Client/Orbis/user_malloc.cpp @@ -38,7 +38,7 @@ int user_malloc_init(void) int res; void *addr; uint64_t dmemSize = SCE_KERNEL_MAIN_DMEM_SIZE; - + s_heapLength = ((size_t)4608) * 1024 * 1024; // Initial allocation for the application s_heapLength -= ((size_t)4) * 1024 * 1024; // Allocated for TLS s_heapLength -= ((size_t)2) * 1024 * 1024; // 64K (sometimes?) allocated for razor - rounding up to 2MB here to match our alignment @@ -106,10 +106,10 @@ void *user_malloc(size_t size) { #if 0 static int throttle = 0; - static int64_t lasttime = 0; + static __int64 lasttime = 0; if( ( throttle % 100 ) == 0 ) { - int64_t nowtime = System::currentTimeMillis(); + __int64 nowtime = System::currentTimeMillis(); if( ( nowtime - lasttime ) > 20000 ) { lasttime = nowtime; diff --git a/Minecraft.Client/PS3/Iggy/include/rrCore.h b/Minecraft.Client/PS3/Iggy/include/rrCore.h index ae02f108..e88b5f8c 100644 --- a/Minecraft.Client/PS3/Iggy/include/rrCore.h +++ b/Minecraft.Client/PS3/Iggy/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((uint64_t)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/PS3/Miles/include/mss.h b/Minecraft.Client/PS3/Miles/include/mss.h index 754f536b..531dcbc9 100644 --- a/Minecraft.Client/PS3/Miles/include/mss.h +++ b/Minecraft.Client/PS3/Miles/include/mss.h @@ -39,7 +39,7 @@ // doc system stuff #ifndef EXPAPI -#define EXPAPI +#define EXPAPI #endif #ifndef EXPTYPE #define EXPTYPE @@ -69,10 +69,10 @@ // For docs EXPGROUP(_NullGroup) #define MilesVersion "9.3m" EXPMACRO -#define MilesMajorVersion 9 EXPMACRO +#define MilesMajorVersion 9 EXPMACRO #define MilesMinorVersion 3 EXPMACRO -#define MilesBuildNumber 11 EXPMACRO -#define MilesCustomization 0 EXPMACRO +#define MilesBuildNumber 11 EXPMACRO +#define MilesCustomization 0 EXPMACRO EXPGROUP(_RootGroup) @@ -273,14 +273,14 @@ typedef void VOIDFUNC(void); //================ EXPGROUP(Basic Types) -#define AILCALL EXPTAG(AILCALL) +#define AILCALL EXPTAG(AILCALL) /* Internal calling convention that all external Miles functions use. Usually cdecl or stdcall on Windows. */ -#define AILCALLBACK EXPTAG(AILCALLBACK docproto) +#define AILCALLBACK EXPTAG(AILCALLBACK docproto) /* Calling convention that user supplied callbacks from Miles use. @@ -326,7 +326,7 @@ RADDEFSTART typedef CHAR *LPSTR, *PSTR; #ifdef IS_WIN64 - typedef uint64_t ULONG_PTR, *PULONG_PTR; + typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; #else #ifdef _Wp64 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 @@ -348,13 +348,13 @@ RADDEFSTART typedef struct HWAVEOUT__ *HWAVEOUT; typedef HWAVEIN *LPHWAVEIN; typedef HWAVEOUT *LPHWAVEOUT; - + #ifndef WAVE_MAPPER #define WAVE_MAPPER ((UINT)-1) #endif typedef struct waveformat_tag *LPWAVEFORMAT; - + typedef struct HMIDIOUT__ *HMIDIOUT; typedef HMIDIOUT *LPHMIDIOUT; typedef struct HWND__ *HWND; @@ -368,9 +368,9 @@ RADDEFSTART // If compiling MSS DLL, use __declspec(dllexport) for both // declarations and definitions // - + #ifdef IS_WIN32 - + #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) #define AILLIBCALLBACK __stdcall #define AILCALL __stdcall @@ -382,20 +382,20 @@ RADDEFSTART #define AILCALLBACK __cdecl #define AILEXPORT __cdecl #endif - + #ifdef __RADINDLL__ #define DXDEC __declspec(dllexport) #define DXDEF __declspec(dllexport) #else - + #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) #define DXDEC extern #else #define DXDEC __declspec(dllimport) #endif - + #endif - + #ifdef IS_WIN64 #define MSSDLLNAME "MSS64.DLL" #define MSS_REDIST_DIR_NAME "redist64" @@ -403,11 +403,11 @@ RADDEFSTART #define MSSDLLNAME "MSS32.DLL" #define MSS_REDIST_DIR_NAME "redist" #endif - + #define MSS_DIR_SEP "\\" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - + #endif typedef void * LPVOID; @@ -420,7 +420,7 @@ RADDEFSTART #define AILLIBCALLBACK #define AILCALL #define AILEXPORT - #define AILCALLBACK + #define AILCALLBACK #elif defined(__RADX86__) #define AILLIBCALLBACK __attribute__((cdecl)) #define AILCALL __attribute__((cdecl)) @@ -437,7 +437,7 @@ RADDEFSTART #define DXDEC extern #define DXDEF #endif - + #ifdef __RADX64__ #define MSS_REDIST_DIR_NAME "redist/x64" #elif defined(IS_X86) @@ -447,7 +447,7 @@ RADDEFSTART #else #error "No Redist Dir Specified" #endif - + #define MSS_DIR_SEP "/" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP @@ -714,7 +714,7 @@ typedef enum #ifndef FILE_ERRS #define FILE_ERRS - + #define AIL_NO_ERROR 0 #define AIL_IO_ERROR 1 #define AIL_OUT_OF_MEMORY 2 @@ -736,9 +736,9 @@ EXPTYPEBEGIN typedef SINTa HMSSENUM; EXPTYPEEND /* specifies a type used to enumerate through a list of properties. - + $:MSS_FIRST use this value to start the enumeration process. - + The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call the enumeration function until it returns 0. @@ -751,7 +751,7 @@ the enumeration function until it returns 0. // Preference names and default values // -#define AIL_MM_PERIOD 0 +#define AIL_MM_PERIOD 0 #define DEFAULT_AMP 1 // Default MM timer period = 5 msec. #define AIL_TIMERS 1 @@ -1877,7 +1877,7 @@ typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D posi F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. F32 spread; - + HSAMPLE owner; // May be NULL if used for temporary/internal calculations AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired @@ -1915,7 +1915,7 @@ typedef struct _SAMPLE // Sample instance S32 index; // Numeric index of this sample SMPBUF buf[8]; // Source data buffers - + U32 src_fract; // Fractional part of source address U32 mix_delay; // ms until start mixing (decreased every buffer mix) @@ -1924,7 +1924,7 @@ typedef struct _SAMPLE // Sample instance U64 mix_bytes; // total number of bytes sent to the mixer for this sample. S32 group_id; // ID for grouped operations. - + // size of the next dynamic arrays U32 chan_buf_alloced; U32 chan_buf_used; @@ -1946,10 +1946,10 @@ typedef struct _SAMPLE // Sample instance // these are dynamic arrays F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) - + S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # // 99% of the time this is a 1:1 mapping and is zero. - + S32 lp_any_on; // are any of the low pass filters on? S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? @@ -1989,7 +1989,7 @@ typedef struct _SAMPLE // Sample instance U32 low_pass_changed; // bit mask for what channels changed. - + S32 bus; // Bus assignment for this sample. S32 bus_comp_sends; // Which buses this bus routes compressor input to. S32 bus_comp_installed; // Nonzero if we have a compressor installed. @@ -2042,7 +2042,7 @@ typedef struct _SAMPLE // Sample instance SPINFO pipeline[N_SAMPLE_STAGES]; S32 n_active_filters; // # of SP_FILTER_n stages active - + // // 3D-related state for all platforms (including Xbox) // @@ -2113,14 +2113,14 @@ DXDEC void AILCALL AIL_serve(void); #ifdef IS_MAC typedef void * LPSTR; - + #define WHDR_DONE 0 - + typedef struct _WAVEIN { long temp; } * HWAVEIN; - + typedef struct _WAVEHDR { S32 dwFlags; @@ -2133,7 +2133,7 @@ DXDEC void AILCALL AIL_serve(void); S32 dwLoops; void * lpNext; U32 * reserved; - + } WAVEHDR, * LPWAVEHDR; #endif @@ -2145,7 +2145,7 @@ typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver #ifdef IS_MAC #define AIL_DIGITAL_INPUT_DEFAULT 0 - + typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver { U32 tag; // HDIN @@ -2478,7 +2478,7 @@ typedef struct _DIG_DRIVER // Handle to digital audio driver U32 last_ds_play; U32 last_ds_write; U32 last_ds_move; - + #endif #ifdef IS_X86 @@ -2661,7 +2661,7 @@ typedef struct _SEQUENCE // XMIDI sequence state table void const *EVNT; U8 const *EVNT_ptr; // Current event pointer - + U8 *ICA; // Indirect Controller Array AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler @@ -3121,13 +3121,13 @@ DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); #elif defined(__RADANDROID__) DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); - + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); #define AIL_open_digital_driver(frequency, bits, channel, flags) \ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) - + #elif defined(IS_PSP2) DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); @@ -3221,7 +3221,7 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire { Str255 version_name; } MSS_VersionType; - + #define AIL_MSS_version(str,len) \ { \ long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ @@ -3269,11 +3269,11 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire } \ } \ } - + #endif DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - + DXDEC S32 AILCALL AIL_digital_handle_reacquire (HDIGDRIVER drvr); @@ -3339,18 +3339,18 @@ DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 c $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only - affected when popped. + affected when popped. $- - If you want more control over whether a sample will be affected by a push or a pop operation, + If you want more control over whether a sample will be affected by a push or a pop operation, see $AIL_set_sample_level_mask. - + */ DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); /* - Pops the current system state and returns the system to the way it + Pops the current system state and returns the system to the way it was before the last push. $:dig The driver to pop. @@ -3374,7 +3374,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); $:S The sample to set the mask for. $:mask The bitmask of levels for which the sample will play. - Under normal push/pop operations, a sample's mask is set when it is + Under normal push/pop operations, a sample's mask is set when it is started to the level the system is at. If the system is pushed without a reset, then the mask is adjusted to include the new level. When a system is popped, if the sample is going to continue playing, @@ -3435,7 +3435,7 @@ DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); $:return The HSAMPLE for the new bus. A bus allows you to treat a group of samples as one sample. With the bus sample you can - do almost all of the things you can do with a normal sample handle. The only exception + do almost all of the things you can do with a normal sample handle. The only exception is you can't adjust the playback rate of the sample. Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. @@ -3495,7 +3495,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); /* - Installs the Compressor filter on to a bus, using another bus as the input for + Installs the Compressor filter on to a bus, using another bus as the input for compression/limiting. $:dig The driver the busses exist on. @@ -3508,7 +3508,7 @@ DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_inde its signal strength to the filter, allowing it to attenuate the bus_index bus based on another bus's contents. - To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and + To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties are documented under $(Compressor Filter) */ @@ -4325,7 +4325,7 @@ typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); #define MSS_STREAM_CHUNKS 8 -typedef struct _STREAM +typedef struct _STREAM { S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream S32 using_ASI; // 1 if using ASI decoder to uncompress stream data @@ -4349,7 +4349,7 @@ typedef struct _STREAM S32 read_IO_index; // index of buffer to be loaded into Miles next S32 bufsize; // size of each buffer - + U32 datarate; // datarate in bytes per second S32 filerate; // original datarate of the file S32 filetype; // file format type @@ -4987,7 +4987,7 @@ typedef struct OGG_INFO; DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, - U8 *Ogg_file_image, + U8 *Ogg_file_image, S32 Ogg_file_size); DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); @@ -5102,10 +5102,10 @@ DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); // 3D-related calls // -DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, +DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, S32 bus_index); -DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, +DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, S32 bus_index, S32 room_type); @@ -5180,7 +5180,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSS $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If + This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be called otherwise. @@ -5195,8 +5195,8 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, M $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having an exclusion that varies as a function of distance to the listener. If - a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion + This marks a sample as having an exclusion that varies as a function of distance to the listener. If + a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion affects reverb wet level. The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. @@ -5230,7 +5230,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECT other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional source. - If there is neither spread falloff nor volume falloff specified, spread will be automatically applied + If there is neither spread falloff nor volume falloff specified, spread will be automatically applied when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff and $AIL_set_sample_3D_volume_falloff. @@ -5243,7 +5243,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); $:S Sample to affect. $:spread The value to set the spread to. - Spread is how much the directionality of a sample "spreads" to more speakers - emulating + Spread is how much the directionality of a sample "spreads" to more speakers - emulating the effect a sound has when it occupies more than a point source. For instance, a sound point source that sits directly to the left of the listener would have a very strong left speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be @@ -5392,7 +5392,7 @@ EXPGROUP(Miles High Level Event System) EXPTYPE typedef struct MSSSOUNDBANK {}; /* Internal structure. - + Use $HMSOUNDBANK instead. */ @@ -5401,7 +5401,7 @@ EXPTYPE typedef struct MSSSOUNDBANK {}; EXPTYPE typedef struct SoundBank *HMSOUNDBANK; /* Describes a handle to an open sound bank. - + This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. */ @@ -5424,7 +5424,7 @@ DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); Close a soundbank previously opened with $AIL_open_soundbank. $:bank Soundbank to close. - + Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from this soundbank are no longer valid. */ @@ -5448,7 +5448,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. - The name of the bank is the name used in asset names. This is distinct from the + The name of the bank is the name used in asset names. This is distinct from the file name of the bank. The return value should not be deleted. @@ -5457,7 +5457,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); /* Returns the amount of data used by the soundbank management structures. - + $:bank Soundbank to query. $:return Total memory allocated. @@ -5476,7 +5476,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sound presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5503,7 +5503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMS $:return Returns 0 when enumeration is complete. Enumerates the environment presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5530,7 +5530,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sounds available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* SoundName = 0; @@ -5549,7 +5549,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* Note that name should NOT be deleted by the caller - this points at memory owned by Miles. */ - + DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); /* Enumerate the events stored in a soundbank. @@ -5561,7 +5561,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, $:return Returns 0 when enumeration is complete. Enumerates the events available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* EventName = 0; @@ -5624,7 +5624,7 @@ DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. This will alter the properties on a given sample, based on the given preset. -*/ +*/ DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); /* @@ -5644,7 +5644,7 @@ DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK ba $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. Presets may or may not affect any given property. Only the properties affected by the specified - preset will have their values restored to default. + preset will have their values restored to default. */ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); @@ -5658,7 +5658,7 @@ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPO $:isfloat nonzero if the output needs to be a float. The function callback should convert variable expressions in to an output value of the - requested type. + requested type. */ DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); @@ -5777,7 +5777,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name $:name The name of the sound asset to find. $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. - $:return Returns the byte size of the buffer required for out_name. + $:return Returns the byte size of the buffer required for out_name. This function must be called in order to resolve the sound asset name to something that can be used by miles. To ensure safe buffer containment, call @@ -5832,7 +5832,7 @@ typedef struct _MEMDUMP* HMEMDUMP; ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." - Discussion = "Primarily designed for offline use, this function is the first step in + Discussion = "Primarily designed for offline use, this function is the first step in creating an event that can be consumed by the MilesEvent system. Usage is as follows: HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); @@ -5850,7 +5850,7 @@ typedef struct _MEMDUMP* HMEMDUMP; Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following $AIL_complete_event_queue_processing. - + Events are generally tailored to the MilesEvent system, even though there is nothing preventing you from writing your own event system, or creation ui. " @@ -5906,7 +5906,7 @@ EXPTYPEEND /* Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. - $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same + $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same sound to play twice in a row. This is the only selection type that doesn't require a state variable. $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. @@ -5926,10 +5926,10 @@ EXPTYPEEND Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." - In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. - If there are multiple names listed, the sound will be chosen at random based on the given weights. This + In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. + If there are multiple names listed, the sound will be chosen at random based on the given weights. This string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always - terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use + terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use an empty string as an entry." In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" @@ -5944,7 +5944,7 @@ EXPTYPEEND In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." - In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound + In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound with a priority strictly less than the given priority." In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." @@ -5969,19 +5969,19 @@ DXDEC S32 AILCALL AIL_add_start_sound_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_SoundNames, - const char* i_PresetName, + const char* i_PresetName, U8 i_PresetIsDynamic, const char* i_EventName, const char* i_StartMarker, const char* i_EndMarker, char const* i_StateVar, char const* i_VarInit, - const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, + const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, const char* i_StartOffset, F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, F32 i_FadeInTime, - U8 i_EvictionType, + U8 i_EvictionType, U8 i_SelectType ); @@ -6004,7 +6004,7 @@ AIL_add_start_sound_event_step( In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to be called with the same parameters. - + If you are using MilesEvent, the data is refcounted so the sound will not be freed until all samples using it complete." } @@ -6089,7 +6089,7 @@ DXDEC S32 AILCALL AIL_add_control_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, const char* i_PresetName, U8 i_PresetApplyType, @@ -6191,7 +6191,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Defines a named blend function to be referenced by a blended sound later. $:i_Event The event to add the step to. - $:i_Name The name of the blend. This is the name that will be + $:i_Name The name of the blend. This is the name that will be referenced by the state variable in start sound, as well as the variable name to set by the game to update the blend for an instance. $:i_SoundCount The number of sounds this blend will affect. Max 10. @@ -6226,7 +6226,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Miles max sample count." } */ -DXDEC S32 AILCALL +DXDEC S32 AILCALL AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); /*! @@ -6257,8 +6257,8 @@ AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitNa AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" } */ -DXDEC S32 AILCALL -AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, +DXDEC S32 AILCALL +AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, const char* i_Labels, U8 i_IsDynamic ); @@ -6272,13 +6272,13 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * n thus shouldn't be checked via strlen, etc. $:return Returns 0 on fail. - Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, + Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, rather than inspected directly. */ DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); /* - Clears all persistent state in the runtime. + Clears all persistent state in the runtime. $:i_Event The event to add the step to. @@ -6311,7 +6311,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Ev DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); /* Adds a step to define a variable that oscillates over time. - + $:i_Event The event to add the step to. $:i_Name The nane of the variable to oscillate. $:i_Base The value to oscillate around, or a variable name to use as the base. @@ -6327,15 +6327,15 @@ DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); /* Adds a step to set and move a variable over time on a curve. - + $:i_Event The event to add the step to. $:i_Name The variable to move. $:i_Times The midpoint and final times for the curves $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) $:i_Values The initial, midpoint, and final values for the variable. - + The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. - + If an existing move var exists when the new one is added, the old one is replaced. */ @@ -6450,7 +6450,7 @@ struct EVENT_STEP_INFO U8 isdynamic; } persist; - struct + struct { MSSSTRINGC name; MSSSTRINGC labels; @@ -6522,7 +6522,7 @@ struct EVENT_STEP_INFO the string location of the next event step in the buffer." Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be - used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the + used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the next step. In this manner it can be used in a loop: // Create an event to stop all sounds. @@ -6610,11 +6610,11 @@ EXPTYPE typedef void* HEVENTSYSTEM; DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); /* Initializes the Miles Event system and associates it with an open digital driver. - + $:dig The digital sound driver that this event system should use. $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). - $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. - Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. + $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. + Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. Use 0 to let Miles to allocate this buffer itself. $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). @@ -6633,8 +6633,8 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); $:return A handle to the event system to use in various high level functions. Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. - - To enqueue events to the new system, use $AIL_enqueue_event_system. + + To enqueue events to the new system, use $AIL_enqueue_event_system. To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. @@ -6646,7 +6646,7 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); /* Shuts down the Miles event system. - + This function will closes everything in the event system - it ignores reference counts. It will free all event memory, sound banks, and samples used by the system. */ @@ -6660,10 +6660,10 @@ DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char c $:return The handle to the newly loaded soundbank (zero on failure). This function opens the sound bank and makes it available to the event system. The filename - is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. + is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', and while using the name 'gamebank' for authoring and auditioning. - + Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds is played, or a sound requiring it plays. @@ -6685,7 +6685,7 @@ DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); Any other data references still existing (queued events, persisted presets, etc) will report errors when used, but will not crash. - + Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. @@ -6698,24 +6698,24 @@ DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name) (EXPAPI removed to prevent release in docs) Searches for an event by name in the event system. - + $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". $:return A pointer to the event contents (or 0, if the event isn't found). - + This function is normally used as the event parameter for $AIL_enqueue_event. It searches one or all open soundbanks for a particular event name. - - This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with + + This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with MILESEVENT_ENQUEUE_BY_NAME. - + Events that are not enqueued by name can not be tracked by the Auditioner. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to a specific system. Used only if you have multiple event systems running. - + $:system The event system to attach the event to. $:return See $AIL_enqueue_event for return description. @@ -6728,10 +6728,10 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); $:name The full name of the event, eg "soundbank/path/to/event". $:return See $AIL_enqueue_event for return description. - - This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. - - For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent + + This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. + + For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) For introduction to the auditioning system, see $integrating_events. @@ -6743,9 +6743,9 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); $:return A token used for passing to functions that add data to the event. - This is used to pass more data to an event that will be executed. For instance, if + This is used to pass more data to an event that will be executed. For instance, if an event is going to spatialize a sound, but there's no need to move the sound over the course of - its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a + its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a sound is started it will use that for its initial position, and there is no need to do any game object <-> event id tracking. @@ -6762,7 +6762,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); The enqueue process is still completely thread safe. No locks are used, however only 8 enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start - will yield the thread until a slot is open. + will yield the thread until a slot is open. The ONLY time that should happen is if events enqueues are started but never ended: @@ -6838,7 +6838,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as user_buffer is never dereferenced. - $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and + $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and carried with the event. During sound enumeration this buffer is made available, and you never have to worry about memory management. $- @@ -6855,7 +6855,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data->game_stat = 1; data->needed_info = 2; - // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound + // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound // completes and we're done using it in the enumeration loop. S32 ptr_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); @@ -6874,7 +6874,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data.game_stat = 1; data.needed_info = 2; - // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use + // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use // a stack variable like this S32 buf_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); @@ -6895,7 +6895,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* nam $:value The value of the variable to set. $:return 0 if the enqueue buffer is full - When a sound starts, the given variable will be set to the given value prior to any possible + When a sound starts, the given variable will be set to the given value prior to any possible references being used by presets. */ @@ -6904,7 +6904,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); Limits the effects of the event to sounds started by the given ID. $:token A token created with $AIL_enqueue_event_start - $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an + $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an event, it will apply to all sounds started by the event, and any events queued by that event. $:return 0 if the enqueue buffer is full @@ -6932,7 +6932,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); $:selection The value to use for selecting the sound to play. $:return 0 if the enqueue buffer is full - The selection index is used to programatically select a sound from the + The selection index is used to programatically select a sound from the loaded banks. The index passed in replaces any numeric value at the end of the sound name existing in any start sound event step. For example, if a start sound event plays "mybank/sound1", and the event is queued with @@ -6969,52 +6969,52 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* even As with all of the enqueue functions it is completely thread-safe. Upon completion of this function, the enqueue slot is release and available for another - $AIL_enqueue_event_start. + $AIL_enqueue_event_start. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. - - $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. + + $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. - $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. - This data is then accessible later, when enumerating the instances. + $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. + This data is then accessible later, when enumerating the instances. $:user_buffer_len Size of the buffer pointed to by user_buffer. $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, - when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if + when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you - execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. + execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. - $:return On success, returns QueuedID value that is unique to this queued event for the rest of this + $:return On success, returns QueuedID value that is unique to this queued event for the rest of this program run (you can use this ID to uniquely identify sounds triggered from this event). - + This function enqueues an event to be triggered - this is how you begin execution of an event. First, you queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to execute an event. - - This function is very lightweight. It does nothing more than post the event and data to a + + This function is very lightweight. It does nothing more than post the event and data to a command buffer that gets executed via $AIL_begin_event_queue_processing. The user_buffer parameter can be used in different ways. If no flags are passed in, then Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with the queued sound - you can then free the user_buffer data completely! This lets Miles keep track - of all your sound related memory directly and is the normal way to use the system (it is very + of all your sound related memory directly and is the normal way to use the system (it is very convenient once you get used to it). If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will simply be associated with each sound that this event may start. In this case, user_buffer_len is ignored. - - In both cases, when you later enumerate the sound instances, you can access your sound data + + In both cases, when you later enumerate the sound instances, you can access your sound data with the $(MILESEVENTSOUNDINFO::UserBuffer) field. - + You can call this function from any number threads - it's designed to be called from anywhere in your game. If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done - by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and + by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. */ @@ -7044,23 +7044,23 @@ DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); /* Begin execution of all of the enqueued events. - $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events + $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events (out of memory, bank file not found, bad data, etc). You can get the specific error by calling $AIL_last_error. - + This function executes all the events currently in the queue. This is where all major processing takes place in the event system. - + Once you execute this functions, then sound instances will be in one of three states: - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7082,7 +7082,7 @@ ${ MILESEVENTSOUNDINFO Info; HMSSENUM SoundEnum = MSS_FIRST; - while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) { game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue @@ -7098,13 +7098,13 @@ ${ } } - $AIL_complete_event_queue_processing( ); - $} - - Note that if any event step drastically fails, the rest of the command queue is + $AIL_complete_event_queue_processing( ); + $} + + Note that if any event step drastically fails, the rest of the command queue is skipped, and this function returns 0! For this reason, you shouldn't assume that a start sound event will always result in a completed sound later. - + Therefore, you should allocate memory that you want associated with a sound instance during the enumeration loop, rather than at enqueue time. Otherwise, you need to detect that the sound didn't start and then free the memory (which can be complicated). @@ -7120,7 +7120,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO HSTREAM Stream; void* UserBuffer; S32 UserBufferLen; - S32 Status; + S32 Status; U32 Flags; S32 UsedDelay; F32 UsedVolume; @@ -7130,10 +7130,10 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO } MILESEVENTSOUNDINFO; /* Sound instance data that is associated with each active sound instance. - + $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound - was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from + was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from $AIL_enqueue_event, and EventID represents the completion event. $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). $:Sample The $HSAMPLE for this playing sound. @@ -7148,7 +7148,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted and is only valid for the until the next call in to Miles. $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. - + This structure is returned by the $AIL_enumerate_sound_instances function. It returns information about an active sound instance. */ @@ -7157,7 +7157,7 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7183,14 +7183,14 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will // get 20. $} - + */ DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7265,7 +7265,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, the sound starting. Generally you don't need to do this manually, since the sound designer should do this, however if you need to restart a sound that stopped - for example a stream that went to error - you will have to set the start position via code. - + However, since there can be a delay between the time the sound is first seen in the sound iteration and the time it gets set to the data, start positions set via the low level miles calls can get lost, so use this. @@ -7281,11 +7281,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. - $:info Returns the data for each sound instance. + $:info Returns the data for each sound instance. $:return Returns 0 when enumeration is complete. Enumerates the sound instances. This will generally be used between - calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to + calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to manage the sound instances. The label_query is a list of labels to match, separated by commas. By default, comma-separated @@ -7302,11 +7302,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7315,7 +7315,7 @@ ${ HMSSENUM SoundEnum = MSS_FIRST; MILESEVENTSOUNDINFO Info; - while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) { if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) { @@ -7330,23 +7330,23 @@ $} EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; #define MILESEVENT_SOUND_STATUS_PENDING 0x1 -#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 +#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 #define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). - + These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. */ @@ -7360,13 +7360,13 @@ EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event and couldn't find anything in the loaded banks. $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, or a limit on the sound itself. - $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. + $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. The sound will start when sufficient data has been loaded to hopefully avoid a skip. $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible that the sound playback will catch up to the read position under poor I/O conditions. @@ -7375,7 +7375,7 @@ EXPTYPEEND sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media was removed during load, or the file was not found. - + These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances may have more than one flag, logically 'or'ed together. */ @@ -7383,16 +7383,16 @@ EXPTYPEEND DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); /* Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). - + $:return Returns 0 on failure. - This function must be called as a pair with $AIL_begin_event_queue_processing. - - In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't - started playing yet. Old sound instances that have finished playing are still valid - they - haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances + This function must be called as a pair with $AIL_begin_event_queue_processing. + + In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't + started playing yet. Old sound instances that have finished playing are still valid - they + haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances and frees the completed ones - it's the 2nd half of the event processing. - + Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound instances. */ @@ -7400,7 +7400,7 @@ DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a stop sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7408,7 +7408,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, this function accomplishes that, and is captured by the auditioner for replay. @@ -7417,7 +7417,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a pause sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7425,7 +7425,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, this function accomplishes that, and is captured by the auditioner for replay. @@ -7434,7 +7434,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a resume sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7442,17 +7442,17 @@ DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U6 Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, this function accomplishes that, and is captured by the auditioner for replay. */ -DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, +DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); /* Allows the programmer to manually enqueue a start sound event into the event system. - + $:bank The bank containing the sound to start. $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. @@ -7463,10 +7463,10 @@ DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. $:return Returns a non-zero EnqueueID on success. - Enqueues an event to start the specified sound asset. - + Enqueues an event to start the specified sound asset. + Usually the programmer should trigger an event that the sound designer has specifically - create to start the appropriate sounds, but this function gives the programmer + create to start the appropriate sounds, but this function gives the programmer manual control, if necessary. This function is not captured by the auditioner. */ @@ -7488,7 +7488,7 @@ DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char co Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based on the settings in the event step). - + Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. Note that this replaces those events, it does not supplement. */ @@ -7503,7 +7503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS that this pointer can change frame to frame and should be immediately copied to a client-allocated buffer if persistence is desired. $:return Returns 0 when enumeration is complete. - + This function lets you enumerate all the persisting presets that are currently active in the system. It is mostly a debugging aid. */ @@ -7511,12 +7511,12 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); /* Returns a big string describing the current state of the event system. - - $:return String description of current systems state. + + $:return String description of current systems state. This function is a debugging aid - it can be used to show all of the active allocations, active sounds, etc. - + You must delete the pointer returned from this function with $AIL_mem_free_lock. */ @@ -7535,7 +7535,7 @@ EXPTYPE typedef struct _MILESEVENTSTATE } MILESEVENTSTATE; /* returns the current state of the Miles Event System. - + $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. $:HeapRemaining The number of bytes in HeapSize that is remaining. @@ -7615,7 +7615,7 @@ EXPTYPE typedef struct _MILESBANKFUNCTIONS } MILESBANKFUNCTIONS; /* specifies callbacks for each of the Miles event system. - + $:FreeAll Callback that tells you to free all user-side bank memory. $:GetPreset Callback to retrieve a sound preset. $:GetEnvironment Callback to retrieve an environment preset. @@ -7645,13 +7645,13 @@ DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleC In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). - + */ DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); /* Allows you to override the internal bank file resource management.. - + $:Functions A pointer to a structure containing all the callback functions. This function is used to completely override the high-level resource management system. @@ -7856,7 +7856,7 @@ EXPTYPEEND $:MILES_PLAT_IPHONE Apple iDevices $:MILES_PLAT_LINUX Linux Flavors $:MILES_PLAT_WII Nintendo Wii - $:MILES_PLAT_PSP2 Sony NGP + $:MILES_PLAT_PSP2 Sony NGP Values representing the various platforms the high level tool allows. */ @@ -7891,11 +7891,11 @@ EXPGROUP(Miles High Level Event System) DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); /* Returns an information structure about the current state of the Miles Event System. - + $:system The system to retrieve information for, or zero for the default system. $:state A pointer to a structure to receive the state information. - This function is a debugging aid - it returns information for the event system. + This function is a debugging aid - it returns information for the event system. */ DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); @@ -7923,7 +7923,7 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); // Callback for the error handler. EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); /* - The function prototype to use for a callback that will be made when the event system + The function prototype to use for a callback that will be made when the event system encounters an unrecoverable error. $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. @@ -7937,7 +7937,7 @@ EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_ EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); /* The function definition to use when defining your own random function. - + You can define a function with this prototype and pass it to $AIL_register_random if you want to tie the Miles random calls in with your game's (for logging and such). */ @@ -7953,7 +7953,7 @@ DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_Error can sometimes be somewhat invisible. This function allows you to see what went wrong, when it went wrong. - The basic usage is to have the callback check $AIL_last_error() for the overall category of + The basic usage is to have the callback check $AIL_last_error() for the overall category of failure. The parameter passed to the callback might provide some context, but it can and will be zero on occasion. Generally it will represent the resource string that is being worked on when the error occurred. @@ -8009,7 +8009,7 @@ typedef C8 * (AILCALL *FLT_ERROR)(void); typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, MSS_FREE_TYPE * pfree, - UINTa user, + UINTa user, HDIGDRIVER dig, void * memory); typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); diff --git a/Minecraft.Client/PS3/Miles/include/rrCore.h b/Minecraft.Client/PS3/Miles/include/rrCore.h index 17ebee3a..e88b5f8c 100644 --- a/Minecraft.Client/PS3/Miles/include/rrCore.h +++ b/Minecraft.Client/PS3/Miles/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/PS3/Network/SonyRemoteStorage_PS3.cpp b/Minecraft.Client/PS3/Network/SonyRemoteStorage_PS3.cpp index e1d8dffa..bdd58e17 100644 --- a/Minecraft.Client/PS3/Network/SonyRemoteStorage_PS3.cpp +++ b/Minecraft.Client/PS3/Network/SonyRemoteStorage_PS3.cpp @@ -27,21 +27,21 @@ void SonyRemoteStorage_PS3::npauthhandler(int event, int result, void *arg) { #ifdef __PS3__ - if (event != SCE_NP_MANAGER_EVENT_GOT_TICKET || result <= 0) + if (event != SCE_NP_MANAGER_EVENT_GOT_TICKET || result <= 0) { app.DebugPrintf("Could not retrieve ticket: 0x%x\n", result); - } - else + } + else { psnTicketSize = result; psnTicket = malloc(psnTicketSize); - if (psnTicket == NULL) + if (psnTicket == NULL) { app.DebugPrintf("Failed to allocate for ticket\n"); } int ret = sceNpManagerGetTicket(psnTicket, &psnTicketSize); - if (ret < 0) + if (ret < 0) { app.DebugPrintf("Could not retrieve ticket: 0x%x\n", ret); free(psnTicket); @@ -60,7 +60,7 @@ int SonyRemoteStorage_PS3::initPreconditions() SceNpId npId; ret = sceNpManagerGetNpId(&npId); - if(ret < 0) + if(ret < 0) { return ret; } @@ -68,12 +68,12 @@ int SonyRemoteStorage_PS3::initPreconditions() ticketVersion.major = 3; ticketVersion.minor = 0; ret = sceNpManagerRequestTicket2(&npId, &ticketVersion, TICKETING_SERVICE_ID, NULL, 0, NULL, 0); - if(ret < 0) + if(ret < 0) { return ret; } m_waitingForTicket = true; - while(m_waitingForTicket) + while(m_waitingForTicket) { cellSysutilCheckCallback(); sys_timer_usleep(50000); //50 milliseconds. @@ -104,12 +104,12 @@ void SonyRemoteStorage_PS3::internalCallback(const SceRemoteStorageEvent event, break; case GET_DATA_RESULT: - if(retCode >= 0) + if(retCode >= 0) { app.DebugPrintf("Get Data success \n"); m_status = e_getDataSucceeded; - } - else + } + else { app.DebugPrintf("An error occurred while Get Data was being processed. retCode: 0x%x \n", retCode); m_status = e_error; @@ -126,12 +126,12 @@ void SonyRemoteStorage_PS3::internalCallback(const SceRemoteStorageEvent event, break; case GET_STATUS_RESULT: - if(retCode >= 0) + if(retCode >= 0) { app.DebugPrintf("Get Status success \n"); app.DebugPrintf("Remaining Syncs for this user: %llu\n", outputGetStatus->remainingSyncs); app.DebugPrintf("Number of files on the cloud: %d\n", outputGetStatus->numFiles); - for(int i = 0; i < outputGetStatus->numFiles; i++) + for(int i = 0; i < outputGetStatus->numFiles; i++) { app.DebugPrintf("\n*** File %d information: ***\n", (i + 1)); app.DebugPrintf("File name: %s \n", outputGetStatus->data[i].fileName); @@ -142,8 +142,8 @@ void SonyRemoteStorage_PS3::internalCallback(const SceRemoteStorageEvent event, app.DebugPrintf("Visibility: \"%s\" \n", (outputGetStatus->data[i].visibility == 0)?"Private":((outputGetStatus->data[i].visibility == 1)?"Public read only":"Public read and write")); } m_status = e_getStatusSucceeded; - } - else + } + else { app.DebugPrintf("An error occurred while Get Status was being processed. retCode: 0x%x \n", retCode); m_status = e_error; @@ -158,12 +158,12 @@ void SonyRemoteStorage_PS3::internalCallback(const SceRemoteStorageEvent event, break; case SET_DATA_RESULT: - if(retCode >= 0) + if(retCode >= 0) { app.DebugPrintf("Set Data success \n"); m_status = e_setDataSucceeded; - } - else + } + else { app.DebugPrintf("An error occurred while Set Data was being processed. retCode: 0x%x \n", retCode); m_status = e_error; @@ -230,7 +230,7 @@ bool SonyRemoteStorage_PS3::init(CallbackFunc cb, LPVOID lpParam) params.callback = staticInternalCallback; params.userData = this; params.thread.threadAffinity = 0; //Not used in PS3 - params.thread.threadPriority = 1000; //Must be between [0-3071], being 0 the highest. + params.thread.threadPriority = 1000; //Must be between [0-3071], being 0 the highest. params.psnTicket = psnTicket; params.psnTicketSize = psnTicketSize; strcpy(params.clientId, CLIENT_ID); @@ -246,20 +246,20 @@ bool SonyRemoteStorage_PS3::init(CallbackFunc cb, LPVOID lpParam) // SceRemoteStorageAbortReqParams abortParams; ret = sceRemoteStorageInit(params); - if(ret >= 0 || ret == SCE_REMOTE_STORAGE_ERROR_ALREADY_INITIALISED) + if(ret >= 0 || ret == SCE_REMOTE_STORAGE_ERROR_ALREADY_INITIALISED) { // abortParams.requestId = ret; //ret = sceRemoteStorageAbort(abortParams); app.DebugPrintf("Session will be created \n"); - //if(ret >= 0) + //if(ret >= 0) //{ // printf("Session aborted \n"); - //} else + //} else //{ // printf("Error aborting session: 0x%x \n", ret); //} - } - else + } + else { app.DebugPrintf("Error creating session: 0x%x \n", ret); return false; @@ -279,12 +279,12 @@ bool SonyRemoteStorage_PS3::getRemoteFileInfo(SceRemoteStorageStatus* pInfo, Cal reqId = sceRemoteStorageGetStatus(params, outputGetStatus); m_status = e_getStatusInProgress; - if(reqId >= 0) + if(reqId >= 0) { app.DebugPrintf("Get Status request sent \n"); return true; - } - else + } + else { app.DebugPrintf("Error sending Get Status request: 0x%x \n", reqId); return false; @@ -303,11 +303,11 @@ void SonyRemoteStorage_PS3::abort() params.requestId = reqId; int ret = sceRemoteStorageAbort(params); - if(ret >= 0) + if(ret >= 0) { app.DebugPrintf("Abort request done \n"); - } - else + } + else { app.DebugPrintf("Error in Abort request: 0x%x \n", ret); } @@ -345,7 +345,7 @@ bool SonyRemoteStorage_PS3::setDataInternal() char seed[22]; app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); - int64_t iSeed = strtoll(seed,NULL,10); + __int64 iSeed = strtoll(seed,NULL,10); char seedHex[17]; sprintf(seedHex,"%016llx",iSeed); memcpy(descData.m_seed,seedHex,16); // Don't copy null @@ -377,14 +377,14 @@ bool SonyRemoteStorage_PS3::setDataInternal() reqId = sceRemoteStorageSetData(params); app.DebugPrintf("\n*******************************\n"); - if(reqId >= 0) + if(reqId >= 0) { app.DebugPrintf("Set Data request sent \n"); m_bTransferStarted = true; m_status = e_setDataInProgress; return true; - } - else + } + else { app.DebugPrintf("Error sending Set Data request: 0x%x \n", reqId); return false; @@ -406,12 +406,12 @@ bool SonyRemoteStorage_PS3::getData( const char* remotePath, const char* localPa reqId = sceRemoteStorageGetData(params, &outputGetData); app.DebugPrintf("\n*******************************\n"); - if(reqId >= 0) + if(reqId >= 0) { app.DebugPrintf("Get Data request sent \n"); m_bTransferStarted = true; m_status = e_getDataInProgress; - } else + } else { app.DebugPrintf("Error sending Get Data request: 0x%x \n", reqId); } diff --git a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Server/HeapInspectorServerTypes.h b/Minecraft.Client/PS3/PS3Extras/HeapInspector/Server/HeapInspectorServerTypes.h index 9365458d..134059db 100644 --- a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Server/HeapInspectorServerTypes.h +++ b/Minecraft.Client/PS3/PS3Extras/HeapInspector/Server/HeapInspectorServerTypes.h @@ -16,8 +16,8 @@ typedef unsigned int uint32; typedef unsigned long long uint64; typedef long long int64; #else - typedef uint64_t uint64; - typedef int64_t int64; + typedef unsigned __int64 uint64; + typedef __int64 int64; #endif typedef char int8; diff --git a/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.cpp b/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.cpp index 8387868f..47cd7106 100644 --- a/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.cpp +++ b/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #undef __in #undef __out #include @@ -31,49 +31,49 @@ vector vOpenFileHandles; namespace boost { void assertion_failed(char const * expr, - char const * function, char const * file, long line) - { + char const * function, char const * file, long line) + { #ifndef _CONTENT_PACKAGE - printf("Assert failed!!!\n"); - printf(expr); - printf("\n"); - printf("----------------------\n %s failed. File %s at line %d \n----------------------\n", function, file, line); + printf("Assert failed!!!\n"); + printf(expr); + printf("\n"); + printf("----------------------\n %s failed. File %s at line %d \n----------------------\n", function, file, line); snPause(); #endif } // user defined } // namespace boost - char* getConsoleHomePath() - { - return contentInfoPath; + char* getConsoleHomePath() + { + return contentInfoPath; } -char* getUsrDirPath() -{ - return usrdirPath; +char* getUsrDirPath() +{ + return usrdirPath; } -char* getConsoleHomePathBDPatch() -{ - return contentInfoPathBDPatch; +char* getConsoleHomePathBDPatch() +{ + return contentInfoPathBDPatch; } -char* getUsrDirPathBDPatch() -{ - return usrdirPathBDPatch; +char* getUsrDirPathBDPatch() +{ + return usrdirPathBDPatch; } -char* getDirName() -{ - return dirName; +char* getDirName() +{ + return dirName; } int _wcsicmp( const wchar_t * dst, const wchar_t * src ) { wchar_t f,l; - // validation section + // validation section // _VALIDATE_RETURN(dst != NULL, EINVAL, _NLSCMPERROR); // _VALIDATE_RETURN(src != NULL, EINVAL, _NLSCMPERROR); @@ -101,7 +101,7 @@ size_t wcsnlen(const wchar_t *wcs, size_t maxsize) Cnullptr nullptr; -VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) +VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) { CellRtcDateTime dateTime; int err = cellRtcGetCurrentClock(&dateTime, 0); @@ -118,8 +118,8 @@ VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) } BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { PS3_STUBBED; return false; } BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) { PS3_STUBBED; return false; } -VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) -{ +VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) +{ CellRtcDateTime dateTime; int err = cellRtcGetCurrentClockLocalTime(&dateTime); assert(err == CELL_OK); @@ -135,26 +135,26 @@ VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) } HANDLE CreateEvent(void* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName) { PS3_STUBBED; return NULL; } -VOID Sleep(DWORD dwMilliseconds) -{ +VOID Sleep(DWORD dwMilliseconds) +{ C4JThread::Sleep(dwMilliseconds); } BOOL SetThreadPriority(HANDLE hThread, int nPriority) { PS3_STUBBED; return FALSE; } DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { PS3_STUBBED; return false; } -LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) -{ +LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) +{ return cellAtomicCompareAndSwap32((uint32_t*)Destination, (uint32_t)Comperand, (uint32_t)Exchange); } -LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) -{ +LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) +{ return cellAtomicCompareAndSwap64((uint64_t*)Destination, (uint64_t)Comperand, (uint64_t)Exchange); } -VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) { sys_lwmutex_attribute_t attr; // from the defaults in sys_lwmutex_attribute_initialize @@ -167,7 +167,7 @@ VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) } -VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) +VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) { // no spin count on PS3 InitializeCriticalSection(CriticalSection); @@ -179,9 +179,9 @@ VOID DeleteCriticalSection(PCRITICAL_SECTION CriticalSection) PS3_ASSERT_CELL_ERROR(err); } -extern CRITICAL_SECTION g_singleThreadCS; +extern CRITICAL_SECTION g_singleThreadCS; -VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) { // if(CriticalSection != &g_singleThreadCS &&(C4JThread::isMainThread() == false) ) // LeaveCriticalSection(&g_singleThreadCS); @@ -192,7 +192,7 @@ VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) } -VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) { int err = sys_lwmutex_unlock(CriticalSection); PS3_ASSERT_CELL_ERROR(err); @@ -200,7 +200,7 @@ VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) ULONG TryEnterCriticalSection(PCRITICAL_SECTION CriticalSection) { - int err = sys_lwmutex_trylock(CriticalSection); + int err = sys_lwmutex_trylock(CriticalSection); if(err == CELL_OK) return true; return false; @@ -209,8 +209,8 @@ DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles,BOOL bWaitAll -BOOL CloseHandle(HANDLE hObject) -{ +BOOL CloseHandle(HANDLE hObject) +{ if(hObject==INVALID_HANDLE_VALUE) { //printf("\n\nTRYING TO CLOSE AN INVALID FILE HANDLE\n\n"); @@ -219,7 +219,7 @@ BOOL CloseHandle(HANDLE hObject) else { CellFsErrno err; - err=cellFsClose(int(hObject)); + err=cellFsClose(int(hObject)); if(err==CELL_FS_SUCCEEDED) { iFilesOpen--; @@ -235,7 +235,7 @@ BOOL CloseHandle(HANDLE hObject) } } //printf("\n\nFiles Open - %d\n\n",iFilesOpen); - return true; + return true; } else { @@ -249,8 +249,8 @@ BOOL SetEvent(HANDLE hEvent) { PS3_STUBBED; return false; } HMODULE GetModuleHandle(LPCSTR lpModuleName) { PS3_STUBBED; return 0; } -sys_ppu_thread_t GetCurrentThreadId(VOID) -{ +sys_ppu_thread_t GetCurrentThreadId(VOID) +{ sys_ppu_thread_t id; int err = sys_ppu_thread_get_id(&id); PS3_ASSERT_CELL_ERROR(err); @@ -264,8 +264,8 @@ BOOL TlsFree(DWORD dwTlsIndex) { return TLSStoragePS3::Instance()->Free(dwTlsInd LPVOID TlsGetValue(DWORD dwTlsIndex) { return TLSStoragePS3::Instance()->GetValue(dwTlsIndex); } BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { return TLSStoragePS3::Instance()->SetValue(dwTlsIndex, lpTlsValue); } -LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) -{ +LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) +{ int err; sys_addr_t newAddress = NULL; if(lpAddress == NULL) @@ -299,7 +299,7 @@ LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWO return (LPVOID)newAddress; } -BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) +BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) { if(dwFreeType == MEM_DECOMMIT) { @@ -307,12 +307,12 @@ BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) sys_vm_statistics_t stat; err = sys_vm_get_statistics((sys_addr_t)lpAddress, &stat); PS3_ASSERT(err == CELL_OK); - + // 4J Stu - We can only return what we have actually committed on PS3 // From PS3 Docs: // The maximum amount of memory that can be returned is the difference of the total amount of physical memory used by the virtual memory area minus 1MB. When an amount exceeding this value is specified, EBUSY will return. SIZE_T memToFree = stat.pmem_total - (1024 * 1024); - if(dwSize < memToFree) + if(dwSize < memToFree) memToFree = dwSize; app.DebugPrintf("VirtualFree: Requested size - %d, Actual size - %d\n", dwSize, memToFree); @@ -349,10 +349,10 @@ BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPD uint64_t bytesWritten; CellFsErrno err = cellFsWrite(fd, lpBuffer, nNumberOfBytesToWrite, &bytesWritten); *lpNumberOfBytesWritten = (DWORD)bytesWritten; - return (err == CELL_FS_OK); + return (err == CELL_FS_OK); } -BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) +BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) { int fd = (int)hFile; uint64_t bytesRead; @@ -374,7 +374,7 @@ BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD break; } - return (err==CELL_FS_SUCCEEDED); + return (err==CELL_FS_SUCCEEDED); } BOOL SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) @@ -407,7 +407,7 @@ void replaceBackslashes(char* szFilename) } } -HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { char filePath[256]; std::string mountedPath; @@ -445,7 +445,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, int fd = 0; int flags = 0; switch(dwDesiredAccess) - { + { case GENERIC_READ: flags = CELL_FS_O_RDONLY; break; case GENERIC_WRITE: @@ -508,7 +508,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, switch(err) { case CELL_FS_SUCCEEDED: - { + { app.DebugPrintf("CELL_FS_SUCCEEDED\n"); DWORD dwFileSize = (DWORD)statData.st_size; @@ -522,7 +522,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, // fd is invalid or the file system on a removable media has been unmounted // When cellFsFstat() returns CELL_FS_EBADF, it can be deduced that the above error occurred because a disc was ejected. - // Explicitly call cellFsClose() and close the applicable file. When using stream supporting APIs, call cellFsStReadFinish() before calling cellFsClose(). + // Explicitly call cellFsClose() and close the applicable file. When using stream supporting APIs, call cellFsStReadFinish() before calling cellFsClose(). app.DebugPrintf("CELL_FS_EBADF\n"); CloseHandle((HANDLE)fd); @@ -531,7 +531,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, //ShutdownManager::StartShutdown(); return INVALID_HANDLE_VALUE; - + case CELL_FS_EIO: app.DebugPrintf("CELL_FS_EIO\n"); break; @@ -550,8 +550,8 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, return (void*)fd; } -BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) -{ +BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) +{ char filePath[256]; sprintf(filePath,"%s/%s",usrdirPath, lpPathName ); CellFsErrno err = cellFsMkdir(filePath, CELL_FS_DEFAULT_CREATE_MODE_1); @@ -563,12 +563,12 @@ BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttribu BOOL DeleteFileA(LPCSTR lpFileName) { PS3_STUBBED; return false; } -// BOOL XCloseHandle(HANDLE a) -// { -// cellFsClose(int(a)); +// BOOL XCloseHandle(HANDLE a) +// { +// cellFsClose(int(a)); // } -DWORD GetFileAttributesA(LPCSTR lpFileName) +DWORD GetFileAttributesA(LPCSTR lpFileName) { char filePath[256]; std::string mountedPath = StorageManager.GetMountedPath(lpFileName); @@ -582,7 +582,7 @@ DWORD GetFileAttributesA(LPCSTR lpFileName) sprintf(filePath,"%s/%s",usrdirPath, lpFileName ); // set to load from host //strcat(filePath,".edat"); - + //printf("GetFileAttributesA - %s\n",filePath); // check if the file exists first @@ -606,7 +606,7 @@ VOID DebugBreak(VOID) { snPause(); } DWORD GetLastError(VOID) { PS3_STUBBED; return 0; } -VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) +VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) { malloc_managed_size stat; int err = malloc_stats(&stat); @@ -620,20 +620,20 @@ VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) lpBuffer->dwAvailVirtual = stat.max_system_size - stat.current_inuse_size; } -DWORD GetTickCount() +DWORD GetTickCount() { - // This function returns the current system time at this function is called. + // This function returns the current system time at this function is called. // The system time is represented the time elapsed since the system starts up in microseconds. system_time_t sysTime = sys_time_get_system_time(); - return sysTime / 1000; + return sysTime / 1000; } // we should really use libperf for this kind of thing, but this will do for now. -BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) -{ +BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) +{ // microseconds - lpFrequency->QuadPart = (1000 * 1000); - return false; + lpFrequency->QuadPart = (1000 * 1000); + return false; } BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { @@ -646,24 +646,24 @@ BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) } #ifndef _FINAL_BUILD -VOID OutputDebugStringW(LPCWSTR lpOutputString) -{ - wprintf(lpOutputString); +VOID OutputDebugStringW(LPCWSTR lpOutputString) +{ + wprintf(lpOutputString); } -VOID OutputDebugString(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugString(LPCSTR lpOutputString) +{ + printf(lpOutputString); } -VOID OutputDebugStringA(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugStringA(LPCSTR lpOutputString) +{ + printf(lpOutputString); } #endif // _CONTENT_PACKAGE BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation) -{ +{ PS3_STUBBED; return false; } @@ -671,7 +671,7 @@ HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) { PS3 BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) { PS3_STUBBED; return false;} errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%d",_Value); else if(_Radix==16) sprintf(_DstBuf,"%lx",_Value); else return -1; return 0; } -errno_t _i64toa_s(int64_t _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } int _wtoi(const wchar_t *_Str) { @@ -680,13 +680,13 @@ int _wtoi(const wchar_t *_Str) -DWORD XGetLanguage() -{ +DWORD XGetLanguage() +{ unsigned char ucLang = app.GetMinecraftLanguage(0); int iLang; // check if we should override the system language or not - if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) + if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) { cellSysutilGetSystemParamInt(CELL_SYSUTIL_SYSTEMPARAM_ID_LANG,&iLang); } @@ -701,7 +701,7 @@ DWORD XGetLanguage() case CELL_SYSUTIL_LANG_ENGLISH_US : return XC_LANGUAGE_ENGLISH; case CELL_SYSUTIL_LANG_FRENCH : return XC_LANGUAGE_FRENCH; - case CELL_SYSUTIL_LANG_SPANISH : + case CELL_SYSUTIL_LANG_SPANISH : if(app.IsAmericanSKU()) { return XC_LANGUAGE_LATINAMERICANSPANISH; @@ -714,7 +714,7 @@ DWORD XGetLanguage() case CELL_SYSUTIL_LANG_GERMAN : return XC_LANGUAGE_GERMAN; case CELL_SYSUTIL_LANG_ITALIAN : return XC_LANGUAGE_ITALIAN; case CELL_SYSUTIL_LANG_PORTUGUESE_PT : return XC_LANGUAGE_PORTUGUESE; - + case CELL_SYSUTIL_LANG_RUSSIAN : return XC_LANGUAGE_RUSSIAN; case CELL_SYSUTIL_LANG_KOREAN : return XC_LANGUAGE_KOREAN; case CELL_SYSUTIL_LANG_CHINESE_T : return XC_LANGUAGE_TCHINESE; @@ -735,8 +735,8 @@ DWORD XGetLanguage() } } -DWORD XGetLocale() -{ +DWORD XGetLocale() +{ int iLang; cellSysutilGetSystemParamInt(CELL_SYSUTIL_SYSTEMPARAM_ID_LANG,&iLang); switch(iLang) @@ -745,7 +745,7 @@ DWORD XGetLocale() case CELL_SYSUTIL_LANG_ENGLISH_US : return XC_LOCALE_UNITED_STATES; case CELL_SYSUTIL_LANG_FRENCH : return XC_LOCALE_FRANCE; - case CELL_SYSUTIL_LANG_SPANISH : + case CELL_SYSUTIL_LANG_SPANISH : if(app.IsAmericanSKU()) { return XC_LOCALE_LATIN_AMERICA; @@ -753,7 +753,7 @@ DWORD XGetLocale() else { return XC_LOCALE_SPAIN; - } + } return XC_LOCALE_SPAIN; case CELL_SYSUTIL_LANG_GERMAN : return XC_LOCALE_GERMANY; @@ -777,11 +777,11 @@ DWORD XGetLocale() case CELL_SYSUTIL_LANG_CHINESE_S : return XC_LOCALE_CHINA; default : return XC_LOCALE_UNITED_STATES; - } + } } -DWORD XEnableGuestSignin(BOOL fEnable) -{ - return 0; +DWORD XEnableGuestSignin(BOOL fEnable) +{ + return 0; } #endif // __PS3__ diff --git a/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.h b/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.h index 8f1b489d..f24a3b92 100644 --- a/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.h +++ b/Minecraft.Client/PS3/PS3Extras/Ps3Stubs.h @@ -29,7 +29,7 @@ LPVOID TlsGetValue(DWORD dwTlsIndex); BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); -typedef struct _RECT +typedef struct _RECT { LONG left; LONG top; @@ -53,16 +53,16 @@ typedef int errno_t; // // The following field is used for blocking when there is contention for // // the resource // // -// +// // union { // ULONG_PTR RawEvent[4]; // } Synchronization; -// +// // // // // The following three fields control entering and exiting the critical // // section for the resource // // -// +// // LONG LockCount; // LONG RecursionCount; // HANDLE OwningThread; @@ -219,7 +219,7 @@ typedef struct _MEMORYSTATUS { #define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE #define WAIT_TIMEOUT 258L -#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) +#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) #define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) #define MAXUINT_PTR (~((UINT_PTR)0)) @@ -261,17 +261,17 @@ typedef struct _MEMORYSTATUS { #define GENERIC_EXECUTE (0x20000000L) #define GENERIC_ALL (0x10000000L) -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_ATTRIBUTE_READONLY 0x00000001 -#define FILE_ATTRIBUTE_HIDDEN 0x00000002 -#define FILE_ATTRIBUTE_SYSTEM 0x00000004 -#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 -#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 -#define FILE_ATTRIBUTE_DEVICE 0x00000040 -#define FILE_ATTRIBUTE_NORMAL 0x00000080 -#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 #define FILE_FLAG_WRITE_THROUGH 0x80000000 #define FILE_FLAG_OVERLAPPED 0x40000000 @@ -291,38 +291,38 @@ typedef struct _MEMORYSTATUS { #define OPEN_ALWAYS 4 #define TRUNCATE_EXISTING 5 -#define PAGE_NOACCESS 0x01 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 -#define PAGE_USER_READONLY 0x1000 -#define PAGE_USER_READWRITE 0x2000 -#define MEM_COMMIT 0x1000 -#define MEM_RESERVE 0x2000 -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 -#define MEM_FREE 0x10000 -#define MEM_PRIVATE 0x20000 -#define MEM_RESET 0x80000 -#define MEM_TOP_DOWN 0x100000 -#define MEM_NOZERO 0x800000 -#define MEM_LARGE_PAGES 0x20000000 -#define MEM_HEAP 0x40000000 -#define MEM_16MB_PAGES 0x80000000 +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 +#define PAGE_USER_READONLY 0x1000 +#define PAGE_USER_READWRITE 0x2000 +#define MEM_COMMIT 0x1000 +#define MEM_RESERVE 0x2000 +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 +#define MEM_FREE 0x10000 +#define MEM_PRIVATE 0x20000 +#define MEM_RESET 0x80000 +#define MEM_TOP_DOWN 0x100000 +#define MEM_NOZERO 0x800000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_HEAP 0x40000000 +#define MEM_16MB_PAGES 0x80000000 #define IGNORE 0 // Ignore signal #define INFINITE 0xFFFFFFFF // Infinite timeout #define WAIT_FAILED ((DWORD)0xFFFFFFFF) -#define STATUS_WAIT_0 ((DWORD )0x00000000L) +#define STATUS_WAIT_0 ((DWORD )0x00000000L) #define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) -#define STATUS_PENDING ((DWORD )0x00000103L) +#define STATUS_PENDING ((DWORD )0x00000103L) #define STILL_ACTIVE STATUS_PENDING DWORD GetLastError(VOID); @@ -364,11 +364,11 @@ VOID OutputDebugString(LPCSTR lpOutputString); VOID OutputDebugStringA(LPCSTR lpOutputString); errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix); -errno_t _i64toa_s(int64_t _Val, char * _DstBuf, size_t _Size, int _Radix); +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix); int _wtoi(const wchar_t *_Str); -#define __declspec(a) +#define __declspec(a) extern "C" int _wcsicmp (const wchar_t * dst, const wchar_t * src); size_t wcsnlen(const wchar_t *wcs, size_t maxsize); diff --git a/Minecraft.Client/PS3/PS3Extras/Ps3Types.h b/Minecraft.Client/PS3/PS3Extras/Ps3Types.h index ade37607..b6cf351d 100644 --- a/Minecraft.Client/PS3/PS3Extras/Ps3Types.h +++ b/Minecraft.Client/PS3/PS3Extras/Ps3Types.h @@ -35,22 +35,22 @@ using boost::hash; // user the pool_allocator for all unordered_set and unordered_map instances -// template < class T, class H = hash, class P = std::equal_to, class A = boost::pool_allocator > -// class unordered_set : public std::tr1::unordered_set +// template < class T, class H = hash, class P = std::equal_to, class A = boost::pool_allocator > +// class unordered_set : public std::tr1::unordered_set // {}; -// -// template , class P = std::equal_to, class A = boost::pool_allocator > > -// class unordered_map : public std::tr1::unordered_map +// +// template , class P = std::equal_to, class A = boost::pool_allocator > > +// class unordered_map : public std::tr1::unordered_map // {}; -// template < class T, class H = hash, class P = std::equal_to, class A = C4JPoolAllocator > -// class unordered_set : public std::tr1::unordered_set +// template < class T, class H = hash, class P = std::equal_to, class A = C4JPoolAllocator > +// class unordered_set : public std::tr1::unordered_set // {}; -// -// template , class P = std::equal_to, class A = C4JPoolAllocator > > -// class unordered_map : public std::tr1::unordered_map +// +// template , class P = std::equal_to, class A = C4JPoolAllocator > > +// class unordered_map : public std::tr1::unordered_map // {}; @@ -111,19 +111,21 @@ typedef unsigned int *PUINT; typedef unsigned char byte; +typedef long long __int64; +typedef unsigned long long __uint64; typedef unsigned long DWORD; typedef int INT; typedef unsigned long ULONG_PTR, *PULONG_PTR; typedef ULONG_PTR SIZE_T, *PSIZE_T; -typedef int64_t LONG64, *PLONG64; +typedef __int64 LONG64, *PLONG64; #define VOID void typedef char CHAR; typedef short SHORT; typedef long LONG; -typedef long long LONGLONG; -typedef unsigned long long ULONGLONG; +typedef __int64 LONGLONG; +typedef __uint64 ULONGLONG; #define CONST const diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/detail/polymorphic_iarchive_route.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/detail/polymorphic_iarchive_route.hpp index f46a1681..d93bb79c 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/detail/polymorphic_iarchive_route.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/detail/polymorphic_iarchive_route.hpp @@ -138,10 +138,10 @@ private: ArchiveImplementation::load(t); } #elif defined(BOOST_HAS_MS_INT64) - virtual void load(int64_t & t){ + virtual void load(__int64 & t){ ArchiveImplementation::load(t); } - virtual void load(uint64_t & t){ + virtual void load(unsigned __int64 & t){ ArchiveImplementation::load(t); } #endif @@ -187,7 +187,7 @@ public: } // register type function template - const basic_pointer_iserializer * + const basic_pointer_iserializer * register_type(T * t = NULL){ return ArchiveImplementation::register_type(t); } 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 ce780c84..2f76cf26 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 @@ -17,7 +17,7 @@ // See http://www.boost.org for updates, documentation, and revision history. #include // std::size_t -#include // ULONG_MAX +#include // ULONG_MAX #include #include @@ -83,8 +83,8 @@ public: virtual void load(boost::long_long_type & t) = 0; virtual void load(boost::ulong_long_type & t) = 0; #elif defined(BOOST_HAS_MS_INT64) - virtual void load(int64_t & t) = 0; - virtual void load(uint64_t & t) = 0; + virtual void load(__int64 & t) = 0; + virtual void load(unsigned __int64 & t) = 0; #endif virtual void load(float & t) = 0; @@ -161,10 +161,10 @@ public: // special esteem in the boost library - we included it here by default. #include -namespace boost { +namespace boost { namespace archive { -class polymorphic_iarchive : +class polymorphic_iarchive : public polymorphic_iarchive_impl, public detail::shared_ptr_helper { 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 183140ee..420029b5 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 @@ -17,7 +17,7 @@ // See http://www.boost.org for updates, documentation, and revision history. #include // size_t -#include // ULONG_MAX +#include // ULONG_MAX #include #include @@ -82,8 +82,8 @@ public: virtual void save(const boost::long_long_type t) = 0; virtual void save(const boost::ulong_long_type t) = 0; #elif defined(BOOST_HAS_MS_INT64) - virtual void save(const int64_t t) = 0; - virtual void save(const uint64_t t) = 0; + virtual void save(const __int64 t) = 0; + virtual void save(const unsigned __int64 t) = 0; #endif virtual void save(const float t) = 0; @@ -141,7 +141,7 @@ public: }; // note: preserve naming symmetry -class polymorphic_oarchive : +class polymorphic_oarchive : public polymorphic_oarchive_impl { public: diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/old_win_sdk_compat.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/old_win_sdk_compat.hpp index 5db437d8..fcc27cf2 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/old_win_sdk_compat.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/old_win_sdk_compat.hpp @@ -41,7 +41,7 @@ namespace detail { enum { sockaddr_storage_maxsize = 128, // Maximum size. - sockaddr_storage_alignsize = (sizeof(int64_t)), // Desired alignment. + sockaddr_storage_alignsize = (sizeof(__int64)), // Desired alignment. sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)), sockaddr_storage_pad2size = (sockaddr_storage_maxsize - (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize)) @@ -51,7 +51,7 @@ struct sockaddr_storage_emulation { short ss_family; char __ss_pad1[sockaddr_storage_pad1size]; - int64_t __ss_align; + __int64 __ss_align; char __ss_pad2[sockaddr_storage_pad2size]; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/atomic/detail/interlocked.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/atomic/detail/interlocked.hpp index 86bd03f0..84a71316 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/atomic/detail/interlocked.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/atomic/detail/interlocked.hpp @@ -94,12 +94,12 @@ #pragma intrinsic(_InterlockedOr64) #pragma intrinsic(_InterlockedXor64) -#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) _InterlockedCompareExchange64((int64_t*)(dest), (int64_t)(exchange), (int64_t)(compare)) -#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) _InterlockedExchangeAdd64((int64_t*)(dest), (int64_t)(addend)) -#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) _InterlockedExchange64((int64_t*)(dest), (int64_t)(newval)) -#define BOOST_ATOMIC_INTERLOCKED_AND64(dest, arg) _InterlockedAnd64((int64_t*)(dest), (int64_t)(arg)) -#define BOOST_ATOMIC_INTERLOCKED_OR64(dest, arg) _InterlockedOr64((int64_t*)(dest), (int64_t)(arg)) -#define BOOST_ATOMIC_INTERLOCKED_XOR64(dest, arg) _InterlockedXor64((int64_t*)(dest), (int64_t)(arg)) +#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) _InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare)) +#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) _InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend)) +#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) _InterlockedExchange64((__int64*)(dest), (__int64)(newval)) +#define BOOST_ATOMIC_INTERLOCKED_AND64(dest, arg) _InterlockedAnd64((__int64*)(dest), (__int64)(arg)) +#define BOOST_ATOMIC_INTERLOCKED_OR64(dest, arg) _InterlockedOr64((__int64*)(dest), (__int64)(arg)) +#define BOOST_ATOMIC_INTERLOCKED_XOR64(dest, arg) _InterlockedXor64((__int64*)(dest), (__int64)(arg)) #pragma intrinsic(_InterlockedCompareExchangePointer) #pragma intrinsic(_InterlockedExchangePointer) @@ -128,9 +128,9 @@ #if defined(_WIN64) -#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) InterlockedCompareExchange64((int64_t*)(dest), (int64_t)(exchange), (int64_t)(compare)) -#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) InterlockedExchange64((int64_t*)(dest), (int64_t)(newval)) -#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) InterlockedExchangeAdd64((int64_t*)(dest), (int64_t)(addend)) +#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare)) +#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) InterlockedExchange64((__int64*)(dest), (__int64)(newval)) +#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend)) #define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare)) #define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) InterlockedExchangePointer((void**)(dest), (void*)(newval)) @@ -168,16 +168,16 @@ BOOST_ATOMIC_INTERLOCKED_IMPORT long __stdcall InterlockedExchangeAdd(long volat #if defined(_WIN64) -BOOST_ATOMIC_INTERLOCKED_IMPORT int64_t __stdcall InterlockedCompareExchange64(int64_t volatile*, int64_t, int64_t); -BOOST_ATOMIC_INTERLOCKED_IMPORT int64_t __stdcall InterlockedExchange64(int64_t volatile*, int64_t); -BOOST_ATOMIC_INTERLOCKED_IMPORT int64_t __stdcall InterlockedExchangeAdd64(int64_t volatile*, int64_t); +BOOST_ATOMIC_INTERLOCKED_IMPORT __int64 __stdcall InterlockedCompareExchange64(__int64 volatile*, __int64, __int64); +BOOST_ATOMIC_INTERLOCKED_IMPORT __int64 __stdcall InterlockedExchange64(__int64 volatile*, __int64); +BOOST_ATOMIC_INTERLOCKED_IMPORT __int64 __stdcall InterlockedExchangeAdd64(__int64 volatile*, __int64); BOOST_ATOMIC_INTERLOCKED_IMPORT void* __stdcall InterlockedCompareExchangePointer(void* volatile *, void*, void*); BOOST_ATOMIC_INTERLOCKED_IMPORT void* __stdcall InterlockedExchangePointer(void* volatile *, void*); -#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) boost::atomics::detail::InterlockedCompareExchange64((int64_t*)(dest), (int64_t)(exchange), (int64_t)(compare)) -#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) boost::atomics::detail::InterlockedExchange64((int64_t*)(dest), (int64_t)(newval)) -#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) boost::atomics::detail::InterlockedExchangeAdd64((int64_t*)(dest), (int64_t)(addend)) +#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) boost::atomics::detail::InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare)) +#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) boost::atomics::detail::InterlockedExchange64((__int64*)(dest), (__int64)(newval)) +#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) boost::atomics::detail::InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend)) #define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) boost::atomics::detail::InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare)) #define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) boost::atomics::detail::InterlockedExchangePointer((void**)(dest), (void*)(newval)) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/chrono/detail/inlined/win/chrono.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/chrono/detail/inlined/win/chrono.hpp index 213fc1fb..17dae964 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/chrono/detail/inlined/win/chrono.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/chrono/detail/inlined/win/chrono.hpp @@ -100,7 +100,7 @@ namespace chrono_detail #endif return system_clock::time_point( system_clock::duration( - ((static_cast( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime) + ((static_cast<__int64>( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime) -116444736000000000LL ) ); @@ -124,14 +124,14 @@ namespace chrono_detail ec.clear(); } return time_point(duration( - (static_cast( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime)); + (static_cast<__int64>( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime)); } #endif BOOST_CHRONO_INLINE std::time_t system_clock::to_time_t(const system_clock::time_point& t) BOOST_NOEXCEPT { - int64_t temp = t.time_since_epoch().count(); + __int64 temp = t.time_since_epoch().count(); temp /= 10000000; return static_cast( temp ); @@ -140,7 +140,7 @@ namespace chrono_detail BOOST_CHRONO_INLINE system_clock::time_point system_clock::from_time_t(std::time_t t) BOOST_NOEXCEPT { - int64_t temp = t; + __int64 temp = t; temp *= 10000000; return time_point(duration(temp)); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/concept_check.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/concept_check.hpp index 09e5e789..bf5a2af7 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/concept_check.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/concept_check.hpp @@ -85,8 +85,8 @@ namespace boost template <> struct Integer< ::boost::long_long_type> {}; template <> struct Integer< ::boost::ulong_long_type> {}; # elif defined(BOOST_HAS_MS_INT64) - template <> struct Integer {}; - template <> struct Integer {}; + template <> struct Integer<__int64> {}; + template <> struct Integer {}; # endif BOOST_concept(SignedInteger,(T)) { @@ -103,7 +103,7 @@ namespace boost # if defined(BOOST_HAS_LONG_LONG) template <> struct SignedInteger< ::boost::long_long_type> {}; # elif defined(BOOST_HAS_MS_INT64) - template <> struct SignedInteger {}; + template <> struct SignedInteger<__int64> {}; # endif BOOST_concept(UnsignedInteger,(T)) { @@ -121,7 +121,7 @@ namespace boost # if defined(BOOST_HAS_LONG_LONG) template <> struct UnsignedInteger< ::boost::ulong_long_type> {}; # elif defined(BOOST_HAS_MS_INT64) - template <> struct UnsignedInteger {}; + template <> struct UnsignedInteger {}; # endif //=========================================================================== diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/borland.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/borland.hpp index c00dbfd2..cffa8ea0 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/borland.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/borland.hpp @@ -155,7 +155,7 @@ # define BOOST_NO_CXX11_DECLTYPE # define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS # define BOOST_NO_CXX11_EXTERN_TEMPLATE -# define BOOST_NO_CXX11_RVALUE_REFERENCES +# define BOOST_NO_CXX11_RVALUE_REFERENCES # define BOOST_NO_CXX11_SCOPED_ENUMS # define BOOST_NO_CXX11_STATIC_ASSERT #else @@ -221,7 +221,7 @@ #include #endif // -// int64_t: +// __int64: // #if (__BORLANDC__ >= 0x530) && !defined(__STRICT_ANSI__) # define BOOST_HAS_MS_INT64 @@ -242,7 +242,7 @@ // all versions support __declspec: // #if defined(__STRICT_ANSI__) -// 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 // diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/clang.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/clang.hpp index d06b7f67..18d6e546 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/clang.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/clang.hpp @@ -1,7 +1,7 @@ // (C) Copyright Douglas Gregor 2010 // -// 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. @@ -20,7 +20,7 @@ # define BOOST_NO_TYPEID #endif -#if defined(int64_t) +#if defined(__int64) # define BOOST_HAS_MS_INT64 #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/codegear.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/codegear.hpp index 7fc6f2f3..1a6df335 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/codegear.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/codegear.hpp @@ -129,7 +129,7 @@ #endif // -// int64_t: +// __int64: // #if !defined(__STRICT_ANSI__) # define BOOST_HAS_MS_INT64 @@ -150,7 +150,7 @@ // all versions support __declspec: // #if defined(__STRICT_ANSI__) -// 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 // diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/comeau.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/comeau.hpp index 7c4ac026..278222dc 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/comeau.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/comeau.hpp @@ -1,11 +1,11 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Douglas Gregor 2001. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright Aleksey Gurtovoy 2003. -// (C) Copyright Beman Dawes 2003. -// (C) Copyright Jens Maurer 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// (C) Copyright John Maddock 2001. +// (C) Copyright Douglas Gregor 2001. +// (C) Copyright Peter Dimov 2001. +// (C) Copyright Aleksey Gurtovoy 2003. +// (C) Copyright Beman Dawes 2003. +// (C) Copyright Jens Maurer 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. @@ -32,7 +32,7 @@ #endif // version 4245 // -// enable int64_t support in VC emulation mode +// enable __int64 support in VC emulation mode // # if defined(_MSC_VER) && (_MSC_VER >= 1200) # define BOOST_HAS_MS_INT64 diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/visualc.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/visualc.hpp index 2864fb25..aa4584df 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/visualc.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/visualc.hpp @@ -1,11 +1,11 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001 - 2002. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright Aleksey Gurtovoy 2002. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Beman Dawes 2002 - 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 Peter Dimov 2001. +// (C) Copyright Aleksey Gurtovoy 2002. +// (C) Copyright David Abrahams 2002 - 2003. +// (C) Copyright Beman Dawes 2002 - 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. @@ -94,7 +94,7 @@ #endif -#if _MSC_VER < 1400 +#if _MSC_VER < 1400 // although a conforming signature for swprint exists in VC7.1 // it appears not to actually work: # define BOOST_NO_SWPRINTF @@ -119,9 +119,9 @@ #endif -// MSVC (including the latest checked version) has not yet completely +// MSVC (including the latest checked version) has not yet completely // implemented value-initialization, as is reported: -// "VC++ does not value-initialize members of derived classes without +// "VC++ does not value-initialize members of derived classes without // user-declared constructor", reported in 2009 by Sylvester Hesp: // https://connect.microsoft.com/VisualStudio/feedback/details/484295 // "Presence of copy constructor breaks member class initialization", @@ -152,14 +152,14 @@ # define BOOST_HAS_GETSYSTEMTIMEASFILETIME #endif -// -// check for exception handling support: +// +// check for exception handling support: #if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS) -# define BOOST_NO_EXCEPTIONS -#endif +# define BOOST_NO_EXCEPTIONS +#endif // -// int64_t support: +// __int64 support: // #if (_MSC_VER >= 1200) # define BOOST_HAS_MS_INT64 @@ -251,7 +251,7 @@ #ifndef BOOST_COMPILER // TODO: -// these things are mostly bogus. 1200 means version 12.0 of the compiler. The +// these things are mostly bogus. 1200 means version 12.0 of the compiler. The // artificial versions assigned to them only refer to the versions of some IDE // these compilers have been shipped with, and even that is not all of it. Some // were shipped with freely downloadable SDKs, others as crosscompilers in eVC. @@ -274,8 +274,8 @@ # define BOOST_COMPILER_VERSION evc9 # elif _MSC_VER < 1700 # define BOOST_COMPILER_VERSION evc10 -# elif _MSC_VER < 1800 -# define BOOST_COMPILER_VERSION evc11 +# elif _MSC_VER < 1800 +# define BOOST_COMPILER_VERSION evc11 # else # if defined(BOOST_ASSERT_CONFIG) # error "Unknown EVC++ compiler version - please run the configure tests and report the results" @@ -299,8 +299,8 @@ # define BOOST_COMPILER_VERSION 9.0 # elif _MSC_VER < 1700 # define BOOST_COMPILER_VERSION 10.0 -# elif _MSC_VER < 1800 -# define BOOST_COMPILER_VERSION 11.0 +# elif _MSC_VER < 1800 +# define BOOST_COMPILER_VERSION 11.0 # else # define BOOST_COMPILER_VERSION _MSC_VER # endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/stdlib/roguewave.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/stdlib/roguewave.hpp index 66d8358e..cb80f570 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/stdlib/roguewave.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/stdlib/roguewave.hpp @@ -1,16 +1,16 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001. -// (C) Copyright David Abrahams 2003. -// (C) Copyright Boris Gubenko 2007. -// 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 Jens Maurer 2001. +// (C) Copyright David Abrahams 2003. +// (C) Copyright Boris Gubenko 2007. +// 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. // Rogue Wave std lib: -#define BOOST_RW_STDLIB 1 +#define BOOST_RW_STDLIB 1 #if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER) # include @@ -57,7 +57,7 @@ # endif // -// Borland version of numeric_limits lacks int64_t specialisation: +// Borland version of numeric_limits lacks __int64 specialisation: // #ifdef __BORLANDC__ # define BOOST_NO_MS_INT64_NUMERIC_LIMITS diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/suffix.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/suffix.hpp index 5d1484a1..8ee88d90 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/suffix.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/suffix.hpp @@ -4,7 +4,7 @@ // Copyright (c) 2001-2003 John Maddock // Copyright (c) 2001 Darin Adler // Copyright (c) 2001 Peter Dimov -// Copyright (c) 2002 Bill Kempf +// Copyright (c) 2002 Bill Kempf // Copyright (c) 2002 Jens Maurer // Copyright (c) 2002-2003 David Abrahams // Copyright (c) 2003 Gennaro Prota @@ -105,8 +105,8 @@ #endif // -// if there is no int64_t then there is no specialisation -// for numeric_limits either: +// if there is no __int64 then there is no specialisation +// for numeric_limits<__int64> either: // #if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS) # define BOOST_NO_MS_INT64_NUMERIC_LIMITS @@ -146,7 +146,7 @@ # endif // -// Without partial specialization, partial +// Without partial specialization, partial // specialization with default args won't work either: // # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ @@ -632,7 +632,7 @@ namespace std{ using ::type_info; } // Set some default values GPU support // # ifndef BOOST_GPU_ENABLED -# define BOOST_GPU_ENABLED +# define BOOST_GPU_ENABLED # endif // BOOST_FORCEINLINE ---------------------------------------------// @@ -695,7 +695,7 @@ namespace std{ using ::type_info; } # define BOOST_NO_0X_HDR_FUTURE #endif -// Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST +// Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST // instead of BOOST_NO_0X_HDR_INITIALIZER_LIST or BOOST_NO_INITIALIZER_LISTS #ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST # ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST @@ -884,7 +884,7 @@ namespace std{ using ::type_info; } // // constexpr workarounds -// +// #if defined(BOOST_NO_CXX11_CONSTEXPR) #define BOOST_CONSTEXPR #define BOOST_CONSTEXPR_OR_CONST const diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/cstdint.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/cstdint.hpp index c53bdc9f..ea84b650 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/cstdint.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/cstdint.hpp @@ -1,8 +1,8 @@ // boost cstdint.hpp header file ------------------------------------------// -// (C) Copyright Beman Dawes 1999. -// (C) Copyright Jens Mauer 2001 -// (C) Copyright John Maddock 2001 +// (C) Copyright Beman Dawes 1999. +// (C) Copyright Jens Mauer 2001 +// (C) Copyright John Maddock 2001 // 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) @@ -24,9 +24,9 @@ #define BOOST_CSTDINT_HPP // -// Since we always define the INT#_C macros as per C++0x, +// Since we always define the INT#_C macros as per C++0x, // define __STDC_CONSTANT_MACROS so that does the right -// thing if possible, and so that the user knows that the macros +// thing if possible, and so that the user knows that the macros // are actually defined as per C99. // #ifndef __STDC_CONSTANT_MACROS @@ -50,7 +50,7 @@ # ifdef __STDC_32_MODE__ // this is triggered with GCC, because it defines __cplusplus < 199707L # define BOOST_NO_INT64_T -# endif +# endif # elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX) # include # else @@ -100,40 +100,40 @@ typedef ::uintfast64_t uint_fast64_t; namespace boost { - using ::int8_t; - using ::int_least8_t; - using ::int_fast8_t; - using ::uint8_t; - using ::uint_least8_t; - using ::uint_fast8_t; - - using ::int16_t; - using ::int_least16_t; - using ::int_fast16_t; - using ::uint16_t; - using ::uint_least16_t; - using ::uint_fast16_t; - - using ::int32_t; - using ::int_least32_t; - using ::int_fast32_t; - using ::uint32_t; - using ::uint_least32_t; - using ::uint_fast32_t; - + using ::int8_t; + using ::int_least8_t; + using ::int_fast8_t; + using ::uint8_t; + using ::uint_least8_t; + using ::uint_fast8_t; + + using ::int16_t; + using ::int_least16_t; + using ::int_fast16_t; + using ::uint16_t; + using ::uint_least16_t; + using ::uint_fast16_t; + + using ::int32_t; + using ::int_least32_t; + using ::int_fast32_t; + using ::uint32_t; + using ::uint_least32_t; + using ::uint_fast32_t; + # ifndef BOOST_NO_INT64_T - using ::int64_t; - using ::int_least64_t; - using ::int_fast64_t; - using ::uint64_t; - using ::uint_least64_t; - using ::uint_fast64_t; - + using ::int64_t; + using ::int_least64_t; + using ::int_fast64_t; + using ::uint64_t; + using ::uint_least64_t; + using ::uint_fast64_t; + # endif - using ::intmax_t; - using ::uintmax_t; + using ::intmax_t; + using ::uintmax_t; } // namespace boost @@ -143,35 +143,35 @@ namespace boost namespace boost { - using ::int8_t; - typedef int8_t int_least8_t; - typedef int8_t int_fast8_t; - using ::uint8_t; - typedef uint8_t uint_least8_t; - typedef uint8_t uint_fast8_t; - - using ::int16_t; - typedef int16_t int_least16_t; - typedef int16_t int_fast16_t; - using ::uint16_t; - typedef uint16_t uint_least16_t; - typedef uint16_t uint_fast16_t; - - using ::int32_t; - typedef int32_t int_least32_t; - typedef int32_t int_fast32_t; - using ::uint32_t; - typedef uint32_t uint_least32_t; - typedef uint32_t uint_fast32_t; - -# ifndef BOOST_NO_INT64_T - - using ::int64_t; - typedef int64_t int_least64_t; - typedef int64_t int_fast64_t; - using ::uint64_t; - typedef uint64_t uint_least64_t; - typedef uint64_t uint_fast64_t; + using ::int8_t; + typedef int8_t int_least8_t; + typedef int8_t int_fast8_t; + using ::uint8_t; + typedef uint8_t uint_least8_t; + typedef uint8_t uint_fast8_t; + + using ::int16_t; + typedef int16_t int_least16_t; + typedef int16_t int_fast16_t; + using ::uint16_t; + typedef uint16_t uint_least16_t; + typedef uint16_t uint_fast16_t; + + using ::int32_t; + typedef int32_t int_least32_t; + typedef int32_t int_fast32_t; + using ::uint32_t; + typedef uint32_t uint_least32_t; + typedef uint32_t uint_fast32_t; + +# ifndef BOOST_NO_INT64_T + + using ::int64_t; + typedef int64_t int_least64_t; + typedef int64_t int_fast64_t; + using ::uint64_t; + typedef uint64_t uint_least64_t; + typedef uint64_t uint_fast64_t; typedef int64_t intmax_t; typedef uint64_t uintmax_t; @@ -235,15 +235,15 @@ namespace boost typedef unsigned short uint_least16_t; typedef unsigned short uint_fast16_t; # endif -# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__) - // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified - // MTA / XMT does support the following non-standard integer types - typedef __short16 int16_t; - typedef __short16 int_least16_t; - typedef __short16 int_fast16_t; - typedef unsigned __short16 uint16_t; - typedef unsigned __short16 uint_least16_t; - typedef unsigned __short16 uint_fast16_t; +# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__) + // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified + // MTA / XMT does support the following non-standard integer types + typedef __short16 int16_t; + typedef __short16 int_least16_t; + typedef __short16 int_fast16_t; + typedef unsigned __short16 uint16_t; + typedef unsigned __short16 uint_least16_t; + typedef unsigned __short16 uint_fast16_t; # elif (USHRT_MAX == 0xffffffff) && defined(CRAY) // no 16-bit types on Cray: typedef short int_least16_t; @@ -277,14 +277,14 @@ namespace boost typedef unsigned long uint32_t; typedef unsigned long uint_least32_t; typedef unsigned long uint_fast32_t; -# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__) - // Integers are 64 bits on the MTA / XMT - typedef __int32 int32_t; - typedef __int32 int_least32_t; - typedef __int32 int_fast32_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int32 uint_least32_t; - typedef unsigned __int32 uint_fast32_t; +# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__) + // Integers are 64 bits on the MTA / XMT + typedef __int32 int32_t; + typedef __int32 int_least32_t; + typedef __int32 int_fast32_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int32 uint_fast32_t; # else # error defaults not correct; you must hand modify boost/cstdint.hpp # endif @@ -337,16 +337,16 @@ namespace boost __extension__ typedef unsigned long long uint_fast64_t; # elif defined(BOOST_HAS_MS_INT64) // - // we have Borland/Intel/Microsoft int64_t: + // we have Borland/Intel/Microsoft __int64: // - typedef int64_t intmax_t; - typedef uint64_t uintmax_t; - typedef int64_t int64_t; - typedef int64_t int_least64_t; - typedef int64_t int_fast64_t; - typedef uint64_t uint64_t; - typedef uint64_t uint_least64_t; - typedef uint64_t uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; + typedef __int64 int64_t; + typedef __int64 int_least64_t; + typedef __int64 int_fast64_t; + typedef unsigned __int64 uint64_t; + typedef unsigned __int64 uint_least64_t; + typedef unsigned __int64 uint_fast64_t; # else // assume no 64-bit integers # define BOOST_NO_INT64_T typedef int32_t intmax_t; @@ -376,15 +376,15 @@ INT#_C macros if they're not already defined (John Maddock). #if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \ (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C)) // -// For the following code we get several warnings along the lines of: -// -// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant +// For the following code we get several warnings along the lines of: +// +// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant +// +// So we declare this a system header to suppress these warnings. // -// So we declare this a system header to suppress these warnings. -// -#if defined(__GNUC__) && (__GNUC__ >= 4) -#pragma GCC system_header -#endif +#if defined(__GNUC__) && (__GNUC__ >= 4) +#pragma GCC system_header +#endif #include # define BOOST__STDC_CONSTANT_MACROS_DEFINED diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/basic_types.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/basic_types.hpp index 17411c3a..f4e34721 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/basic_types.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/basic_types.hpp @@ -68,7 +68,7 @@ extern "C" { //~ #if defined(BOOST_NO_INT64_T) //~ typedef double LONGLONG_; //~ #else - //~ typedef int64_t LONGLONG_; + //~ typedef __int64 LONGLONG_; //~ #endif //~ #else //~ typedef double LONGLONG_; @@ -80,7 +80,7 @@ extern "C" { #if defined(__CYGWIN__) typedef unsigned long ULONG_PTR_; #else - typedef uint64_t ULONG_PTR_; + typedef unsigned __int64 ULONG_PTR_; #endif # else typedef unsigned long ULONG_PTR_; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/synchronization.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/synchronization.hpp index fbf15fd4..8fe015b3 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/synchronization.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/detail/win/synchronization.hpp @@ -27,7 +27,7 @@ namespace win32 using ::TryEnterCriticalSection; using ::LeaveCriticalSection; using ::DeleteCriticalSection; - + # ifdef BOOST_NO_ANSI_APIS using ::CreateMutexW; using ::CreateEventW; @@ -56,67 +56,67 @@ extern "C" { void * OwningThread; void * LockSemaphore; #if defined(_WIN64) - uint64_t SpinCount; + unsigned __int64 SpinCount; #else unsigned long SpinCount; #endif }; - __declspec(dllimport) void __stdcall + __declspec(dllimport) void __stdcall InitializeCriticalSection(CRITICAL_SECTION_ *); - __declspec(dllimport) void __stdcall + __declspec(dllimport) void __stdcall EnterCriticalSection(CRITICAL_SECTION_ *); - __declspec(dllimport) bool __stdcall + __declspec(dllimport) bool __stdcall TryEnterCriticalSection(CRITICAL_SECTION_ *); - __declspec(dllimport) void __stdcall + __declspec(dllimport) void __stdcall LeaveCriticalSection(CRITICAL_SECTION_ *); - __declspec(dllimport) void __stdcall + __declspec(dllimport) void __stdcall DeleteCriticalSection(CRITICAL_SECTION_ *); - + struct _SECURITY_ATTRIBUTES; # ifdef BOOST_NO_ANSI_APIS - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall CreateMutexW(_SECURITY_ATTRIBUTES*,int,wchar_t const*); - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall CreateSemaphoreW(_SECURITY_ATTRIBUTES*,long,long,wchar_t const*); - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall CreateEventW(_SECURITY_ATTRIBUTES*,int,int,wchar_t const*); - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall OpenEventW(unsigned long,int,wchar_t const*); # else - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall CreateMutexA(_SECURITY_ATTRIBUTES*,int,char const*); - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall CreateSemaphoreA(_SECURITY_ATTRIBUTES*,long,long,char const*); - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall CreateEventA(_SECURITY_ATTRIBUTES*,int,int,char const*); - __declspec(dllimport) void* __stdcall + __declspec(dllimport) void* __stdcall OpenEventA(unsigned long,int,char const*); # endif - __declspec(dllimport) int __stdcall + __declspec(dllimport) int __stdcall ReleaseMutex(void*); - __declspec(dllimport) unsigned long __stdcall + __declspec(dllimport) unsigned long __stdcall WaitForSingleObject(void*,unsigned long); - __declspec(dllimport) unsigned long __stdcall + __declspec(dllimport) unsigned long __stdcall WaitForMultipleObjects(unsigned long nCount, void* const * lpHandles, int bWaitAll, unsigned long dwMilliseconds); - __declspec(dllimport) int __stdcall + __declspec(dllimport) int __stdcall ReleaseSemaphore(void*,long,long*); typedef void (__stdcall *PAPCFUNC8)(ulong_ptr); - __declspec(dllimport) unsigned long __stdcall + __declspec(dllimport) unsigned long __stdcall QueueUserAPC(PAPCFUNC8,void*,ulong_ptr); # ifndef UNDER_CE - __declspec(dllimport) int __stdcall + __declspec(dllimport) int __stdcall SetEvent(void*); - __declspec(dllimport) int __stdcall + __declspec(dllimport) int __stdcall ResetEvent(void*); # else using ::SetEvent; using ::ResetEvent; # endif -} +} #endif } } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer.hpp index 3eeb8f21..35a1e109 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer.hpp @@ -42,15 +42,15 @@ namespace boost // fast integers from least integers // int_fast_t<> works correctly for unsigned too, in spite of the name. template< typename LeastInt > - struct int_fast_t - { - typedef LeastInt fast; + struct int_fast_t + { + typedef LeastInt fast; typedef fast type; }; // imps may specialize namespace detail{ - // convert category to type + // convert category to type template< int Category > struct int_least_helper {}; // default is empty template< int Category > struct uint_least_helper {}; // default is empty @@ -60,7 +60,7 @@ namespace boost #ifdef BOOST_HAS_LONG_LONG template<> struct int_least_helper<1> { typedef boost::long_long_type least; }; #elif defined(BOOST_HAS_MS_INT64) - template<> struct int_least_helper<1> { typedef int64_t least; }; + template<> struct int_least_helper<1> { typedef __int64 least; }; #endif template<> struct int_least_helper<2> { typedef long least; }; template<> struct int_least_helper<3> { typedef int least; }; @@ -69,7 +69,7 @@ namespace boost #ifdef BOOST_HAS_LONG_LONG template<> struct uint_least_helper<1> { typedef boost::ulong_long_type least; }; #elif defined(BOOST_HAS_MS_INT64) - template<> struct uint_least_helper<1> { typedef uint64_t least; }; + template<> struct uint_least_helper<1> { typedef unsigned __int64 least; }; #endif template<> struct uint_least_helper<2> { typedef unsigned long least; }; template<> struct uint_least_helper<3> { typedef unsigned int least; }; @@ -138,7 +138,7 @@ namespace boost "No suitable unsigned integer type with the requested number of bits is available."); #if (defined(__BORLANDC__) || defined(__CODEGEAR__)) && defined(BOOST_NO_INTEGRAL_INT64_T) // It's really not clear why this workaround should be needed... shrug I guess! JM - BOOST_STATIC_CONSTANT(int, s = + BOOST_STATIC_CONSTANT(int, s = 6 + (Bits <= ::std::numeric_limits::digits) + (Bits <= ::std::numeric_limits::digits) + @@ -147,7 +147,7 @@ namespace boost typedef typename detail::int_least_helper< ::boost::uint_t::s>::least least; #else typedef typename detail::uint_least_helper - < + < #ifdef BOOST_HAS_LONG_LONG (Bits <= (int)(sizeof(boost::long_long_type) * CHAR_BIT)) + #else @@ -171,7 +171,7 @@ namespace boost #else template< long MaxValue > // maximum value to require support #endif - struct int_max_value_t + struct int_max_value_t { typedef typename detail::int_least_helper < @@ -193,7 +193,7 @@ namespace boost #else template< long MinValue > // minimum value to require support #endif - struct int_min_value_t + struct int_min_value_t { typedef typename detail::int_least_helper < @@ -216,12 +216,12 @@ namespace boost #else template< unsigned long MaxValue > // minimum value to require support #endif - struct uint_value_t + struct uint_value_t { #if (defined(__BORLANDC__) || defined(__CODEGEAR__)) // It's really not clear why this workaround should be needed... shrug I guess! JM #if defined(BOOST_NO_INTEGRAL_INT64_T) - BOOST_STATIC_CONSTANT(unsigned, which = + BOOST_STATIC_CONSTANT(unsigned, which = 1 + (MaxValue <= ::boost::integer_traits::const_max) + (MaxValue <= ::boost::integer_traits::const_max) + @@ -229,7 +229,7 @@ namespace boost (MaxValue <= ::boost::integer_traits::const_max)); typedef typename detail::int_least_helper< ::boost::uint_value_t::which>::least least; #else // BOOST_NO_INTEGRAL_INT64_T - BOOST_STATIC_CONSTANT(unsigned, which = + BOOST_STATIC_CONSTANT(unsigned, which = 1 + (MaxValue <= ::boost::integer_traits::const_max) + (MaxValue <= ::boost::integer_traits::const_max) + @@ -240,7 +240,7 @@ namespace boost #endif // BOOST_NO_INTEGRAL_INT64_T #else typedef typename detail::uint_least_helper - < + < #if !defined(BOOST_NO_INTEGRAL_INT64_T) && defined(BOOST_HAS_LONG_LONG) (MaxValue <= ::boost::integer_traits::const_max) + #else diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer/integer_mask.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer/integer_mask.hpp index 87237bab..2acf7f7d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer/integer_mask.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer/integer_mask.hpp @@ -5,7 +5,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -// See http://www.boost.org for updates, documentation, and revision history. +// See http://www.boost.org for updates, documentation, and revision history. #ifndef BOOST_INTEGER_INTEGER_MASK_HPP #define BOOST_INTEGER_INTEGER_MASK_HPP @@ -109,7 +109,7 @@ BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned long ); #endif #elif defined(BOOST_HAS_MS_INT64) #if 18446744073709551615ui64 > ULONG_MAX - BOOST_LOW_BITS_MASK_SPECIALIZE( uint64_t ); + BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned __int64 ); #endif #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_fwd.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_fwd.hpp index 59055602..20eff2bc 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_fwd.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_fwd.hpp @@ -85,10 +85,10 @@ template < > class integer_traits< ::boost::ulong_long_type >; #elif !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T) && defined(BOOST_HAS_MS_INT64) template < > -class integer_traits; +class integer_traits<__int64>; template < > -class integer_traits; +class integer_traits; #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_traits.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_traits.hpp index 79ee3472..ddd56095 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_traits.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/integer_traits.hpp @@ -239,15 +239,15 @@ class integer_traits< ::boost::ulong_long_type> #elif defined(BOOST_HAS_MS_INT64) template<> -class integer_traits< int64_t> - : public std::numeric_limits< int64_t>, - public detail::integer_traits_base< int64_t, _I64_MIN, _I64_MAX> +class integer_traits< __int64> + : public std::numeric_limits< __int64>, + public detail::integer_traits_base< __int64, _I64_MIN, _I64_MAX> { }; template<> -class integer_traits< uint64_t> - : public std::numeric_limits< uint64_t>, - public detail::integer_traits_base< uint64_t, 0, _UI64_MAX> +class integer_traits< unsigned __int64> + : public std::numeric_limits< unsigned __int64>, + public detail::integer_traits_base< unsigned __int64, 0, _UI64_MAX> { }; #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/detail/win32_api.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/detail/win32_api.hpp index dbacf1b5..078eef10 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/detail/win32_api.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/detail/win32_api.hpp @@ -610,7 +610,7 @@ struct interprocess_section_basic_information { void * base_address; unsigned long section_attributes; - int64_t section_size; + __int64 section_size; }; struct interprocess_filetime @@ -778,9 +778,9 @@ union system_timeofday_information { struct data_t { - int64_t liKeBootTime; - int64_t liKeSystemTime; - int64_t liExpTimeZoneBias; + __int64 liKeBootTime; + __int64 liKeSystemTime; + __int64 liExpTimeZoneBias; unsigned long uCurrentTimeZoneId; unsigned long dwReserved; } data; @@ -877,7 +877,7 @@ extern "C" __declspec(dllimport) int __stdcall FlushViewOfFile (void *, std::siz extern "C" __declspec(dllimport) int __stdcall VirtualUnlock (void *, std::size_t); extern "C" __declspec(dllimport) int __stdcall VirtualProtect (void *, std::size_t, unsigned long, unsigned long *); extern "C" __declspec(dllimport) int __stdcall FlushFileBuffers (void *); -extern "C" __declspec(dllimport) int __stdcall GetFileSizeEx (void *, int64_t *size); +extern "C" __declspec(dllimport) int __stdcall GetFileSizeEx (void *, __int64 *size); extern "C" __declspec(dllimport) unsigned long __stdcall FormatMessageA (unsigned long dwFlags, const void *lpSource, unsigned long dwMessageId, unsigned long dwLanguageId, char *lpBuffer, unsigned long nSize, @@ -888,9 +888,9 @@ extern "C" __declspec(dllimport) int __stdcall CreateDirectoryA(const char *, in extern "C" __declspec(dllimport) int __stdcall RemoveDirectoryA(const char *lpPathName); extern "C" __declspec(dllimport) int __stdcall GetTempPathA(unsigned long length, char *buffer); extern "C" __declspec(dllimport) int __stdcall CreateDirectory(const char *, interprocess_security_attributes*); -extern "C" __declspec(dllimport) int __stdcall SetFileValidData(void *, int64_t size); +extern "C" __declspec(dllimport) int __stdcall SetFileValidData(void *, __int64 size); extern "C" __declspec(dllimport) int __stdcall SetEndOfFile(void *); -extern "C" __declspec(dllimport) int __stdcall SetFilePointerEx(void *, int64_t distance, int64_t *new_file_pointer, unsigned long move_method); +extern "C" __declspec(dllimport) int __stdcall SetFilePointerEx(void *, __int64 distance, __int64 *new_file_pointer, unsigned long move_method); extern "C" __declspec(dllimport) int __stdcall LockFile (void *hnd, unsigned long offset_low, unsigned long offset_high, unsigned long size_low, unsigned long size_high); extern "C" __declspec(dllimport) int __stdcall UnlockFile(void *hnd, unsigned long offset_low, unsigned long offset_high, unsigned long size_low, unsigned long size_high); extern "C" __declspec(dllimport) int __stdcall LockFileEx(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped); @@ -908,7 +908,7 @@ extern "C" __declspec(dllimport) unsigned long __stdcall GetMappedFileNameW(void extern "C" __declspec(dllimport) long __stdcall RegOpenKeyExA(void *, const char *, unsigned long, unsigned long, void **); extern "C" __declspec(dllimport) long __stdcall RegQueryValueExA(void *, const char *, unsigned long*, unsigned long*, unsigned char *, unsigned long*); extern "C" __declspec(dllimport) long __stdcall RegCloseKey(void *); -extern "C" __declspec(dllimport) int __stdcall QueryPerformanceCounter(int64_t *lpPerformanceCount); +extern "C" __declspec(dllimport) int __stdcall QueryPerformanceCounter(__int64 *lpPerformanceCount); //COM API extern "C" __declspec(dllimport) long __stdcall CoInitializeEx(void *pvReserved, unsigned long dwCoInit); @@ -1091,7 +1091,7 @@ class interprocess_all_access_security { return &sa; } }; -inline void * create_file_mapping (void * handle, unsigned long access, uint64_t file_offset, const char * name, interprocess_security_attributes *psec) +inline void * create_file_mapping (void * handle, unsigned long access, unsigned __int64 file_offset, const char * name, interprocess_security_attributes *psec) { const unsigned long high_size(file_offset >> 32), low_size((boost::uint32_t)file_offset); return CreateFileMappingA (handle, psec, access, high_size, low_size, name); @@ -1100,9 +1100,9 @@ inline void * create_file_mapping (void * handle, unsigned long access, uint64_t inline void * open_file_mapping (unsigned long access, const char *name) { return OpenFileMappingA (access, 0, name); } -inline void *map_view_of_file_ex(void *handle, unsigned long file_access, uint64_t offset, std::size_t numbytes, void *base_addr) +inline void *map_view_of_file_ex(void *handle, unsigned long file_access, unsigned __int64 offset, std::size_t numbytes, void *base_addr) { - const unsigned long offset_low = (unsigned long)(offset & ((uint64_t)0xFFFFFFFF)); + const unsigned long offset_low = (unsigned long)(offset & ((unsigned __int64)0xFFFFFFFF)); const unsigned long offset_high = offset >> 32; return MapViewOfFileEx(handle, file_access, offset_high, offset_low, numbytes, base_addr); } @@ -1146,7 +1146,7 @@ inline bool virtual_protect(void *base_addr, std::size_t numbytes, unsigned long inline bool flush_file_buffers(void *handle) { return 0 != FlushFileBuffers(handle); } -inline bool get_file_size(void *handle, int64_t &size) +inline bool get_file_size(void *handle, __int64 &size) { return 0 != GetFileSizeEx(handle, &size); } inline bool create_directory(const char *name) @@ -1164,7 +1164,7 @@ inline unsigned long get_temp_path(unsigned long length, char *buffer) inline int set_end_of_file(void *handle) { return 0 != SetEndOfFile(handle); } -inline bool set_file_pointer_ex(void *handle, int64_t distance, int64_t *new_file_pointer, unsigned long move_method) +inline bool set_file_pointer_ex(void *handle, __int64 distance, __int64 *new_file_pointer, unsigned long move_method) { return 0 != SetFilePointerEx(handle, distance, new_file_pointer, move_method); } inline bool lock_file_ex(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped *overlapped) @@ -1225,7 +1225,7 @@ inline long reg_query_value_ex(void *hKey, const char *lpValueName, unsigned lon inline long reg_close_key(void *hKey) { return RegCloseKey(hKey); } -inline bool query_performance_counter(int64_t *lpPerformanceCount) +inline bool query_performance_counter(__int64 *lpPerformanceCount) { return 0 != QueryPerformanceCounter(lpPerformanceCount); } @@ -1812,7 +1812,7 @@ inline bool is_directory(const char *path) (attrib & file_attribute_directory)); } -inline bool get_file_mapping_size(void *file_mapping_hnd, int64_t &size) +inline bool get_file_mapping_size(void *file_mapping_hnd, __int64 &size) { NtQuerySection_t pNtQuerySection = (NtQuerySection_t)dll_func::get(dll_func::NtQuerySection); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_condition_any.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_condition_any.hpp index 6544948a..0d3b915b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_condition_any.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_condition_any.hpp @@ -138,7 +138,7 @@ class windows_named_condition_any class named_cond_callbacks : public windows_named_sync_interface { - typedef int64_t sem_count_t; + typedef __int64 sem_count_t; mutable sem_count_t sem_counts [2]; public: diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_semaphore.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_semaphore.hpp index d53c6590..8f48d4df 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_semaphore.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_semaphore.hpp @@ -66,7 +66,7 @@ class windows_named_semaphore class named_sem_callbacks : public windows_named_sync_interface { public: - typedef int64_t sem_count_t; + typedef __int64 sem_count_t; named_sem_callbacks(winapi_semaphore_wrapper &sem_wrapper, sem_count_t sem_cnt) : m_sem_wrapper(sem_wrapper), m_sem_count(sem_cnt) {} diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_sync.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_sync.hpp index 5f68674d..41f299f8 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_sync.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/named_sync.hpp @@ -122,12 +122,12 @@ inline void windows_named_sync::open_or_create if(m_file_hnd != winapi::invalid_handle_value){ //Now lock the file const std::size_t buflen = sync_interface.get_data_size(); - typedef int64_t unique_id_type; + typedef __int64 unique_id_type; const std::size_t sizeof_file_info = sizeof(unique_id_type) + buflen; winapi::interprocess_overlapped overlapped; if(winapi::lock_file_ex (m_file_hnd, winapi::lockfile_exclusive_lock, 0, sizeof_file_info, 0, &overlapped)){ - int64_t filesize = 0; + __int64 filesize = 0; //Obtain the unique id to open the native semaphore. //If file size was created if(winapi::get_file_size(m_file_hnd, filesize)){ diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/sync_utils.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/sync_utils.hpp index 48ee516f..92d8e55a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/sync_utils.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/sync/windows/sync_utils.hpp @@ -62,7 +62,7 @@ inline bool bytes_to_str(const void *mem, const std::size_t mem_length, char *ou class sync_id { public: - typedef int64_t internal_type; + typedef __int64 internal_type; sync_id(const void *map_addr) : map_addr_(map_addr) { winapi::query_performance_counter(&rand_); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/detail/config/rtl.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/detail/config/rtl.hpp index 7195a4a2..d9fbe508 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/detail/config/rtl.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/detail/config/rtl.hpp @@ -1,16 +1,16 @@ /* - * 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.) - * + * * See http://www.boost.org/libs/iostreams for documentation. * - * Defines preprocessor symbols expanding to the names of functions in the + * Defines preprocessor symbols expanding to the names of functions in the * C runtime library used to access file descriptors and to the type used * to store file offsets for seeking. - * + * * File: boost/iostreams/detail/config/rtl.hpp * Date: Wed Dec 26 11:58:11 MST 2007 - * + * * Copyright: 2007-2008 CodeRage, LLC * Author: Jonathan Turkanis * Contact: turkanis at coderage dot com @@ -39,9 +39,9 @@ #ifdef BOOST_IOSTREAMS_WINDOWS # if defined(BOOST_MSVC) || defined(__MSVCRT__) // MSVC, MinGW # define BOOST_IOSTREAMS_FD_SEEK _lseeki64 -# define BOOST_IOSTREAMS_FD_OFFSET int64_t +# define BOOST_IOSTREAMS_FD_OFFSET __int64 # else // Borland, Metrowerks, ... -# define BOOST_IOSTREAMS_FD_SEEK lseek +# define BOOST_IOSTREAMS_FD_SEEK lseek # define BOOST_IOSTREAMS_FD_OFFSET long # endif #else // Non-windows diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/lexical_cast.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/lexical_cast.hpp index 2b0dfaca..94dbaf97 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/lexical_cast.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/lexical_cast.hpp @@ -73,12 +73,12 @@ namespace boost { // exception used to indicate runtime lexical_cast failure class BOOST_SYMBOL_VISIBLE bad_lexical_cast : - // workaround MSVC bug with std::bad_cast when _HAS_EXCEPTIONS == 0 -#if defined(BOOST_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS - public std::exception -#else - public std::bad_cast -#endif + // workaround MSVC bug with std::bad_cast when _HAS_EXCEPTIONS == 0 +#if defined(BOOST_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS + public std::exception +#else + public std::bad_cast +#endif #if defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, < 0x560 ) // under bcc32 5.5.1 bad_cast doesn't derive from exception @@ -203,7 +203,7 @@ namespace boost { { // Converts signed/unsigned char to char template < class Char > - struct normalize_single_byte_char + struct normalize_single_byte_char { typedef Char type; }; @@ -223,7 +223,7 @@ namespace boost { namespace detail // deduce_character_type_later { - // Helper type, meaning that stram character for T must be deduced + // Helper type, meaning that stram character for T must be deduced // at Stage 2 (See deduce_source_char and deduce_target_char) template < class T > struct deduce_character_type_later {}; } @@ -260,7 +260,7 @@ namespace boost { Char, boost::detail::deduce_character_type_later< boost::iterator_range< Char* > > > {}; - + template < typename Char > struct stream_char_common< boost::iterator_range< const Char* > >: public boost::mpl::if_c< boost::detail::is_char_or_wchar< Char >::value, @@ -326,19 +326,19 @@ namespace boost { // Otherwise supplied type T is a character type, that must be normalized // using normalize_single_byte_char. // Executed at Stage 2 (See deduce_source_char and deduce_target_char) - template < class Char > + template < class Char > struct deduce_source_char_impl - { - typedef BOOST_DEDUCED_TYPENAME boost::detail::normalize_single_byte_char< Char >::type type; + { + typedef BOOST_DEDUCED_TYPENAME boost::detail::normalize_single_byte_char< Char >::type type; }; - - template < class T > - struct deduce_source_char_impl< deduce_character_type_later< T > > + + template < class T > + struct deduce_source_char_impl< deduce_character_type_later< T > > { typedef boost::has_left_shift< std::basic_ostream< char >, T > result_t; #if defined(BOOST_LCAST_NO_WCHAR_T) - BOOST_STATIC_ASSERT_MSG((result_t::value), + BOOST_STATIC_ASSERT_MSG((result_t::value), "Source type is not std::ostream`able and std::wostream`s are not supported by your STL implementation"); typedef char type; #else @@ -346,7 +346,7 @@ namespace boost { result_t::value, char, wchar_t >::type type; - BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_left_shift< std::basic_ostream< type >, T >::value), + BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_left_shift< std::basic_ostream< type >, T >::value), "Source type is neither std::ostream`able nor std::wostream`able"); #endif }; @@ -359,47 +359,47 @@ namespace boost { // Otherwise supplied type T is a character type, that must be normalized // using normalize_single_byte_char. // Executed at Stage 2 (See deduce_source_char and deduce_target_char) - template < class Char > - struct deduce_target_char_impl - { - typedef BOOST_DEDUCED_TYPENAME normalize_single_byte_char< Char >::type type; + template < class Char > + struct deduce_target_char_impl + { + typedef BOOST_DEDUCED_TYPENAME normalize_single_byte_char< Char >::type type; }; - - template < class T > - struct deduce_target_char_impl< deduce_character_type_later > - { + + template < class T > + struct deduce_target_char_impl< deduce_character_type_later > + { typedef boost::has_right_shift, T > result_t; #if defined(BOOST_LCAST_NO_WCHAR_T) - BOOST_STATIC_ASSERT_MSG((result_t::value), + BOOST_STATIC_ASSERT_MSG((result_t::value), "Target type is not std::istream`able and std::wistream`s are not supported by your STL implementation"); typedef char type; #else typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c< result_t::value, char, wchar_t >::type type; - - BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_right_shift, T >::value), + + BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_right_shift, T >::value), "Target type is neither std::istream`able nor std::wistream`able"); #endif }; - } + } namespace detail // deduce_target_char and deduce_source_char { // We deduce stream character types in two stages. // - // Stage 1 is common for Target and Source. At Stage 1 we get + // Stage 1 is common for Target and Source. At Stage 1 we get // non normalized character type (may contain unsigned/signed char) // or deduce_character_type_later where T is the original type. // Stage 1 is executed by stream_char_common // - // At Stage 2 we normalize character types or try to deduce character - // type using metafunctions. - // Stage 2 is executed by deduce_target_char_impl and + // At Stage 2 we normalize character types or try to deduce character + // type using metafunctions. + // Stage 2 is executed by deduce_target_char_impl and // deduce_source_char_impl // - // deduce_target_char and deduce_source_char functions combine + // deduce_target_char and deduce_source_char functions combine // both stages template < class T > @@ -521,11 +521,11 @@ namespace boost { namespace detail // is_this_float_conversion_optimized { - // this metafunction evaluates to true, if we have optimized comnversion - // from Float type to Char array. + // this metafunction evaluates to true, if we have optimized comnversion + // from Float type to Char array. // Must be in sync with lexical_stream_limited_src::shl_real_type(...) template - struct is_this_float_conversion_optimized + struct is_this_float_conversion_optimized { typedef boost::type_traits::ice_and< boost::is_float::value, @@ -542,7 +542,7 @@ namespace boost { BOOST_STATIC_CONSTANT(bool, value = (result_type::value) ); }; } - + namespace detail // lcast_src_length { // Return max. length of string representation of Source; @@ -599,8 +599,8 @@ namespace boost { BOOST_LCAST_DEF(boost::ulong_long_type) BOOST_LCAST_DEF(boost::long_long_type ) #elif defined(BOOST_HAS_MS_INT64) - BOOST_LCAST_DEF(uint64_t) - BOOST_LCAST_DEF( int64_t) + BOOST_LCAST_DEF(unsigned __int64) + BOOST_LCAST_DEF( __int64) #endif #undef BOOST_LCAST_DEF @@ -610,7 +610,7 @@ namespace boost { // -1.23456789e-123456 // ^ sign // ^ leading digit - // ^ decimal point + // ^ decimal point // ^^^^^^^^ lcast_precision::value // ^ "e" // ^ exponent sign @@ -658,11 +658,11 @@ namespace boost { struct lexical_cast_stream_traits { typedef BOOST_DEDUCED_TYPENAME boost::detail::array_to_pointer_decay::type src; typedef BOOST_DEDUCED_TYPENAME boost::remove_cv::type no_cv_src; - + typedef boost::detail::deduce_source_char deduce_src_char_metafunc; typedef BOOST_DEDUCED_TYPENAME deduce_src_char_metafunc::type src_char_t; typedef BOOST_DEDUCED_TYPENAME boost::detail::deduce_target_char::type target_char_t; - + typedef BOOST_DEDUCED_TYPENAME boost::detail::widest_char< target_char_t, src_char_t >::type char_type; @@ -700,12 +700,12 @@ namespace boost { // If we have an optimized conversion for // Source, we do not need to construct stringbuf. - BOOST_STATIC_CONSTANT(bool, requires_stringbuf = + BOOST_STATIC_CONSTANT(bool, requires_stringbuf = (boost::type_traits::ice_or< is_string_widening_required_t::value, is_source_input_not_optimized_t::value >::value) ); - + typedef boost::detail::lcast_src_length len_t; }; } @@ -1160,7 +1160,7 @@ namespace boost { #if defined(BOOST_HAS_LONG_LONG) typedef boost::ulong_long_type type; #elif defined(BOOST_HAS_MS_INT64) - typedef uint64_t type; + typedef unsigned __int64 type; #endif }; @@ -1494,7 +1494,7 @@ namespace boost { "Use boost::locale instead" ); return shl_input_streamable(str); } - + bool shl_char_array_limited(CharT const* str, std::size_t max_size) BOOST_NOEXCEPT { start = const_cast(str); @@ -1543,11 +1543,11 @@ namespace boost { { using namespace std; if (put_inf_nan(begin, end, val)) return true; const double val_as_double = val; - end = begin + + end = begin + #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) sprintf_s(begin, end-begin, #else - sprintf(begin, + sprintf(begin, #endif "%.*g", static_cast(boost::detail::lcast_get_precision()), val_as_double); return end > begin; @@ -1556,11 +1556,11 @@ namespace boost { static bool shl_real_type(double val, char* begin, char*& end) { using namespace std; if (put_inf_nan(begin, end, val)) return true; - end = begin + + end = begin + #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) sprintf_s(begin, end-begin, #else - sprintf(begin, + sprintf(begin, #endif "%.*g", static_cast(boost::detail::lcast_get_precision()), val); return end > begin; @@ -1570,11 +1570,11 @@ namespace boost { static bool shl_real_type(long double val, char* begin, char*& end) { using namespace std; if (put_inf_nan(begin, end, val)) return true; - end = begin + + end = begin + #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) sprintf_s(begin, end-begin, #else - sprintf(begin, + sprintf(begin, #endif "%.*Lg", static_cast(boost::detail::lcast_get_precision()), val ); return end > begin; @@ -1641,14 +1641,14 @@ namespace boost { { start = rng.begin(); finish = rng.end(); - return true; + return true; } - + bool operator<<(const iterator_range& rng) BOOST_NOEXCEPT { start = const_cast(rng.begin()); finish = const_cast(rng.end()); - return true; + return true; } bool operator<<(const iterator_range& rng) BOOST_NOEXCEPT @@ -1720,8 +1720,8 @@ namespace boost { bool operator<<(boost::ulong_long_type n) { start = lcast_put_unsigned(n, finish); return true; } bool operator<<(boost::long_long_type n) { return shl_signed(n); } #elif defined(BOOST_HAS_MS_INT64) - bool operator<<(uint64_t n) { start = lcast_put_unsigned(n, finish); return true; } - bool operator<<( int64_t n) { return shl_signed(n); } + bool operator<<(unsigned __int64 n) { start = lcast_put_unsigned(n, finish); return true; } + bool operator<<( __int64 n) { return shl_signed(n); } #endif bool operator<<(float val) { return shl_real_type(val, start, finish); } bool operator<<(double val) { return shl_real_type(val, start, finish); } @@ -1732,7 +1732,7 @@ namespace boost { return shl_real_type(static_cast(val), start, finish); #endif } - + template bool operator<<(boost::array const& input) BOOST_NOEXCEPT { return shl_char_array_limited(input.begin(), N); } @@ -1756,13 +1756,13 @@ namespace boost { template bool operator<<(boost::array const& input) BOOST_NOEXCEPT { return ((*this) << reinterpret_cast const& >(input)); } - + #ifndef BOOST_NO_CXX11_HDR_ARRAY template bool operator<<(std::array const& input) BOOST_NOEXCEPT - { + { if (input.size()) return shl_char_array_limited(&input[0], N); - else return true; + else return true; } template @@ -1775,9 +1775,9 @@ namespace boost { template bool operator<<(std::array const& input) BOOST_NOEXCEPT - { + { if (input.size()) return shl_char_array_limited(&input[0], N); - else return true; + else return true; } template @@ -1788,7 +1788,7 @@ namespace boost { bool operator<<(std::array const& input) BOOST_NOEXCEPT { return ((*this) << reinterpret_cast const& >(input)); } #endif - + template bool operator<<(const InStreamable& input) { return shl_input_streamable(input); } @@ -1927,8 +1927,8 @@ namespace boost { bool operator>>(boost::ulong_long_type& output) { return shr_unsigned(output); } bool operator>>(boost::long_long_type& output) { return shr_signed(output); } #elif defined(BOOST_HAS_MS_INT64) - bool operator>>(uint64_t& output) { return shr_unsigned(output); } - bool operator>>(int64_t& output) { return shr_signed(output); } + bool operator>>(unsigned __int64& output) { return shr_unsigned(output); } + bool operator>>(__int64& output) { return shr_signed(output); } #endif bool operator>>(char& output) { return shr_xchar(output); } bool operator>>(unsigned char& output) { return shr_xchar(output); } @@ -1948,14 +1948,14 @@ namespace boost { template bool operator>>(boost::container::basic_string& str) { str.assign(start, finish); return true; } - + private: template bool shr_std_array(ArrayT& output) BOOST_NOEXCEPT { using namespace std; const std::size_t size = finish - start; - if (size > N - 1) { // `-1` because we need to store \0 at the end + if (size > N - 1) { // `-1` because we need to store \0 at the end return false; } @@ -1968,39 +1968,39 @@ namespace boost { template bool operator>>(boost::array& output) BOOST_NOEXCEPT - { - return shr_std_array(output); + { + return shr_std_array(output); } template - bool operator>>(boost::array& output) - { - return ((*this) >> reinterpret_cast& >(output)); + bool operator>>(boost::array& output) + { + return ((*this) >> reinterpret_cast& >(output)); } template - bool operator>>(boost::array& output) - { - return ((*this) >> reinterpret_cast& >(output)); + bool operator>>(boost::array& output) + { + return ((*this) >> reinterpret_cast& >(output)); } - + #ifndef BOOST_NO_CXX11_HDR_ARRAY template bool operator>>(std::array& output) BOOST_NOEXCEPT - { - return shr_std_array(output); + { + return shr_std_array(output); } template - bool operator>>(std::array& output) - { - return ((*this) >> reinterpret_cast& >(output)); + bool operator>>(std::array& output) + { + return ((*this) >> reinterpret_cast& >(output)); } template bool operator>>(std::array& output) - { - return ((*this) >> reinterpret_cast& >(output)); + { + return ((*this) >> reinterpret_cast& >(output)); } #endif @@ -2217,15 +2217,15 @@ namespace boost { static inline Target lexical_cast_impl(const Source& arg) { typedef lexical_cast_stream_traits stream_trait; - + typedef detail::lexical_stream_limited_src< - BOOST_DEDUCED_TYPENAME stream_trait::char_type, - BOOST_DEDUCED_TYPENAME stream_trait::traits, - stream_trait::requires_stringbuf + BOOST_DEDUCED_TYPENAME stream_trait::char_type, + BOOST_DEDUCED_TYPENAME stream_trait::traits, + stream_trait::requires_stringbuf > interpreter_type; // Target type must be default constructible - Target result; + Target result; BOOST_DEDUCED_TYPENAME stream_trait::char_type buf[stream_trait::len_t::value + 1]; stream_trait::len_t::check_coverage(); @@ -2408,7 +2408,7 @@ namespace boost { template inline Target lexical_cast(const CharType* chars, std::size_t count) { - BOOST_STATIC_ASSERT_MSG(boost::detail::is_char_or_wchar::value, + BOOST_STATIC_ASSERT_MSG(boost::detail::is_char_or_wchar::value, "CharType must be a character or wide character type"); return boost::lexical_cast( @@ -2535,10 +2535,10 @@ namespace boost { template Target lexical_cast(Source arg) { - typedef typename detail::widest_char< - BOOST_DEDUCED_TYPENAME detail::stream_char::type - , BOOST_DEDUCED_TYPENAME detail::stream_char::type - >::type char_type; + typedef typename detail::widest_char< + BOOST_DEDUCED_TYPENAME detail::stream_char::type + , BOOST_DEDUCED_TYPENAME detail::stream_char::type + >::type char_type; typedef std::char_traits traits; detail::lexical_stream interpreter; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/limits.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/limits.hpp index b4f45f7f..d3747a1a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/limits.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/limits.hpp @@ -1,5 +1,5 @@ -// (C) Copyright John maddock 1999. +// (C) Copyright John maddock 1999. // (C) David Abrahams 2002. 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) @@ -23,8 +23,8 @@ || (defined(BOOST_HAS_MS_INT64) && defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS)) // Add missing specializations for numeric_limits: #ifdef BOOST_HAS_MS_INT64 -# define BOOST_LLT int64_t -# define BOOST_ULLT uint64_t +# define BOOST_LLT __int64 +# define BOOST_ULLT unsigned __int64 #else # define BOOST_LLT ::boost::long_long_type # define BOOST_ULLT ::boost::ulong_long_type @@ -35,7 +35,7 @@ namespace std { template<> - class numeric_limits + class numeric_limits { public: @@ -84,11 +84,11 @@ namespace std BOOST_STATIC_CONSTANT(bool, traps = false); BOOST_STATIC_CONSTANT(bool, tinyness_before = false); BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero); - + }; template<> - class numeric_limits + class numeric_limits { public: @@ -137,10 +137,10 @@ namespace std BOOST_STATIC_CONSTANT(bool, traps = false); BOOST_STATIC_CONSTANT(bool, tinyness_before = false); BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero); - + }; } -#endif +#endif #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/common_factor_rt.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/common_factor_rt.hpp index 9a825b65..4582a96c 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/common_factor_rt.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/common_factor_rt.hpp @@ -4,13 +4,13 @@ // use, modify, sell and distribute this software is granted provided this // copyright notice appears in all copies. This software is provided "as is" // without express or implied warranty, and with no claim as to its suitability -// for any purpose. +// for any purpose. // boostinspect:nolicense (don't complain about the lack of a Boost license) // (Paul Moore hasn't been in contact for years, so there's no way to change the // license.) -// See http://www.boost.org for updates, documentation, and revision history. +// See http://www.boost.org for updates, documentation, and revision history. #ifndef BOOST_MATH_COMMON_FACTOR_RT_HPP #define BOOST_MATH_COMMON_FACTOR_RT_HPP @@ -314,7 +314,7 @@ namespace detail #ifdef BOOST_HAS_LONG_LONG BOOST_PRIVATE_GCD_UF( boost::ulong_long_type ); #elif defined(BOOST_HAS_MS_INT64) - BOOST_PRIVATE_GCD_UF( uint64_t ); + BOOST_PRIVATE_GCD_UF( unsigned __int64 ); #endif #if CHAR_MIN == 0 @@ -342,7 +342,7 @@ namespace detail #ifdef BOOST_HAS_LONG_LONG BOOST_PRIVATE_GCD_SF( boost::long_long_type, boost::ulong_long_type ); #elif defined(BOOST_HAS_MS_INT64) - BOOST_PRIVATE_GCD_SF( int64_t, uint64_t ); + BOOST_PRIVATE_GCD_SF( __int64, unsigned __int64 ); #endif #undef BOOST_PRIVATE_GCD_SF diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/concepts/real_concept.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/concepts/real_concept.hpp index 4e4434eb..1ed2c1df 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/concepts/real_concept.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/math/concepts/real_concept.hpp @@ -78,8 +78,8 @@ public: real_concept(boost::ulong_long_type c) : m_value(static_cast(c)){} real_concept(boost::long_long_type c) : m_value(static_cast(c)){} #elif defined(BOOST_HAS_MS_INT64) - real_concept(uint64_t c) : m_value(static_cast(c)){} - real_concept(int64_t c) : m_value(static_cast(c)){} + real_concept(unsigned __int64 c) : m_value(static_cast(c)){} + real_concept(__int64 c) : m_value(static_cast(c)){} #endif real_concept(float c) : m_value(c){} real_concept(double c) : m_value(c){} @@ -366,7 +366,7 @@ inline concepts::real_concept epsilon(BOOST_MATH_EXPLICI template <> inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept)) -{ +{ // Assume number of significand bits is same as real_concept_base_type, // unless std::numeric_limits::is_specialized to provide digits. return tools::digits(); @@ -432,7 +432,7 @@ inline long double real_cast(concepts::real #if BOOST_WORKAROUND(BOOST_MSVC, <= 1310) // -// For some strange reason ADL sometimes fails to find the +// For some strange reason ADL sometimes fails to find the // correct overloads, unless we bring these declarations into scope: // using concepts::itrunc; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/datatype.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/datatype.hpp index 0c1b3bd1..7fa7e1c3 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/datatype.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/datatype.hpp @@ -105,7 +105,7 @@ struct is_mpi_byte_datatype * directly to the MPI type @c MPI_INT. When there is a direct * mapping from the type @c T to an MPI type, @c * is_mpi_builtin_datatype will derive from @c mpl::true_ and the MPI - * data type will be accessible via @c get_mpi_datatype. + * data type will be accessible via @c get_mpi_datatype. * * In general, users should not need to specialize this * trait. However, if you have an additional C++ type that can map @@ -240,19 +240,19 @@ BOOST_MPI_DATATYPE(unsigned long, MPI_UNSIGNED_LONG, integer); /// INTERNAL ONLY #define BOOST_MPI_LIST2(A, B) A, B /// INTERNAL ONLY -BOOST_MPI_DATATYPE(std::pair, MPI_FLOAT_INT, +BOOST_MPI_DATATYPE(std::pair, MPI_FLOAT_INT, builtin); /// INTERNAL ONLY -BOOST_MPI_DATATYPE(std::pair, MPI_DOUBLE_INT, +BOOST_MPI_DATATYPE(std::pair, MPI_DOUBLE_INT, builtin); /// INTERNAL ONLY BOOST_MPI_DATATYPE(std::pair, MPI_LONG_DOUBLE_INT, builtin); /// INTERNAL ONLY -BOOST_MPI_DATATYPE(std::pair), MPI_LONG_INT, +BOOST_MPI_DATATYPE(std::pair), MPI_LONG_INT, builtin); /// INTERNAL ONLY -BOOST_MPI_DATATYPE(std::pair), MPI_SHORT_INT, +BOOST_MPI_DATATYPE(std::pair), MPI_SHORT_INT, builtin); /// INTERNAL ONLY BOOST_MPI_DATATYPE(std::pair), MPI_2INT, builtin); @@ -271,18 +271,18 @@ struct is_mpi_datatype > BOOST_MPI_DATATYPE(wchar_t, MPI_WCHAR, builtin); #endif -// Define long long or int64_t specialization of is_mpi_datatype, if possible. +// Define long long or __int64 specialization of is_mpi_datatype, if possible. #if defined(BOOST_HAS_LONG_LONG) && \ (defined(MPI_LONG_LONG_INT) || (defined(MPI_VERSION) && MPI_VERSION >= 2)) BOOST_MPI_DATATYPE(long long, MPI_LONG_LONG_INT, builtin); #elif defined(BOOST_HAS_MS_INT64) && \ (defined(MPI_LONG_LONG_INT) || (defined(MPI_VERSION) && MPI_VERSION >= 2)) -BOOST_MPI_DATATYPE(int64_t, MPI_LONG_LONG_INT, builtin); +BOOST_MPI_DATATYPE(__int64, MPI_LONG_LONG_INT, builtin); #endif -// Define unsigned long long or uint64_t specialization of +// Define unsigned long long or unsigned __int64 specialization of // is_mpi_datatype, if possible. We separate this from the check for -// the (signed) long long/int64_t because some MPI implementations +// the (signed) long long/__int64 because some MPI implementations // (e.g., MPICH-MX) have MPI_LONG_LONG_INT but not // MPI_UNSIGNED_LONG_LONG. #if defined(BOOST_HAS_LONG_LONG) && \ @@ -292,7 +292,7 @@ BOOST_MPI_DATATYPE(unsigned long long, MPI_UNSIGNED_LONG_LONG, builtin); #elif defined(BOOST_HAS_MS_INT64) && \ (defined(MPI_UNSIGNED_LONG_LONG) \ || (defined(MPI_VERSION) && MPI_VERSION >= 2)) -BOOST_MPI_DATATYPE(uint64_t, MPI_UNSIGNED_LONG_LONG, builtin); +BOOST_MPI_DATATYPE(unsigned __int64, MPI_UNSIGNED_LONG_LONG, builtin); #endif // Define signed char specialization of is_mpi_datatype, if possible. diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/multi_index/detail/uintptr_type.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/multi_index/detail/uintptr_type.hpp index fdb6078b..529c6231 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/multi_index/detail/uintptr_type.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/multi_index/detail/uintptr_type.hpp @@ -45,7 +45,7 @@ template<>struct uintptr_candidates<3> {typedef unsigned int type;}; #endif #if defined(BOOST_HAS_MS_INT64) -template<>struct uintptr_candidates<4> {typedef uint64_t type;}; +template<>struct uintptr_candidates<4> {typedef unsigned __int64 type;}; #else template<>struct uintptr_candidates<4> {typedef unsigned int type;}; #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/numeric/conversion/detail/old_numeric_cast.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/numeric/conversion/detail/old_numeric_cast.hpp index 554fed92..47b86d2c 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/numeric/conversion/detail/old_numeric_cast.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/numeric/conversion/detail/old_numeric_cast.hpp @@ -216,14 +216,14 @@ namespace boost { return x >= 0 && static_cast(static_cast(x)) != x; } # if defined(BOOST_MSVC) && BOOST_MSVC < 1300 - // MSVC6 can't static_cast uint64_t -> floating types + // MSVC6 can't static_cast unsigned __int64 -> floating types # define BOOST_UINT64_CAST(src_type) \ - static inline bool check(src_type x, uint64_t) \ + static inline bool check(src_type x, unsigned __int64) \ { \ if (x < 0) return false; \ - uint64_t y = static_cast(x); \ + unsigned __int64 y = static_cast(x); \ bool odd = y & 0x1; \ - int64_t div2 = static_cast(y >> 1); \ + __int64 div2 = static_cast<__int64>(y >> 1); \ return ((static_cast(div2) * 2.0) + odd) != x; \ } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/lwm_win32_cs.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/lwm_win32_cs.hpp index c062f68e..a45e2c2f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/lwm_win32_cs.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/lwm_win32_cs.hpp @@ -40,7 +40,7 @@ struct critical_section void * OwningThread; void * LockSemaphore; #if defined(_WIN64) - uint64_t SpinCount; + unsigned __int64 SpinCount; #else unsigned long SpinCount; #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/lwm_win32_cs.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/lwm_win32_cs.hpp index 55ed22a9..00477e49 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/lwm_win32_cs.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/lwm_win32_cs.hpp @@ -37,7 +37,7 @@ struct critical_section void * OwningThread; void * LockSemaphore; #if defined(_WIN64) - uint64_t SpinCount; + unsigned __int64 SpinCount; #else unsigned long SpinCount; #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/complex.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/complex.hpp index 7ad90d0c..71f44342 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/complex.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/complex.hpp @@ -43,7 +43,7 @@ using boost::math::fabs; #include #include -namespace std{ +namespace std{ #ifdef BOOST_NO_STDC_NAMESPACE using :: atan2; @@ -142,14 +142,14 @@ inline complex polar(const long long& rho, const long long& theta = 0) inline complex polar(const unsigned long long& rho, const unsigned long long& theta = 0) { return ::std::polar(static_cast(rho), static_cast(theta)); } #elif defined(BOOST_HAS_MS_INT64) -inline complex polar(const int64_t& rho, const int64_t& theta = 0) +inline complex polar(const __int64& rho, const __int64& theta = 0) { return ::std::polar(static_cast(rho), static_cast(theta)); } -inline complex polar(const uint64_t& rho, const uint64_t& theta = 0) +inline complex polar(const unsigned __int64& rho, const unsigned __int64& theta = 0) { return ::std::polar(static_cast(rho), static_cast(theta)); } #endif -template -inline complex::type> +template +inline complex::type> polar(const T& rho, const U& theta) { typedef typename boost::tr1_detail::promote_to_real::type real_type; @@ -210,7 +210,7 @@ inline complex::type> cast2_type y1(y); return std::pow(x1, y1); } -template +template inline complex::type> pow (const complex& x, const U& y) { @@ -223,7 +223,7 @@ inline complex::type> return std::pow(x1, y1); } -template +template inline complex::type> pow (const T& x, const complex& y) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/integral_promotion.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/integral_promotion.hpp index 475971bd..2109b9c6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/integral_promotion.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/integral_promotion.hpp @@ -54,8 +54,8 @@ BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int16) BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(__int32 ) BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int32) #ifdef __BORLANDC__ -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(uint64_t) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( int64_t) +BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int64) +BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( __int64) #endif #endif @@ -63,8 +63,8 @@ BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( int64_t) BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(boost::ulong_long_type) BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(boost::long_long_type ) #elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(uint64_t) -BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( int64_t) +BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE(unsigned __int64) +BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE( __int64) #endif #undef BOOST_TT_AUX_PROMOTE_NONSTANDARD_TYPE @@ -99,7 +99,7 @@ BOOST_TT_AUX_PROMOTE_FROM_INDEX(4, unsigned long) // WARNING: integral promotions to non-standard types -// long long and int64_t are not defined by the standard. +// long long and __int64 are not defined by the standard. // Additional specialisations and overloads shouldn't // introduce ambiguity, though. @@ -107,8 +107,8 @@ BOOST_TT_AUX_PROMOTE_FROM_INDEX(4, unsigned long) BOOST_TT_AUX_PROMOTE_FROM_INDEX(5, boost::long_long_type ) BOOST_TT_AUX_PROMOTE_FROM_INDEX(6, boost::ulong_long_type) #elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(7, int64_t ) -BOOST_TT_AUX_PROMOTE_FROM_INDEX(8, uint64_t) +BOOST_TT_AUX_PROMOTE_FROM_INDEX(7, __int64 ) +BOOST_TT_AUX_PROMOTE_FROM_INDEX(8, unsigned __int64) #endif #undef BOOST_TT_AUX_PROMOTE_FROM_INDEX @@ -142,8 +142,8 @@ BOOST_TT_AUX_PROMOTED_INDEX_TESTER(4, unsigned long) BOOST_TT_AUX_PROMOTED_INDEX_TESTER(5, boost::long_long_type ) BOOST_TT_AUX_PROMOTED_INDEX_TESTER(6, boost::ulong_long_type) #elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(7, int64_t ) -BOOST_TT_AUX_PROMOTED_INDEX_TESTER(8, uint64_t) +BOOST_TT_AUX_PROMOTED_INDEX_TESTER(7, __int64 ) +BOOST_TT_AUX_PROMOTED_INDEX_TESTER(8, unsigned __int64) #endif #undef BOOST_TT_AUX_PROMOTED_INDEX_TESTER diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/is_integral.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/is_integral.hpp index 3ef776d7..4ca97340 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/is_integral.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/is_integral.hpp @@ -56,8 +56,8 @@ BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int16,true) BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int32,true) BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int32,true) #ifdef __BORLANDC__ -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,uint64_t,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,int64_t,true) +BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true) +BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true) #endif #endif @@ -65,10 +65,10 @@ BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,int64_t,true) BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::ulong_long_type,true) BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::long_long_type,true) #elif defined(BOOST_HAS_MS_INT64) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,uint64_t,true) -BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,int64_t,true) +BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true) +BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true) #endif - + #ifdef BOOST_HAS_INT128 BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,boost::int128_type,true) BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,boost::uint128_type,true) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_signed.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_signed.hpp index ea3a0ac4..7deb8555 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_signed.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_signed.hpp @@ -45,7 +45,7 @@ struct make_signed_imp typedef typename remove_cv::type t_no_cv; typedef typename mpl::if_c< - (::boost::type_traits::ice_and< + (::boost::type_traits::ice_and< ::boost::is_signed::value, ::boost::is_integral::value, ::boost::type_traits::ice_not< ::boost::is_same::value>::value, @@ -53,7 +53,7 @@ struct make_signed_imp ::boost::type_traits::ice_not< ::boost::is_same::value>::value >::value), T, typename mpl::if_c< - (::boost::type_traits::ice_and< + (::boost::type_traits::ice_and< ::boost::is_integral::value, ::boost::type_traits::ice_not< ::boost::is_same::value>::value, ::boost::type_traits::ice_not< ::boost::is_same::value>::value, @@ -74,15 +74,15 @@ struct make_signed_imp #if defined(BOOST_HAS_LONG_LONG) #ifdef BOOST_HAS_INT128 typename mpl::if_c< - sizeof(t_no_cv) == sizeof(boost::long_long_type), - boost::long_long_type, + sizeof(t_no_cv) == sizeof(boost::long_long_type), + boost::long_long_type, boost::int128_type >::type #else boost::long_long_type #endif #elif defined(BOOST_HAS_MS_INT64) - int64_t + __int64 #else long #endif @@ -106,15 +106,15 @@ struct make_signed_imp #if defined(BOOST_HAS_LONG_LONG) #ifdef BOOST_HAS_INT128 typename mpl::if_c< - sizeof(t_no_cv) == sizeof(boost::long_long_type), - boost::long_long_type, + sizeof(t_no_cv) == sizeof(boost::long_long_type), + boost::long_long_type, boost::int128_type >::type #else boost::long_long_type #endif #elif defined(BOOST_HAS_MS_INT64) - int64_t + __int64 #else long #endif @@ -124,14 +124,14 @@ struct make_signed_imp >::type >::type >::type base_integer_type; - + // Add back any const qualifier: typedef typename mpl::if_< is_const, typename add_const::type, base_integer_type >::type const_base_integer_type; - + // Add back any volatile qualifier: typedef typename mpl::if_< is_volatile, diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_unsigned.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_unsigned.hpp index 77af984a..7e2fcdc4 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_unsigned.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/type_traits/make_unsigned.hpp @@ -45,7 +45,7 @@ struct make_unsigned_imp typedef typename remove_cv::type t_no_cv; typedef typename mpl::if_c< - (::boost::type_traits::ice_and< + (::boost::type_traits::ice_and< ::boost::is_unsigned::value, ::boost::is_integral::value, ::boost::type_traits::ice_not< ::boost::is_same::value>::value, @@ -53,7 +53,7 @@ struct make_unsigned_imp ::boost::type_traits::ice_not< ::boost::is_same::value>::value >::value), T, typename mpl::if_c< - (::boost::type_traits::ice_and< + (::boost::type_traits::ice_and< ::boost::is_integral::value, ::boost::type_traits::ice_not< ::boost::is_same::value>::value, ::boost::type_traits::ice_not< ::boost::is_same::value>::value, @@ -74,15 +74,15 @@ struct make_unsigned_imp #if defined(BOOST_HAS_LONG_LONG) #ifdef BOOST_HAS_INT128 typename mpl::if_c< - sizeof(t_no_cv) == sizeof(boost::ulong_long_type), - boost::ulong_long_type, + sizeof(t_no_cv) == sizeof(boost::ulong_long_type), + boost::ulong_long_type, boost::uint128_type >::type #else boost::ulong_long_type #endif #elif defined(BOOST_HAS_MS_INT64) - uint64_t + unsigned __int64 #else unsigned long #endif @@ -106,15 +106,15 @@ struct make_unsigned_imp #if defined(BOOST_HAS_LONG_LONG) #ifdef BOOST_HAS_INT128 typename mpl::if_c< - sizeof(t_no_cv) == sizeof(boost::ulong_long_type), - boost::ulong_long_type, + sizeof(t_no_cv) == sizeof(boost::ulong_long_type), + boost::ulong_long_type, boost::uint128_type >::type #else boost::ulong_long_type #endif #elif defined(BOOST_HAS_MS_INT64) - uint64_t + unsigned __int64 #else unsigned long #endif @@ -124,14 +124,14 @@ struct make_unsigned_imp >::type >::type >::type base_integer_type; - + // Add back any const qualifier: typedef typename mpl::if_< is_const, typename add_const::type, base_integer_type >::type const_base_integer_type; - + // Add back any volatile qualifier: typedef typename mpl::if_< is_volatile, diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/typeof/register_fundamental.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/typeof/register_fundamental.hpp index 4c461c8f..3a15888d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/typeof/register_fundamental.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/typeof/register_fundamental.hpp @@ -44,8 +44,8 @@ BOOST_TYPEOF_REGISTER_TYPE(__int16) BOOST_TYPEOF_REGISTER_TYPE(unsigned __int32) BOOST_TYPEOF_REGISTER_TYPE(__int32) #ifdef __BORLANDC__ -BOOST_TYPEOF_REGISTER_TYPE(uint64_t) -BOOST_TYPEOF_REGISTER_TYPE(int64_t) +BOOST_TYPEOF_REGISTER_TYPE(unsigned __int64) +BOOST_TYPEOF_REGISTER_TYPE(__int64) #endif #endif @@ -53,8 +53,8 @@ BOOST_TYPEOF_REGISTER_TYPE(int64_t) BOOST_TYPEOF_REGISTER_TYPE(::boost::ulong_long_type) BOOST_TYPEOF_REGISTER_TYPE(::boost::long_long_type) #elif defined(BOOST_HAS_MS_INT64) -BOOST_TYPEOF_REGISTER_TYPE(uint64_t) -BOOST_TYPEOF_REGISTER_TYPE(int64_t) +BOOST_TYPEOF_REGISTER_TYPE(unsigned __int64) +BOOST_TYPEOF_REGISTER_TYPE(__int64) #endif BOOST_TYPEOF_REGISTER_TYPE(void) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/wave_config.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/wave_config.hpp index a49a641a..ec712ef1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/wave_config.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/wave_config.hpp @@ -2,7 +2,7 @@ Boost.Wave: A Standard compliant C++ preprocessor library Global application configuration - + http://www.boost.org/ Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost @@ -20,10 +20,10 @@ #include /////////////////////////////////////////////////////////////////////////////// -// Define the maximal include nesting depth allowed. If this value isn't +// Define the maximal include nesting depth allowed. If this value isn't // defined it defaults to 1024 // -// To define a new initial include nesting define the following constant +// To define a new initial include nesting define the following constant // before including this file. // #if !defined(BOOST_WAVE_MAX_INCLUDE_LEVEL_DEPTH) @@ -33,7 +33,7 @@ /////////////////////////////////////////////////////////////////////////////// // Decide, whether to support variadics and placemarkers // -// To implement support variadics and placemarkers define the following to +// To implement support variadics and placemarkers define the following to // something not equal to zero. // #if !defined(BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS) @@ -41,10 +41,10 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Decide, whether to implement a #warning directive as an extension to the +// Decide, whether to implement a #warning directive as an extension to the // C++ Standard (same as #error, but emits a warning, not an error) // -// To disable the implementation of #warning directives, define the following +// To disable the implementation of #warning directives, define the following // constant as zero before including this file. // #if !defined(BOOST_WAVE_SUPPORT_WARNING_DIRECTIVE) @@ -52,9 +52,9 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Decide, whether to implement #pragma once +// Decide, whether to implement #pragma once // -// To disable the implementation of #pragma once, define the following +// To disable the implementation of #pragma once, define the following // constant as zero before including this file. // #if !defined(BOOST_WAVE_SUPPORT_PRAGMA_ONCE) @@ -62,9 +62,9 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Decide, whether to implement #pragma message("") +// Decide, whether to implement #pragma message("") // -// To disable the implementation of #pragma message(""), define the following +// To disable the implementation of #pragma message(""), define the following // constant as zero before including this file. // #if !defined(BOOST_WAVE_SUPPORT_PRAGMA_MESSAGE) @@ -75,7 +75,7 @@ // Decide, whether to implement #include_next // Please note, that this is an extension to the C++ Standard. // -// To disable the implementation of #include_next, define the following +// To disable the implementation of #include_next, define the following // constant as zero before including this file. // #if !defined(BOOST_WAVE_SUPPORT_INCLUDE_NEXT) @@ -85,7 +85,7 @@ /////////////////////////////////////////////////////////////////////////////// // Decide, whether to support C++11 // -// To implement C++11 keywords and preprocessor semantics define the following +// To implement C++11 keywords and preprocessor semantics define the following // to something not equal to zero. // #if !defined(BOOST_WAVE_SUPPORT_CPP0X) @@ -96,11 +96,11 @@ /////////////////////////////////////////////////////////////////////////////// // Undefine the following, to enable some MS specific language extensions: -// __int8, __int16, __int32, int64_t, __based, __declspec, __cdecl, +// __int8, __int16, __int32, __int64, __based, __declspec, __cdecl, // __fastcall, __stdcall, __try, __except, __finally, __leave, __inline, // __asm, #region, #endregion // -// Note: By default this is enabled for Windows based systems, otherwise it's +// Note: By default this is enabled for Windows based systems, otherwise it's // disabled. #if !defined(BOOST_WAVE_SUPPORT_MS_EXTENSIONS) #if defined(BOOST_WINDOWS) @@ -111,10 +111,10 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Allow the message body of the #error and #warning directives to be +// Allow the message body of the #error and #warning directives to be // preprocessed before the diagnostic is issued. // -// To disable preprocessing of the body of #error and #warning directives, +// To disable preprocessing of the body of #error and #warning directives, // define the following constant as zero before including this file. // #if !defined(BOOST_WAVE_PREPROCESS_ERROR_MESSAGE_BODY) @@ -122,10 +122,10 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Allow the #pragma directives to be returned to the caller (optionally after -// preprocessing the body) +// Allow the #pragma directives to be returned to the caller (optionally after +// preprocessing the body) // -// To disable the library to emit unknown #pragma directives, define the +// To disable the library to emit unknown #pragma directives, define the // following constant as zero before including this file. // #if !defined(BOOST_WAVE_EMIT_PRAGMA_DIRECTIVES) @@ -133,10 +133,10 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Allow the body of a #pragma directive to be preprocessed before the +// Allow the body of a #pragma directive to be preprocessed before the // directive is returned to the caller. // -// To disable the preprocessing of the body of #pragma directives, define the +// To disable the preprocessing of the body of #pragma directives, define the // following constant as zero before including this file. // #if !defined(BOOST_WAVE_PREPROCESS_PRAGMA_BODY) @@ -146,7 +146,7 @@ /////////////////////////////////////////////////////////////////////////////// // Allow to define macros with the command line syntax (-DMACRO(x)=definition) // -// To disable the possibility to define macros based on the command line +// To disable the possibility to define macros based on the command line // syntax, define the following constant as zero before including this file. // #if !defined(BOOST_WAVE_ENABLE_COMMANDLINE_MACROS) @@ -155,27 +155,27 @@ /////////////////////////////////////////////////////////////////////////////// // Define the pragma keyword to be used by the library to recognize its own -// pragma's. If nothing else is defined, then 'wave' will be used as the -// default keyword, i.e. the library recognizes all +// pragma's. If nothing else is defined, then 'wave' will be used as the +// default keyword, i.e. the library recognizes all // // #pragma wave option [(argument)] // -// and dispatches the handling to the interpret_pragma() preprocessing hook +// and dispatches the handling to the interpret_pragma() preprocessing hook // function (see file: preprocessing_hooks.hpp). The arguments part of the // pragma is optional. // The BOOST_WAVE_PRAGMA_KEYWORD constant needs to be defined to // resolve as a string literal value. #if !defined(BOOST_WAVE_PRAGMA_KEYWORD) #define BOOST_WAVE_PRAGMA_KEYWORD "wave" -#endif +#endif /////////////////////////////////////////////////////////////////////////////// -// Configure Wave thread support, Boost.Spirit and Boost.Pool are configured +// Configure Wave thread support, Boost.Spirit and Boost.Pool are configured // based on these settings automatically // -// If BOOST_WAVE_SUPPORT_THREADING is not defined, Wave will use the global +// If BOOST_WAVE_SUPPORT_THREADING is not defined, Wave will use the global // Boost build settings (BOOST_HAS_THREADS), if it is defined its value -// defines, whether threading will be enabled or not (should be set to '0' +// defines, whether threading will be enabled or not (should be set to '0' // or '1'). #if !defined(BOOST_WAVE_SUPPORT_THREADING) #if defined(BOOST_HAS_THREADS) @@ -185,7 +185,7 @@ #endif #endif -#if BOOST_WAVE_SUPPORT_THREADING != 0 +#if BOOST_WAVE_SUPPORT_THREADING != 0 #define BOOST_SPIRIT_THREADSAFE 1 #define PHOENIX_THREADSAFE 1 #else @@ -194,18 +194,18 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Define the string type to be used to store the token values and the file +// Define the string type to be used to store the token values and the file // names inside a file_position template class // #if !defined(BOOST_WAVE_STRINGTYPE) -// VC7 isn't able to compile the flex_string class, fall back to std::string +// VC7 isn't able to compile the flex_string class, fall back to std::string // CW up to 8.3 chokes as well *sigh* // Tru64/CXX has linker problems when using flex_string #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) || \ BOOST_WORKAROUND(__MWERKS__, < 0x3200) || \ (defined(__DECCXX) && defined(__alpha)) || \ - defined(BOOST_WAVE_STRINGTYPE_USE_STDSTRING) + defined(BOOST_WAVE_STRINGTYPE_USE_STDSTRING) #define BOOST_WAVE_STRINGTYPE std::string @@ -223,8 +223,8 @@ > \ > \ /**/ - -// This include is needed for the flex_string class used in the + +// This include is needed for the flex_string class used in the // BOOST_WAVE_STRINGTYPE above. #include @@ -237,13 +237,13 @@ // #define BOOST_SPIRIT_USE_LIST_FOR_TREES /////////////////////////////////////////////////////////////////////////////// -// The following definition forces the Spirit tree code to use boost pool +// The following definition forces the Spirit tree code to use boost pool // allocators instead of the std::allocator for the vector/list's. // #define BOOST_SPIRIT_USE_BOOST_ALLOCATOR_FOR_TREES /////////////////////////////////////////////////////////////////////////////// -// Uncomment the following, if you need debug output, the -// BOOST_SPIRIT_DEBUG_FLAGS_CPP constants below help to fine control the +// Uncomment the following, if you need debug output, the +// BOOST_SPIRIT_DEBUG_FLAGS_CPP constants below help to fine control the // amount of the generated debug output. //#define BOOST_SPIRIT_DEBUG @@ -262,16 +262,16 @@ #if !defined(BOOST_SPIRIT_DEBUG_FLAGS_CPP) #define BOOST_SPIRIT_DEBUG_FLAGS_CPP 0 // default is no debugging -#endif +#endif /////////////////////////////////////////////////////////////////////////////// // -// For all recognized preprocessor statements the output parse trees -// formatted as xml are printed. The formatted parse trees are streamed to the +// For all recognized preprocessor statements the output parse trees +// formatted as xml are printed. The formatted parse trees are streamed to the // std::ostream defined by the WAVE_DUMP_PARSE_TREE_OUT constant. // -// To enable the output of these parse trees, define the following constant -// as zero something not equal to zero before including this file. +// To enable the output of these parse trees, define the following constant +// as zero something not equal to zero before including this file. // #if !defined(BOOST_WAVE_DUMP_PARSE_TREE) #define BOOST_WAVE_DUMP_PARSE_TREE 0 @@ -283,10 +283,10 @@ /////////////////////////////////////////////////////////////////////////////// // // For all #if and #elif directives the preprocessed expressions are printed. -// These expressions are streamed to the std::ostream defined by the +// These expressions are streamed to the std::ostream defined by the // BOOST_WAVE_DUMP_CONDITIONAL_EXPRESSIONS_OUT constant. // -// To enable the output of the preprocessed expressions, define the following +// To enable the output of the preprocessed expressions, define the following // constant as something not equal to zero before including this file. // #if !defined(BOOST_WAVE_DUMP_CONDITIONAL_EXPRESSIONS) @@ -298,14 +298,14 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Decide, whether to use the separate compilation model for the instantiation +// Decide, whether to use the separate compilation model for the instantiation // of the C++ lexer objects. // // If this is defined, you should explicitly instantiate the C++ lexer // template with the correct parameters in a separate compilation unit of -// your program (see the file instantiate_re2c_lexer.cpp). +// your program (see the file instantiate_re2c_lexer.cpp). // -// To use the lexer inclusion model, define the following constant as +// To use the lexer inclusion model, define the following constant as // something not equal to zero before including this file. // #if !defined(BOOST_WAVE_SEPARATE_LEXER_INSTANTIATION) @@ -313,14 +313,14 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Decide, whether to use the separate compilation model for the instantiation +// Decide, whether to use the separate compilation model for the instantiation // of the grammar objects. // // If this is defined, you should explicitly instantiate the grammar // templates with the correct parameters in a separate compilation unit of -// your program (see the files instantiate_cpp_grammar.cpp et.al.). +// your program (see the files instantiate_cpp_grammar.cpp et.al.). // -// To use the grammar inclusion model, define the following constant as +// To use the grammar inclusion model, define the following constant as // something not equal to zero before including this file. // #if !defined(BOOST_WAVE_SEPARATE_GRAMMAR_INSTANTIATION) @@ -329,9 +329,9 @@ /////////////////////////////////////////////////////////////////////////////// // Decide whether to use a strict C++ lexer. -// -// If this is defined to something != 0, then the C++ lexers recognize the -// strict C99/C++ basic source character set. If it is not defined or defined +// +// If this is defined to something != 0, then the C++ lexers recognize the +// strict C99/C++ basic source character set. If it is not defined or defined // to zero, the C++ lexers recognize the '$' character as part of identifiers. // // The default is to recognize the '$' character as part of identifiers. @@ -341,14 +341,14 @@ #endif /////////////////////////////////////////////////////////////////////////////// -// Decide, whether the serialization of the wave::context class should be +// Decide, whether the serialization of the wave::context class should be // supported // // If this is defined to something not equal to zero the generated code will -// expose routines allowing to store and reload the internal state of the +// expose routines allowing to store and reload the internal state of the // wave::context object. // -// To enable the availability of the serialization functionality, define the +// To enable the availability of the serialization functionality, define the // following constant as something not equal to zero before including this file. // #if !defined(BOOST_WAVE_SERIALIZATION) @@ -368,19 +368,19 @@ /////////////////////////////////////////////////////////////////////////////// // Decide, whether to support long long integers in the preprocessor. // -// The C++ standard requires the preprocessor to use one of the following -// types for integer literals: long or unsigned long depending on an optional +// The C++ standard requires the preprocessor to use one of the following +// types for integer literals: long or unsigned long depending on an optional // suffix ('u', 'l', 'ul', or 'lu') // // Sometimes it's required to preprocess integer literals bigger than that -// (i.e. long long or unsigned long long). In this case you need to define the +// (i.e. long long or unsigned long long). In this case you need to define the // BOOST_WAVE_SUPPORT_LONGLONG_INTEGER_LITERALS to something not equal to zero. // -// This pp constant is effective only, if your target platform supports +// This pp constant is effective only, if your target platform supports // long long integers (BOOST_HAS_LONG_LONG is defined). // // Please note, that this setting doesn't relate to the Wave support option -// support_option_long_long, which enables the recognition of 'll' suffixes +// support_option_long_long, which enables the recognition of 'll' suffixes // only. // // Defining this pp constant enables the recognition of long long integers @@ -390,7 +390,7 @@ #define BOOST_WAVE_SUPPORT_LONGLONG_INTEGER_LITERALS 0 #endif -namespace boost { namespace wave +namespace boost { namespace wave { #if defined(BOOST_HAS_LONG_LONG) && \ BOOST_WAVE_SUPPORT_LONGLONG_INTEGER_LITERALS != 0 @@ -404,7 +404,7 @@ namespace boost { namespace wave /////////////////////////////////////////////////////////////////////////////// // On some platforms Wave will not be able to properly detect whether wchar_t -// is representing a signed or unsigned integral data type. Use the +// is representing a signed or unsigned integral data type. Use the // configuration constants below to force wchar_t being signed or unsigned, as // appropriate. // @@ -424,7 +424,7 @@ namespace boost { namespace wave #define PHOENIX_LIMIT 6 #endif #if PHOENIX_LIMIT < 6 -// boost/home/classic/spirit/classic_attribute.hpp sets PHOENIX_LIMIT to 3! +// boost/home/classic/spirit/classic_attribute.hpp sets PHOENIX_LIMIT to 3! #error "Boost.Wave: the constant PHOENIX_LIMIT must be at least defined to 6" \ " to compile the library." #endif @@ -433,12 +433,12 @@ namespace boost { namespace wave // Set up dll import/export options #if (defined(BOOST_WAVE_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)) && \ !defined(BOOST_WAVE_STATIC_LINK) - + #if defined(BOOST_WAVE_SOURCE) -#define BOOST_WAVE_DECL BOOST_SYMBOL_EXPORT +#define BOOST_WAVE_DECL BOOST_SYMBOL_EXPORT #define BOOST_WAVE_BUILD_DLL #else -#define BOOST_WAVE_DECL BOOST_SYMBOL_IMPORT +#define BOOST_WAVE_DECL BOOST_SYMBOL_IMPORT #endif #endif // building a shared library @@ -449,7 +449,7 @@ namespace boost { namespace wave /////////////////////////////////////////////////////////////////////////////// // Auto library naming -#if BOOST_VERSION >= 103100 +#if BOOST_VERSION >= 103100 // auto link features work beginning from Boost V1.31.0 #if !defined(BOOST_WAVE_SOURCE) && !defined(BOOST_ALL_NO_LIB) && \ !defined(BOOST_WAVE_NO_LIB) @@ -467,15 +467,15 @@ namespace boost { namespace wave #endif // BOOST_VERSION /////////////////////////////////////////////////////////////////////////////// -// Compatibility macros +// Compatibility macros // (ensure interface compatibility to older Wave versions) /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // The preprocessing hook signatures changed after the Boost V1.34.0 release // -// To use the preprocessing hook signatures as released with Boost V1.34.0 -// you need to define the BOOST_WAVE_USE_DEPRECIATED_PREPROCESSING_HOOKS +// To use the preprocessing hook signatures as released with Boost V1.34.0 +// you need to define the BOOST_WAVE_USE_DEPRECIATED_PREPROCESSING_HOOKS // constant to something not equal zero. // // To force using the new interface define this constant to zero. diff --git a/Minecraft.Client/PS3/PS3_App.cpp b/Minecraft.Client/PS3/PS3_App.cpp index 86496e2d..d2ab7150 100644 --- a/Minecraft.Client/PS3/PS3_App.cpp +++ b/Minecraft.Client/PS3/PS3_App.cpp @@ -31,7 +31,7 @@ CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp() m_bVoiceChatAndUGCRestricted=false; m_bDisplayFullVersionPurchase=false; -// #ifdef _DEBUG_MENUS_ENABLED +// #ifdef _DEBUG_MENUS_ENABLED // debugOverlayCreated = false; // #endif @@ -173,7 +173,7 @@ BOOL CConsoleMinecraftApp::ReadProductCodes() WRAPPED_READFILE(file,&pDLCInfo->iConfig,sizeof(int),&bytesRead,NULL); // push this into a vector - + wstring wstrTemp=convStringToWstring(chDLCTitle); m_SONYDLCMap[wstrTemp]=pDLCInfo; } @@ -266,7 +266,7 @@ void CConsoleMinecraftApp::FatalLoadError() aStrings[1] = L"Ðе удалоÑÑŒ загрузить игру \"Minecraft: PlayStation®3 Edition\". Продолжить загрузку невозможно."; aStrings[2] = L"Выйти из игры"; break; - case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_TCHINESE: aStrings[0] = L"載入錯誤"; aStrings[1] = L"無法載入「Minecraft: PlayStation®3 Editionã€ï¼Œå› æ­¤ç„¡æ³•繼續。"; aStrings[2] = L"é›¢é–‹éŠæˆ²"; @@ -360,7 +360,7 @@ void CConsoleMinecraftApp::FatalLoadError() } app.DebugPrintf("Requesting Message Box for Fatal Error again due to BUSY\n"); eResult=InputManager.RequestMessageBox(EMSgBoxType_None,0,NULL,this,(char *)u8Message,0); - } + } while(1) { @@ -467,9 +467,9 @@ void CConsoleMinecraftApp::FreeLocalTMSFiles(eTMSFileType eType) } LoadSaveDataThreadParam* LoadSaveFromDisk(const wstring& pathName) -{ +{ File saveFile(pathName); - int64_t fileSize = saveFile.length(); + __int64 fileSize = saveFile.length(); FileInputStream fis(saveFile); byteArray ba(fileSize); fis.read(ba); @@ -507,8 +507,8 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() StorageManager.SetSaveTitle(wWorldName.c_str()); bool isFlat = false; - int64_t seedValue = 0;//BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements -// int64_t seedValue = 0xfd97203ebdbf5c6f; + __int64 seedValue = 0;//BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements +// __int64 seedValue = 0xfd97203ebdbf5c6f; unsigned int seedLow = (unsigned int )(seedValue & 0xffffffff); unsigned int seedHigh = (unsigned int )(seedValue>>32); #ifndef _CONTENT_PACKAGE @@ -595,7 +595,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_GetProductList: - { + { m_eCommerce_State=eCommerce_State_GetProductList_Pending; SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); std::list::iterator iter = pCategories->subCategories.begin(); @@ -611,7 +611,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_AddProductInfoDetailed: - { + { m_eCommerce_State=eCommerce_State_AddProductInfoDetailed_Pending; // for each of the products in the categories, get the detailed info. We really only need the long description and price info. @@ -648,7 +648,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_RegisterDLC: - { + { m_eCommerce_State=eCommerce_State_Online; // register the DLC info SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); @@ -738,16 +738,16 @@ void CConsoleMinecraftApp::ClearCommerceDetails() { for(int i=0;i* pProductList=&m_ProductListA[i]; + std::vector* pProductList=&m_ProductListA[i]; pProductList->clear(); } if(m_ProductListA!=NULL) { - delete [] m_ProductListA; + delete [] m_ProductListA; m_ProductListA=NULL; } - + m_ProductListRetrievedC=0; m_ProductListAdditionalDetailsC=0; m_ProductListCategoriesC=0; @@ -778,11 +778,11 @@ void CConsoleMinecraftApp::GetDLCSkuIDFromProductList(char * pchDLCProductID, ch { SonyCommerce::ProductInfo Info=*it; if(strcmp(pchDLCProductID,Info.productId)==0) - { + { memcpy(pchSkuID,Info.skuId,SCE_NP_COMMERCE2_SKU_ID_LEN); return; } - } + } } } return; @@ -791,7 +791,7 @@ void CConsoleMinecraftApp::GetDLCSkuIDFromProductList(char * pchDLCProductID, ch void CConsoleMinecraftApp::Checkout(char *pchSkuID) { if(m_eCommerce_State==eCommerce_State_Online) - { + { strcpy(m_pchSkuID,pchSkuID); m_eCommerce_State=eCommerce_State_Checkout; } @@ -800,7 +800,7 @@ void CConsoleMinecraftApp::Checkout(char *pchSkuID) void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) { if(m_eCommerce_State==eCommerce_State_Online) - { + { strcpy(m_pchSkuID,pchSkuID); m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased; } @@ -809,7 +809,7 @@ void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) bool CConsoleMinecraftApp::UpgradeTrial() { if(m_eCommerce_State==eCommerce_State_Online) - { + { m_eCommerce_State=eCommerce_State_UpgradeTrial; return true; } @@ -846,12 +846,12 @@ bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) { std::vector* pProductList=&m_ProductListA[i]; AUTO_VAR(itEnd, pProductList->end()); - + for (AUTO_VAR(it, pProductList->begin()); it != itEnd; it++) { SonyCommerce::ProductInfo Info=*it; if(strcmp(pchTitle,Info.skuId)==0) - { + { if(Info.purchasabilityFlag==SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_OFF) { return true; @@ -861,7 +861,7 @@ bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) return false; } } - } + } } } return false; @@ -896,7 +896,7 @@ void CConsoleMinecraftApp::CommerceGetCategoriesCallback(LPVOID lpParam,int err) if(err==0) { pClass->m_ProductListCategoriesC=pClass->m_CategoryInfo.countOfSubCategories; - // allocate the memory for the product info for each categories + // allocate the memory for the product info for each categories if(pClass->m_CategoryInfo.countOfSubCategories>0) { pClass->m_ProductListA = (std::vector *) new std::vector [pClass->m_CategoryInfo.countOfSubCategories]; @@ -928,7 +928,7 @@ void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err { // we're done, so now retrieve the additional product details for each product pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; - pClass->m_bCommerceProductListRetrieved=true; + pClass->m_bCommerceProductListRetrieved=true; } else { @@ -938,21 +938,21 @@ void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err else { pClass->m_eCommerce_State=eCommerce_State_Error; - pClass->m_bCommerceProductListRetrieved=true; + pClass->m_bCommerceProductListRetrieved=true; } } // void CConsoleMinecraftApp::CommerceGetDetailedProductInfoCallback(LPVOID lpParam,int err) // { // CConsoleMinecraftApp *pScene=(CConsoleMinecraftApp *)lpParam; -// +// // if(err==0) // { // pScene->m_eCommerce_State=eCommerce_State_Idle; -// //pScene->m_bCommerceProductListRetrieved=true; +// //pScene->m_bCommerceProductListRetrieved=true; // } // //printf("Callback hit, error 0x%08x\n", err); -// +// // } void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam,int err) @@ -971,7 +971,7 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam { // MGH - change this to a while loop so we can skip empty categories. do - { + { pClass->m_iCurrentCategory++; }while(pClass->m_ProductListA[pClass->m_iCurrentCategory].size() == 0 && pClass->m_iCurrentCategorym_ProductListCategoriesC); @@ -980,12 +980,12 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam { // there are no more categories, so we're done pClass->m_eCommerce_State=eCommerce_State_RegisterDLC; - pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_bProductListAdditionalDetailsRetrieved=true; } else { // continue with the next category - pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; + pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; } } else @@ -997,7 +997,7 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam else { pClass->m_eCommerce_State=eCommerce_State_Error; - pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_bProductListAdditionalDetailsRetrieved=true; pClass->m_iCurrentProduct=0; pClass->m_iCurrentCategory=0; } @@ -1166,7 +1166,7 @@ char *PatchFilelist[] = // "/TitleUpdate/res/font/Default.png", "/TitleUpdate/res/font/Mojangles_7.png", "/TitleUpdate/res/font/Mojangles_11.png", - + "music/music/creative1.binka", "music/music/creative2.binka", "music/music/creative3.binka", @@ -1227,7 +1227,7 @@ bool CConsoleMinecraftApp::CheckForEmptyStore(int iPad) bool bEmptyStore=true; if(pCategories!=NULL) - { + { if(pCategories->countOfProducts>0) { bEmptyStore=false; diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseDataStorage_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseDataStorage_SPU.h index 3b7ae2c8..30266d7f 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseDataStorage_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseDataStorage_SPU.h @@ -17,9 +17,9 @@ // To meet these requirements, this class is now implemented using a lock-free system, implemented using a read-copy-update (RCU) type algorithm. Some details... -// (1) The storage details for the class are now packed into a single int64_t, which contains both a pointer to the data that is required and a count of how many planes worth +// (1) The storage details for the class are now packed into a single __int64, which contains both a pointer to the data that is required and a count of how many planes worth // of storage are allocated. This allows the full storage to be updated atomically using compare and exchange operations (implemented with InterlockedCompareExchangeRelease64). -// (2) The data pointer referenced in this int64_t points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and +// (2) The data pointer referenced in this __int64 points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and // the rest of the data is variable in size to accomodate however many planes are required to be stored // (3) The RCU bit of the algorithm means that any read operations don't need to do any checks or locks at all. When the data needs to be updated, a copy of it is made and updated, // then an attempt is made to swap the new data in - if this succeeds then the old data pointer is deleted later at some point where we know nothing will be reading from it anymore. @@ -33,7 +33,7 @@ class SparseDataStorage_SPU { private: // unsigned char planeIndices[128]; - unsigned char* m_pData; + unsigned char* m_pData; // unsigned char *data; // unsigned int allocatedPlaneCount; diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseLightStorage_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseLightStorage_SPU.h index 728d1fe5..01b2aa6e 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseLightStorage_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/SparseLightStorage_SPU.h @@ -20,9 +20,9 @@ // To meet these requirements, this class is now implemented using a lock-free system, implemented using a read-copy-update (RCU) type algorithm. Some details... -// (1) The storage details for the class are now packed into a single int64_t, which contains both a pointer to the data that is required and a count of how many planes worth +// (1) The storage details for the class are now packed into a single __int64, which contains both a pointer to the data that is required and a count of how many planes worth // of storage are allocated. This allows the full storage to be updated atomically using compare and exchange operations (implemented with InterlockedCompareExchangeRelease64). -// (2) The data pointer referenced in this int64_t points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and +// (2) The data pointer referenced in this __int64 points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and // the rest of the data is variable in size to accomodate however many planes are required to be stored // (3) The RCU bit of the algorithm means that any read operations don't need to do any checks or locks at all. When the data needs to be updated, a copy of it is made and updated, // then an attempt is made to swap the new data in - if this succeeds then the old data pointer is deleted later at some point where we know nothing will be reading from it anymore. @@ -36,7 +36,7 @@ class SparseLightStorage_SPU { private: // unsigned char planeIndices[128]; - unsigned char* m_pData; + unsigned char* m_pData; // unsigned char *data; // unsigned int allocatedPlaneCount; diff --git a/Minecraft.Client/PSVita/Iggy/include/rrCore.h b/Minecraft.Client/PSVita/Iggy/include/rrCore.h index 17ebee3a..e88b5f8c 100644 --- a/Minecraft.Client/PSVita/Iggy/include/rrCore.h +++ b/Minecraft.Client/PSVita/Iggy/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/PSVita/Miles/include/mss.h b/Minecraft.Client/PSVita/Miles/include/mss.h index 754f536b..531dcbc9 100644 --- a/Minecraft.Client/PSVita/Miles/include/mss.h +++ b/Minecraft.Client/PSVita/Miles/include/mss.h @@ -39,7 +39,7 @@ // doc system stuff #ifndef EXPAPI -#define EXPAPI +#define EXPAPI #endif #ifndef EXPTYPE #define EXPTYPE @@ -69,10 +69,10 @@ // For docs EXPGROUP(_NullGroup) #define MilesVersion "9.3m" EXPMACRO -#define MilesMajorVersion 9 EXPMACRO +#define MilesMajorVersion 9 EXPMACRO #define MilesMinorVersion 3 EXPMACRO -#define MilesBuildNumber 11 EXPMACRO -#define MilesCustomization 0 EXPMACRO +#define MilesBuildNumber 11 EXPMACRO +#define MilesCustomization 0 EXPMACRO EXPGROUP(_RootGroup) @@ -273,14 +273,14 @@ typedef void VOIDFUNC(void); //================ EXPGROUP(Basic Types) -#define AILCALL EXPTAG(AILCALL) +#define AILCALL EXPTAG(AILCALL) /* Internal calling convention that all external Miles functions use. Usually cdecl or stdcall on Windows. */ -#define AILCALLBACK EXPTAG(AILCALLBACK docproto) +#define AILCALLBACK EXPTAG(AILCALLBACK docproto) /* Calling convention that user supplied callbacks from Miles use. @@ -326,7 +326,7 @@ RADDEFSTART typedef CHAR *LPSTR, *PSTR; #ifdef IS_WIN64 - typedef uint64_t ULONG_PTR, *PULONG_PTR; + typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; #else #ifdef _Wp64 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 @@ -348,13 +348,13 @@ RADDEFSTART typedef struct HWAVEOUT__ *HWAVEOUT; typedef HWAVEIN *LPHWAVEIN; typedef HWAVEOUT *LPHWAVEOUT; - + #ifndef WAVE_MAPPER #define WAVE_MAPPER ((UINT)-1) #endif typedef struct waveformat_tag *LPWAVEFORMAT; - + typedef struct HMIDIOUT__ *HMIDIOUT; typedef HMIDIOUT *LPHMIDIOUT; typedef struct HWND__ *HWND; @@ -368,9 +368,9 @@ RADDEFSTART // If compiling MSS DLL, use __declspec(dllexport) for both // declarations and definitions // - + #ifdef IS_WIN32 - + #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) #define AILLIBCALLBACK __stdcall #define AILCALL __stdcall @@ -382,20 +382,20 @@ RADDEFSTART #define AILCALLBACK __cdecl #define AILEXPORT __cdecl #endif - + #ifdef __RADINDLL__ #define DXDEC __declspec(dllexport) #define DXDEF __declspec(dllexport) #else - + #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) #define DXDEC extern #else #define DXDEC __declspec(dllimport) #endif - + #endif - + #ifdef IS_WIN64 #define MSSDLLNAME "MSS64.DLL" #define MSS_REDIST_DIR_NAME "redist64" @@ -403,11 +403,11 @@ RADDEFSTART #define MSSDLLNAME "MSS32.DLL" #define MSS_REDIST_DIR_NAME "redist" #endif - + #define MSS_DIR_SEP "\\" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - + #endif typedef void * LPVOID; @@ -420,7 +420,7 @@ RADDEFSTART #define AILLIBCALLBACK #define AILCALL #define AILEXPORT - #define AILCALLBACK + #define AILCALLBACK #elif defined(__RADX86__) #define AILLIBCALLBACK __attribute__((cdecl)) #define AILCALL __attribute__((cdecl)) @@ -437,7 +437,7 @@ RADDEFSTART #define DXDEC extern #define DXDEF #endif - + #ifdef __RADX64__ #define MSS_REDIST_DIR_NAME "redist/x64" #elif defined(IS_X86) @@ -447,7 +447,7 @@ RADDEFSTART #else #error "No Redist Dir Specified" #endif - + #define MSS_DIR_SEP "/" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP @@ -714,7 +714,7 @@ typedef enum #ifndef FILE_ERRS #define FILE_ERRS - + #define AIL_NO_ERROR 0 #define AIL_IO_ERROR 1 #define AIL_OUT_OF_MEMORY 2 @@ -736,9 +736,9 @@ EXPTYPEBEGIN typedef SINTa HMSSENUM; EXPTYPEEND /* specifies a type used to enumerate through a list of properties. - + $:MSS_FIRST use this value to start the enumeration process. - + The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call the enumeration function until it returns 0. @@ -751,7 +751,7 @@ the enumeration function until it returns 0. // Preference names and default values // -#define AIL_MM_PERIOD 0 +#define AIL_MM_PERIOD 0 #define DEFAULT_AMP 1 // Default MM timer period = 5 msec. #define AIL_TIMERS 1 @@ -1877,7 +1877,7 @@ typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D posi F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. F32 spread; - + HSAMPLE owner; // May be NULL if used for temporary/internal calculations AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired @@ -1915,7 +1915,7 @@ typedef struct _SAMPLE // Sample instance S32 index; // Numeric index of this sample SMPBUF buf[8]; // Source data buffers - + U32 src_fract; // Fractional part of source address U32 mix_delay; // ms until start mixing (decreased every buffer mix) @@ -1924,7 +1924,7 @@ typedef struct _SAMPLE // Sample instance U64 mix_bytes; // total number of bytes sent to the mixer for this sample. S32 group_id; // ID for grouped operations. - + // size of the next dynamic arrays U32 chan_buf_alloced; U32 chan_buf_used; @@ -1946,10 +1946,10 @@ typedef struct _SAMPLE // Sample instance // these are dynamic arrays F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) - + S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # // 99% of the time this is a 1:1 mapping and is zero. - + S32 lp_any_on; // are any of the low pass filters on? S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? @@ -1989,7 +1989,7 @@ typedef struct _SAMPLE // Sample instance U32 low_pass_changed; // bit mask for what channels changed. - + S32 bus; // Bus assignment for this sample. S32 bus_comp_sends; // Which buses this bus routes compressor input to. S32 bus_comp_installed; // Nonzero if we have a compressor installed. @@ -2042,7 +2042,7 @@ typedef struct _SAMPLE // Sample instance SPINFO pipeline[N_SAMPLE_STAGES]; S32 n_active_filters; // # of SP_FILTER_n stages active - + // // 3D-related state for all platforms (including Xbox) // @@ -2113,14 +2113,14 @@ DXDEC void AILCALL AIL_serve(void); #ifdef IS_MAC typedef void * LPSTR; - + #define WHDR_DONE 0 - + typedef struct _WAVEIN { long temp; } * HWAVEIN; - + typedef struct _WAVEHDR { S32 dwFlags; @@ -2133,7 +2133,7 @@ DXDEC void AILCALL AIL_serve(void); S32 dwLoops; void * lpNext; U32 * reserved; - + } WAVEHDR, * LPWAVEHDR; #endif @@ -2145,7 +2145,7 @@ typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver #ifdef IS_MAC #define AIL_DIGITAL_INPUT_DEFAULT 0 - + typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver { U32 tag; // HDIN @@ -2478,7 +2478,7 @@ typedef struct _DIG_DRIVER // Handle to digital audio driver U32 last_ds_play; U32 last_ds_write; U32 last_ds_move; - + #endif #ifdef IS_X86 @@ -2661,7 +2661,7 @@ typedef struct _SEQUENCE // XMIDI sequence state table void const *EVNT; U8 const *EVNT_ptr; // Current event pointer - + U8 *ICA; // Indirect Controller Array AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler @@ -3121,13 +3121,13 @@ DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); #elif defined(__RADANDROID__) DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); - + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); #define AIL_open_digital_driver(frequency, bits, channel, flags) \ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) - + #elif defined(IS_PSP2) DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); @@ -3221,7 +3221,7 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire { Str255 version_name; } MSS_VersionType; - + #define AIL_MSS_version(str,len) \ { \ long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ @@ -3269,11 +3269,11 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire } \ } \ } - + #endif DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - + DXDEC S32 AILCALL AIL_digital_handle_reacquire (HDIGDRIVER drvr); @@ -3339,18 +3339,18 @@ DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 c $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only - affected when popped. + affected when popped. $- - If you want more control over whether a sample will be affected by a push or a pop operation, + If you want more control over whether a sample will be affected by a push or a pop operation, see $AIL_set_sample_level_mask. - + */ DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); /* - Pops the current system state and returns the system to the way it + Pops the current system state and returns the system to the way it was before the last push. $:dig The driver to pop. @@ -3374,7 +3374,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); $:S The sample to set the mask for. $:mask The bitmask of levels for which the sample will play. - Under normal push/pop operations, a sample's mask is set when it is + Under normal push/pop operations, a sample's mask is set when it is started to the level the system is at. If the system is pushed without a reset, then the mask is adjusted to include the new level. When a system is popped, if the sample is going to continue playing, @@ -3435,7 +3435,7 @@ DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); $:return The HSAMPLE for the new bus. A bus allows you to treat a group of samples as one sample. With the bus sample you can - do almost all of the things you can do with a normal sample handle. The only exception + do almost all of the things you can do with a normal sample handle. The only exception is you can't adjust the playback rate of the sample. Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. @@ -3495,7 +3495,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); /* - Installs the Compressor filter on to a bus, using another bus as the input for + Installs the Compressor filter on to a bus, using another bus as the input for compression/limiting. $:dig The driver the busses exist on. @@ -3508,7 +3508,7 @@ DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_inde its signal strength to the filter, allowing it to attenuate the bus_index bus based on another bus's contents. - To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and + To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties are documented under $(Compressor Filter) */ @@ -4325,7 +4325,7 @@ typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); #define MSS_STREAM_CHUNKS 8 -typedef struct _STREAM +typedef struct _STREAM { S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream S32 using_ASI; // 1 if using ASI decoder to uncompress stream data @@ -4349,7 +4349,7 @@ typedef struct _STREAM S32 read_IO_index; // index of buffer to be loaded into Miles next S32 bufsize; // size of each buffer - + U32 datarate; // datarate in bytes per second S32 filerate; // original datarate of the file S32 filetype; // file format type @@ -4987,7 +4987,7 @@ typedef struct OGG_INFO; DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, - U8 *Ogg_file_image, + U8 *Ogg_file_image, S32 Ogg_file_size); DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); @@ -5102,10 +5102,10 @@ DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); // 3D-related calls // -DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, +DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, S32 bus_index); -DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, +DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, S32 bus_index, S32 room_type); @@ -5180,7 +5180,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSS $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If + This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be called otherwise. @@ -5195,8 +5195,8 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, M $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having an exclusion that varies as a function of distance to the listener. If - a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion + This marks a sample as having an exclusion that varies as a function of distance to the listener. If + a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion affects reverb wet level. The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. @@ -5230,7 +5230,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECT other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional source. - If there is neither spread falloff nor volume falloff specified, spread will be automatically applied + If there is neither spread falloff nor volume falloff specified, spread will be automatically applied when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff and $AIL_set_sample_3D_volume_falloff. @@ -5243,7 +5243,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); $:S Sample to affect. $:spread The value to set the spread to. - Spread is how much the directionality of a sample "spreads" to more speakers - emulating + Spread is how much the directionality of a sample "spreads" to more speakers - emulating the effect a sound has when it occupies more than a point source. For instance, a sound point source that sits directly to the left of the listener would have a very strong left speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be @@ -5392,7 +5392,7 @@ EXPGROUP(Miles High Level Event System) EXPTYPE typedef struct MSSSOUNDBANK {}; /* Internal structure. - + Use $HMSOUNDBANK instead. */ @@ -5401,7 +5401,7 @@ EXPTYPE typedef struct MSSSOUNDBANK {}; EXPTYPE typedef struct SoundBank *HMSOUNDBANK; /* Describes a handle to an open sound bank. - + This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. */ @@ -5424,7 +5424,7 @@ DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); Close a soundbank previously opened with $AIL_open_soundbank. $:bank Soundbank to close. - + Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from this soundbank are no longer valid. */ @@ -5448,7 +5448,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. - The name of the bank is the name used in asset names. This is distinct from the + The name of the bank is the name used in asset names. This is distinct from the file name of the bank. The return value should not be deleted. @@ -5457,7 +5457,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); /* Returns the amount of data used by the soundbank management structures. - + $:bank Soundbank to query. $:return Total memory allocated. @@ -5476,7 +5476,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sound presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5503,7 +5503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMS $:return Returns 0 when enumeration is complete. Enumerates the environment presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5530,7 +5530,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sounds available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* SoundName = 0; @@ -5549,7 +5549,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* Note that name should NOT be deleted by the caller - this points at memory owned by Miles. */ - + DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); /* Enumerate the events stored in a soundbank. @@ -5561,7 +5561,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, $:return Returns 0 when enumeration is complete. Enumerates the events available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* EventName = 0; @@ -5624,7 +5624,7 @@ DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. This will alter the properties on a given sample, based on the given preset. -*/ +*/ DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); /* @@ -5644,7 +5644,7 @@ DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK ba $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. Presets may or may not affect any given property. Only the properties affected by the specified - preset will have their values restored to default. + preset will have their values restored to default. */ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); @@ -5658,7 +5658,7 @@ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPO $:isfloat nonzero if the output needs to be a float. The function callback should convert variable expressions in to an output value of the - requested type. + requested type. */ DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); @@ -5777,7 +5777,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name $:name The name of the sound asset to find. $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. - $:return Returns the byte size of the buffer required for out_name. + $:return Returns the byte size of the buffer required for out_name. This function must be called in order to resolve the sound asset name to something that can be used by miles. To ensure safe buffer containment, call @@ -5832,7 +5832,7 @@ typedef struct _MEMDUMP* HMEMDUMP; ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." - Discussion = "Primarily designed for offline use, this function is the first step in + Discussion = "Primarily designed for offline use, this function is the first step in creating an event that can be consumed by the MilesEvent system. Usage is as follows: HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); @@ -5850,7 +5850,7 @@ typedef struct _MEMDUMP* HMEMDUMP; Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following $AIL_complete_event_queue_processing. - + Events are generally tailored to the MilesEvent system, even though there is nothing preventing you from writing your own event system, or creation ui. " @@ -5906,7 +5906,7 @@ EXPTYPEEND /* Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. - $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same + $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same sound to play twice in a row. This is the only selection type that doesn't require a state variable. $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. @@ -5926,10 +5926,10 @@ EXPTYPEEND Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." - In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. - If there are multiple names listed, the sound will be chosen at random based on the given weights. This + In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. + If there are multiple names listed, the sound will be chosen at random based on the given weights. This string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always - terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use + terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use an empty string as an entry." In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" @@ -5944,7 +5944,7 @@ EXPTYPEEND In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." - In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound + In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound with a priority strictly less than the given priority." In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." @@ -5969,19 +5969,19 @@ DXDEC S32 AILCALL AIL_add_start_sound_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_SoundNames, - const char* i_PresetName, + const char* i_PresetName, U8 i_PresetIsDynamic, const char* i_EventName, const char* i_StartMarker, const char* i_EndMarker, char const* i_StateVar, char const* i_VarInit, - const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, + const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, const char* i_StartOffset, F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, F32 i_FadeInTime, - U8 i_EvictionType, + U8 i_EvictionType, U8 i_SelectType ); @@ -6004,7 +6004,7 @@ AIL_add_start_sound_event_step( In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to be called with the same parameters. - + If you are using MilesEvent, the data is refcounted so the sound will not be freed until all samples using it complete." } @@ -6089,7 +6089,7 @@ DXDEC S32 AILCALL AIL_add_control_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, const char* i_PresetName, U8 i_PresetApplyType, @@ -6191,7 +6191,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Defines a named blend function to be referenced by a blended sound later. $:i_Event The event to add the step to. - $:i_Name The name of the blend. This is the name that will be + $:i_Name The name of the blend. This is the name that will be referenced by the state variable in start sound, as well as the variable name to set by the game to update the blend for an instance. $:i_SoundCount The number of sounds this blend will affect. Max 10. @@ -6226,7 +6226,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Miles max sample count." } */ -DXDEC S32 AILCALL +DXDEC S32 AILCALL AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); /*! @@ -6257,8 +6257,8 @@ AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitNa AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" } */ -DXDEC S32 AILCALL -AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, +DXDEC S32 AILCALL +AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, const char* i_Labels, U8 i_IsDynamic ); @@ -6272,13 +6272,13 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * n thus shouldn't be checked via strlen, etc. $:return Returns 0 on fail. - Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, + Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, rather than inspected directly. */ DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); /* - Clears all persistent state in the runtime. + Clears all persistent state in the runtime. $:i_Event The event to add the step to. @@ -6311,7 +6311,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Ev DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); /* Adds a step to define a variable that oscillates over time. - + $:i_Event The event to add the step to. $:i_Name The nane of the variable to oscillate. $:i_Base The value to oscillate around, or a variable name to use as the base. @@ -6327,15 +6327,15 @@ DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); /* Adds a step to set and move a variable over time on a curve. - + $:i_Event The event to add the step to. $:i_Name The variable to move. $:i_Times The midpoint and final times for the curves $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) $:i_Values The initial, midpoint, and final values for the variable. - + The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. - + If an existing move var exists when the new one is added, the old one is replaced. */ @@ -6450,7 +6450,7 @@ struct EVENT_STEP_INFO U8 isdynamic; } persist; - struct + struct { MSSSTRINGC name; MSSSTRINGC labels; @@ -6522,7 +6522,7 @@ struct EVENT_STEP_INFO the string location of the next event step in the buffer." Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be - used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the + used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the next step. In this manner it can be used in a loop: // Create an event to stop all sounds. @@ -6610,11 +6610,11 @@ EXPTYPE typedef void* HEVENTSYSTEM; DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); /* Initializes the Miles Event system and associates it with an open digital driver. - + $:dig The digital sound driver that this event system should use. $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). - $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. - Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. + $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. + Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. Use 0 to let Miles to allocate this buffer itself. $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). @@ -6633,8 +6633,8 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); $:return A handle to the event system to use in various high level functions. Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. - - To enqueue events to the new system, use $AIL_enqueue_event_system. + + To enqueue events to the new system, use $AIL_enqueue_event_system. To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. @@ -6646,7 +6646,7 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); /* Shuts down the Miles event system. - + This function will closes everything in the event system - it ignores reference counts. It will free all event memory, sound banks, and samples used by the system. */ @@ -6660,10 +6660,10 @@ DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char c $:return The handle to the newly loaded soundbank (zero on failure). This function opens the sound bank and makes it available to the event system. The filename - is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. + is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', and while using the name 'gamebank' for authoring and auditioning. - + Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds is played, or a sound requiring it plays. @@ -6685,7 +6685,7 @@ DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); Any other data references still existing (queued events, persisted presets, etc) will report errors when used, but will not crash. - + Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. @@ -6698,24 +6698,24 @@ DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name) (EXPAPI removed to prevent release in docs) Searches for an event by name in the event system. - + $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". $:return A pointer to the event contents (or 0, if the event isn't found). - + This function is normally used as the event parameter for $AIL_enqueue_event. It searches one or all open soundbanks for a particular event name. - - This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with + + This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with MILESEVENT_ENQUEUE_BY_NAME. - + Events that are not enqueued by name can not be tracked by the Auditioner. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to a specific system. Used only if you have multiple event systems running. - + $:system The event system to attach the event to. $:return See $AIL_enqueue_event for return description. @@ -6728,10 +6728,10 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); $:name The full name of the event, eg "soundbank/path/to/event". $:return See $AIL_enqueue_event for return description. - - This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. - - For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent + + This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. + + For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) For introduction to the auditioning system, see $integrating_events. @@ -6743,9 +6743,9 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); $:return A token used for passing to functions that add data to the event. - This is used to pass more data to an event that will be executed. For instance, if + This is used to pass more data to an event that will be executed. For instance, if an event is going to spatialize a sound, but there's no need to move the sound over the course of - its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a + its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a sound is started it will use that for its initial position, and there is no need to do any game object <-> event id tracking. @@ -6762,7 +6762,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); The enqueue process is still completely thread safe. No locks are used, however only 8 enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start - will yield the thread until a slot is open. + will yield the thread until a slot is open. The ONLY time that should happen is if events enqueues are started but never ended: @@ -6838,7 +6838,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as user_buffer is never dereferenced. - $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and + $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and carried with the event. During sound enumeration this buffer is made available, and you never have to worry about memory management. $- @@ -6855,7 +6855,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data->game_stat = 1; data->needed_info = 2; - // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound + // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound // completes and we're done using it in the enumeration loop. S32 ptr_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); @@ -6874,7 +6874,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data.game_stat = 1; data.needed_info = 2; - // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use + // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use // a stack variable like this S32 buf_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); @@ -6895,7 +6895,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* nam $:value The value of the variable to set. $:return 0 if the enqueue buffer is full - When a sound starts, the given variable will be set to the given value prior to any possible + When a sound starts, the given variable will be set to the given value prior to any possible references being used by presets. */ @@ -6904,7 +6904,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); Limits the effects of the event to sounds started by the given ID. $:token A token created with $AIL_enqueue_event_start - $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an + $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an event, it will apply to all sounds started by the event, and any events queued by that event. $:return 0 if the enqueue buffer is full @@ -6932,7 +6932,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); $:selection The value to use for selecting the sound to play. $:return 0 if the enqueue buffer is full - The selection index is used to programatically select a sound from the + The selection index is used to programatically select a sound from the loaded banks. The index passed in replaces any numeric value at the end of the sound name existing in any start sound event step. For example, if a start sound event plays "mybank/sound1", and the event is queued with @@ -6969,52 +6969,52 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* even As with all of the enqueue functions it is completely thread-safe. Upon completion of this function, the enqueue slot is release and available for another - $AIL_enqueue_event_start. + $AIL_enqueue_event_start. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. - - $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. + + $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. - $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. - This data is then accessible later, when enumerating the instances. + $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. + This data is then accessible later, when enumerating the instances. $:user_buffer_len Size of the buffer pointed to by user_buffer. $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, - when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if + when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you - execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. + execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. - $:return On success, returns QueuedID value that is unique to this queued event for the rest of this + $:return On success, returns QueuedID value that is unique to this queued event for the rest of this program run (you can use this ID to uniquely identify sounds triggered from this event). - + This function enqueues an event to be triggered - this is how you begin execution of an event. First, you queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to execute an event. - - This function is very lightweight. It does nothing more than post the event and data to a + + This function is very lightweight. It does nothing more than post the event and data to a command buffer that gets executed via $AIL_begin_event_queue_processing. The user_buffer parameter can be used in different ways. If no flags are passed in, then Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with the queued sound - you can then free the user_buffer data completely! This lets Miles keep track - of all your sound related memory directly and is the normal way to use the system (it is very + of all your sound related memory directly and is the normal way to use the system (it is very convenient once you get used to it). If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will simply be associated with each sound that this event may start. In this case, user_buffer_len is ignored. - - In both cases, when you later enumerate the sound instances, you can access your sound data + + In both cases, when you later enumerate the sound instances, you can access your sound data with the $(MILESEVENTSOUNDINFO::UserBuffer) field. - + You can call this function from any number threads - it's designed to be called from anywhere in your game. If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done - by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and + by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. */ @@ -7044,23 +7044,23 @@ DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); /* Begin execution of all of the enqueued events. - $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events + $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events (out of memory, bank file not found, bad data, etc). You can get the specific error by calling $AIL_last_error. - + This function executes all the events currently in the queue. This is where all major processing takes place in the event system. - + Once you execute this functions, then sound instances will be in one of three states: - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7082,7 +7082,7 @@ ${ MILESEVENTSOUNDINFO Info; HMSSENUM SoundEnum = MSS_FIRST; - while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) { game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue @@ -7098,13 +7098,13 @@ ${ } } - $AIL_complete_event_queue_processing( ); - $} - - Note that if any event step drastically fails, the rest of the command queue is + $AIL_complete_event_queue_processing( ); + $} + + Note that if any event step drastically fails, the rest of the command queue is skipped, and this function returns 0! For this reason, you shouldn't assume that a start sound event will always result in a completed sound later. - + Therefore, you should allocate memory that you want associated with a sound instance during the enumeration loop, rather than at enqueue time. Otherwise, you need to detect that the sound didn't start and then free the memory (which can be complicated). @@ -7120,7 +7120,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO HSTREAM Stream; void* UserBuffer; S32 UserBufferLen; - S32 Status; + S32 Status; U32 Flags; S32 UsedDelay; F32 UsedVolume; @@ -7130,10 +7130,10 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO } MILESEVENTSOUNDINFO; /* Sound instance data that is associated with each active sound instance. - + $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound - was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from + was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from $AIL_enqueue_event, and EventID represents the completion event. $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). $:Sample The $HSAMPLE for this playing sound. @@ -7148,7 +7148,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted and is only valid for the until the next call in to Miles. $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. - + This structure is returned by the $AIL_enumerate_sound_instances function. It returns information about an active sound instance. */ @@ -7157,7 +7157,7 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7183,14 +7183,14 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will // get 20. $} - + */ DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7265,7 +7265,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, the sound starting. Generally you don't need to do this manually, since the sound designer should do this, however if you need to restart a sound that stopped - for example a stream that went to error - you will have to set the start position via code. - + However, since there can be a delay between the time the sound is first seen in the sound iteration and the time it gets set to the data, start positions set via the low level miles calls can get lost, so use this. @@ -7281,11 +7281,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. - $:info Returns the data for each sound instance. + $:info Returns the data for each sound instance. $:return Returns 0 when enumeration is complete. Enumerates the sound instances. This will generally be used between - calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to + calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to manage the sound instances. The label_query is a list of labels to match, separated by commas. By default, comma-separated @@ -7302,11 +7302,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7315,7 +7315,7 @@ ${ HMSSENUM SoundEnum = MSS_FIRST; MILESEVENTSOUNDINFO Info; - while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) { if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) { @@ -7330,23 +7330,23 @@ $} EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; #define MILESEVENT_SOUND_STATUS_PENDING 0x1 -#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 +#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 #define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). - + These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. */ @@ -7360,13 +7360,13 @@ EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event and couldn't find anything in the loaded banks. $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, or a limit on the sound itself. - $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. + $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. The sound will start when sufficient data has been loaded to hopefully avoid a skip. $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible that the sound playback will catch up to the read position under poor I/O conditions. @@ -7375,7 +7375,7 @@ EXPTYPEEND sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media was removed during load, or the file was not found. - + These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances may have more than one flag, logically 'or'ed together. */ @@ -7383,16 +7383,16 @@ EXPTYPEEND DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); /* Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). - + $:return Returns 0 on failure. - This function must be called as a pair with $AIL_begin_event_queue_processing. - - In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't - started playing yet. Old sound instances that have finished playing are still valid - they - haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances + This function must be called as a pair with $AIL_begin_event_queue_processing. + + In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't + started playing yet. Old sound instances that have finished playing are still valid - they + haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances and frees the completed ones - it's the 2nd half of the event processing. - + Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound instances. */ @@ -7400,7 +7400,7 @@ DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a stop sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7408,7 +7408,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, this function accomplishes that, and is captured by the auditioner for replay. @@ -7417,7 +7417,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a pause sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7425,7 +7425,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, this function accomplishes that, and is captured by the auditioner for replay. @@ -7434,7 +7434,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a resume sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7442,17 +7442,17 @@ DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U6 Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, this function accomplishes that, and is captured by the auditioner for replay. */ -DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, +DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); /* Allows the programmer to manually enqueue a start sound event into the event system. - + $:bank The bank containing the sound to start. $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. @@ -7463,10 +7463,10 @@ DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. $:return Returns a non-zero EnqueueID on success. - Enqueues an event to start the specified sound asset. - + Enqueues an event to start the specified sound asset. + Usually the programmer should trigger an event that the sound designer has specifically - create to start the appropriate sounds, but this function gives the programmer + create to start the appropriate sounds, but this function gives the programmer manual control, if necessary. This function is not captured by the auditioner. */ @@ -7488,7 +7488,7 @@ DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char co Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based on the settings in the event step). - + Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. Note that this replaces those events, it does not supplement. */ @@ -7503,7 +7503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS that this pointer can change frame to frame and should be immediately copied to a client-allocated buffer if persistence is desired. $:return Returns 0 when enumeration is complete. - + This function lets you enumerate all the persisting presets that are currently active in the system. It is mostly a debugging aid. */ @@ -7511,12 +7511,12 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); /* Returns a big string describing the current state of the event system. - - $:return String description of current systems state. + + $:return String description of current systems state. This function is a debugging aid - it can be used to show all of the active allocations, active sounds, etc. - + You must delete the pointer returned from this function with $AIL_mem_free_lock. */ @@ -7535,7 +7535,7 @@ EXPTYPE typedef struct _MILESEVENTSTATE } MILESEVENTSTATE; /* returns the current state of the Miles Event System. - + $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. $:HeapRemaining The number of bytes in HeapSize that is remaining. @@ -7615,7 +7615,7 @@ EXPTYPE typedef struct _MILESBANKFUNCTIONS } MILESBANKFUNCTIONS; /* specifies callbacks for each of the Miles event system. - + $:FreeAll Callback that tells you to free all user-side bank memory. $:GetPreset Callback to retrieve a sound preset. $:GetEnvironment Callback to retrieve an environment preset. @@ -7645,13 +7645,13 @@ DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleC In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). - + */ DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); /* Allows you to override the internal bank file resource management.. - + $:Functions A pointer to a structure containing all the callback functions. This function is used to completely override the high-level resource management system. @@ -7856,7 +7856,7 @@ EXPTYPEEND $:MILES_PLAT_IPHONE Apple iDevices $:MILES_PLAT_LINUX Linux Flavors $:MILES_PLAT_WII Nintendo Wii - $:MILES_PLAT_PSP2 Sony NGP + $:MILES_PLAT_PSP2 Sony NGP Values representing the various platforms the high level tool allows. */ @@ -7891,11 +7891,11 @@ EXPGROUP(Miles High Level Event System) DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); /* Returns an information structure about the current state of the Miles Event System. - + $:system The system to retrieve information for, or zero for the default system. $:state A pointer to a structure to receive the state information. - This function is a debugging aid - it returns information for the event system. + This function is a debugging aid - it returns information for the event system. */ DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); @@ -7923,7 +7923,7 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); // Callback for the error handler. EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); /* - The function prototype to use for a callback that will be made when the event system + The function prototype to use for a callback that will be made when the event system encounters an unrecoverable error. $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. @@ -7937,7 +7937,7 @@ EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_ EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); /* The function definition to use when defining your own random function. - + You can define a function with this prototype and pass it to $AIL_register_random if you want to tie the Miles random calls in with your game's (for logging and such). */ @@ -7953,7 +7953,7 @@ DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_Error can sometimes be somewhat invisible. This function allows you to see what went wrong, when it went wrong. - The basic usage is to have the callback check $AIL_last_error() for the overall category of + The basic usage is to have the callback check $AIL_last_error() for the overall category of failure. The parameter passed to the callback might provide some context, but it can and will be zero on occasion. Generally it will represent the resource string that is being worked on when the error occurred. @@ -8009,7 +8009,7 @@ typedef C8 * (AILCALL *FLT_ERROR)(void); typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, MSS_FREE_TYPE * pfree, - UINTa user, + UINTa user, HDIGDRIVER dig, void * memory); typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); diff --git a/Minecraft.Client/PSVita/Miles/include/rrCore.h b/Minecraft.Client/PSVita/Miles/include/rrCore.h index 17ebee3a..e88b5f8c 100644 --- a/Minecraft.Client/PSVita/Miles/include/rrCore.h +++ b/Minecraft.Client/PSVita/Miles/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp index e739e92c..3d9483d2 100644 --- a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp +++ b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp @@ -44,12 +44,12 @@ void SonyRemoteStorage_Vita::internalCallback(const SceRemoteStorageEvent event, break; case GET_DATA_RESULT: - if(retCode >= 0) + if(retCode >= 0) { app.DebugPrintf("Get Data success \n"); m_status = e_getDataSucceeded; - } - else + } + else { app.DebugPrintf("An error occurred while Get Data was being processed. retCode: 0x%x \n", retCode); m_status = e_error; @@ -66,12 +66,12 @@ void SonyRemoteStorage_Vita::internalCallback(const SceRemoteStorageEvent event, break; case GET_STATUS_RESULT: - if(retCode >= 0) + if(retCode >= 0) { app.DebugPrintf("Get Status success \n"); app.DebugPrintf("Remaining Syncs for this user: %llu\n", outputGetStatus->remainingSyncs); app.DebugPrintf("Number of files on the cloud: %d\n", outputGetStatus->numFiles); - for(int i = 0; i < outputGetStatus->numFiles; i++) + for(int i = 0; i < outputGetStatus->numFiles; i++) { app.DebugPrintf("\n*** File %d information: ***\n", (i + 1)); app.DebugPrintf("File name: %s \n", outputGetStatus->data[i].fileName); @@ -82,8 +82,8 @@ void SonyRemoteStorage_Vita::internalCallback(const SceRemoteStorageEvent event, app.DebugPrintf("Visibility: \"%s\" \n", (outputGetStatus->data[i].visibility == 0)?"Private":((outputGetStatus->data[i].visibility == 1)?"Public read only":"Public read and write")); } m_status = e_getStatusSucceeded; - } - else + } + else { app.DebugPrintf("An error occurred while Get Status was being processed. retCode: 0x%x \n", retCode); m_status = e_error; @@ -98,12 +98,12 @@ void SonyRemoteStorage_Vita::internalCallback(const SceRemoteStorageEvent event, break; case SET_DATA_RESULT: - if(retCode >= 0) + if(retCode >= 0) { app.DebugPrintf("Set Data success \n"); m_status = e_setDataSucceeded; - } - else + } + else { app.DebugPrintf("An error occurred while Set Data was being processed. retCode: 0x%x \n", retCode); m_status = e_error; @@ -175,19 +175,19 @@ bool SonyRemoteStorage_Vita::init(CallbackFunc cb, LPVOID lpParam) // SceNpAuthorizationCode authCode; // memset(&authCode, 0x0, sizeof(authCode)); - + SceNpAuthGetAuthorizationCodeParameter authParams; - memset(&authParams, 0x0, sizeof(authParams)); + memset(&authParams, 0x0, sizeof(authParams)); authParams.size = sizeof(authParams); - authParams.pScope = AUTH_SCOPE; + authParams.pScope = AUTH_SCOPE; memcpy(clientId.id, CLIENT_ID, strlen(CLIENT_ID)); - authParams.pClientId = &clientId; + authParams.pClientId = &clientId; int issuerId = 0; // ret = sceNpAuthGetAuthorizationCode(reqId, &authParams, &authCode, &issuerId); -// if (ret < 0) +// if (ret < 0) // { // app.DebugPrintf("Failed to get auth code 0x%x\n", ret); // sceNpAuthDeleteOAuthRequest(reqId); @@ -195,7 +195,7 @@ bool SonyRemoteStorage_Vita::init(CallbackFunc cb, LPVOID lpParam) // } ret = sceNpAuthDeleteOAuthRequest(reqId); - if (ret < 0) + if (ret < 0) { app.DebugPrintf("Couldn't delete auth request 0x%x\n", ret); return false; @@ -221,11 +221,11 @@ bool SonyRemoteStorage_Vita::init(CallbackFunc cb, LPVOID lpParam) SceRemoteStorageAbortReqParams abortParams; ret = sceRemoteStorageInit(params); - if(ret >= 0) + if(ret >= 0) { abortParams.requestId = ret; app.DebugPrintf("Session will be created \n"); - } + } else if(ret == SCE_REMOTE_STORAGE_ERROR_ALREADY_INITIALISED) { app.DebugPrintf("Session already created \n"); @@ -251,12 +251,12 @@ bool SonyRemoteStorage_Vita::getRemoteFileInfo(SceRemoteStorageStatus* pInfo, Ca reqId = sceRemoteStorageGetStatus(params, outputGetStatus); m_status = e_getStatusInProgress; - if(reqId >= 0) + if(reqId >= 0) { app.DebugPrintf("Get Status request sent \n"); return true; - } - else + } + else { app.DebugPrintf("Error sending Get Status request: 0x%x \n", reqId); return false; @@ -275,11 +275,11 @@ void SonyRemoteStorage_Vita::abort() params.requestId = reqId; int ret = sceRemoteStorageAbort(params); - if(ret >= 0) + if(ret >= 0) { app.DebugPrintf("Abort request done \n"); - } - else + } + else { app.DebugPrintf("Error in Abort request: 0x%x \n", ret); } @@ -317,7 +317,7 @@ bool SonyRemoteStorage_Vita::setDataInternal() char seed[22]; app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); - int64_t iSeed = strtoll(seed,NULL,10); + __int64 iSeed = strtoll(seed,NULL,10); char seedHex[17]; sprintf(seedHex,"%016llx",iSeed); memcpy(descData.m_seed,seedHex,16); // Don't copy null @@ -345,13 +345,13 @@ bool SonyRemoteStorage_Vita::setDataInternal() reqId = sceRemoteStorageSetData(params); app.DebugPrintf("\n*******************************\n"); - if(reqId >= 0) + if(reqId >= 0) { app.DebugPrintf("Set Data request sent \n"); m_bTransferStarted = true; return true; - } - else + } + else { app.DebugPrintf("Error sending Set Data request: 0x%x \n", reqId); return false; @@ -374,13 +374,13 @@ bool SonyRemoteStorage_Vita::getData( const char* remotePath, const char* localP reqId = sceRemoteStorageGetData(params, &s_getDataOutput); app.DebugPrintf("\n*******************************\n"); - if(reqId >= 0) + if(reqId >= 0) { app.DebugPrintf("Get Data request sent \n"); m_bTransferStarted = true; return true; - } - else + } + else { app.DebugPrintf("Error sending Get Data request: 0x%x \n", reqId); return false; diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h index 9e24befa..180ebbbc 100644 --- a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h @@ -26,7 +26,7 @@ DWORD TlsAlloc(VOID); LPVOID TlsGetValue(DWORD dwTlsIndex); BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); -typedef struct _RECT +typedef struct _RECT { LONG left; LONG top; @@ -34,13 +34,13 @@ typedef struct _RECT LONG bottom; } RECT, *PRECT; -typedef struct _TOUCHSCREENRECT +typedef struct _TOUCHSCREENRECT { SceInt16 left; SceInt16 top; SceInt16 right; SceInt16 bottom; -} +} TOUCHSCREENRECT, *PTOUCHSCREENRECT; typedef void ID3D11Device; @@ -58,16 +58,16 @@ typedef int errno_t; // // The following field is used for blocking when there is contention for // // the resource // // -// +// // union { // ULONG_PTR RawEvent[4]; // } Synchronization; -// +// // // // // The following three fields control entering and exiting the critical // // section for the resource // // -// +// // LONG LockCount; // LONG RecursionCount; // HANDLE OwningThread; @@ -261,7 +261,7 @@ typedef struct _MEMORYSTATUS { #define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE #define WAIT_TIMEOUT 258L -#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) +#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) #define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) #define MAXUINT_PTR (~((UINT_PTR)0)) @@ -303,17 +303,17 @@ typedef struct _MEMORYSTATUS { #define GENERIC_EXECUTE (0x20000000L) #define GENERIC_ALL (0x10000000L) -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_ATTRIBUTE_READONLY 0x00000001 -#define FILE_ATTRIBUTE_HIDDEN 0x00000002 -#define FILE_ATTRIBUTE_SYSTEM 0x00000004 -#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 -#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 -#define FILE_ATTRIBUTE_DEVICE 0x00000040 -#define FILE_ATTRIBUTE_NORMAL 0x00000080 -#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 #define FILE_FLAG_WRITE_THROUGH 0x80000000 #define FILE_FLAG_OVERLAPPED 0x40000000 @@ -333,38 +333,38 @@ typedef struct _MEMORYSTATUS { #define OPEN_ALWAYS 4 #define TRUNCATE_EXISTING 5 -#define PAGE_NOACCESS 0x01 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 -#define PAGE_USER_READONLY 0x1000 -#define PAGE_USER_READWRITE 0x2000 -#define MEM_COMMIT 0x1000 -#define MEM_RESERVE 0x2000 -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 -#define MEM_FREE 0x10000 -#define MEM_PRIVATE 0x20000 -#define MEM_RESET 0x80000 -#define MEM_TOP_DOWN 0x100000 -#define MEM_NOZERO 0x800000 -#define MEM_LARGE_PAGES 0x20000000 -#define MEM_HEAP 0x40000000 -#define MEM_16MB_PAGES 0x80000000 +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 +#define PAGE_USER_READONLY 0x1000 +#define PAGE_USER_READWRITE 0x2000 +#define MEM_COMMIT 0x1000 +#define MEM_RESERVE 0x2000 +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 +#define MEM_FREE 0x10000 +#define MEM_PRIVATE 0x20000 +#define MEM_RESET 0x80000 +#define MEM_TOP_DOWN 0x100000 +#define MEM_NOZERO 0x800000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_HEAP 0x40000000 +#define MEM_16MB_PAGES 0x80000000 #define IGNORE 0 // Ignore signal #define INFINITE 0xFFFFFFFF // Infinite timeout #define WAIT_FAILED ((DWORD)0xFFFFFFFF) -#define STATUS_WAIT_0 ((DWORD )0x00000000L) +#define STATUS_WAIT_0 ((DWORD )0x00000000L) #define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) -#define STATUS_PENDING ((DWORD )0x00000103L) +#define STATUS_PENDING ((DWORD )0x00000103L) #define STILL_ACTIVE STATUS_PENDING DWORD GetLastError(VOID); @@ -403,9 +403,9 @@ VOID OutputDebugString(LPCSTR lpOutputString); VOID OutputDebugStringA(LPCSTR lpOutputString); errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix); -errno_t _i64toa_s(int64_t _Val, char * _DstBuf, size_t _Size, int _Radix); +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix); -#define __declspec(a) +#define __declspec(a) extern "C" int _wcsicmp (const wchar_t * dst, const wchar_t * src); size_t wcsnlen(const wchar_t *wcs, size_t maxsize); diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTypes.h b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTypes.h index 36402d53..cc2ddddb 100644 --- a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTypes.h +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTypes.h @@ -34,12 +34,14 @@ typedef unsigned int *PUINT; typedef unsigned char byte; +typedef long long __int64; +typedef unsigned long long __uint64; typedef unsigned int DWORD; typedef int INT; typedef unsigned long ULONG_PTR, *PULONG_PTR; typedef ULONG_PTR SIZE_T, *PSIZE_T; -typedef int64_t LONG64, *PLONG64; +typedef __int64 LONG64, *PLONG64; #define VOID void typedef char CHAR; diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp b/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp index 56eb9654..87c59535 100644 --- a/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp +++ b/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp @@ -56,42 +56,42 @@ void PSVitaInit() int err = sceFiosInitialize(¶ms); assert(err == SCE_FIOS_OK); } -char* getConsoleHomePath() -{ - return contentInfoPath; +char* getConsoleHomePath() +{ + return contentInfoPath; } -char* getUsrDirRoot() -{ - return driveRoot; +char* getUsrDirRoot() +{ + return driveRoot; } -char* getUsrDirPath() -{ - return usrdirPath; +char* getUsrDirPath() +{ + return usrdirPath; } -char* getConsoleHomePathBDPatch() -{ - return contentInfoPathBDPatch; +char* getConsoleHomePathBDPatch() +{ + return contentInfoPathBDPatch; } -char* getUsrDirPathBDPatch() -{ - return usrdirPathBDPatch; +char* getUsrDirPathBDPatch() +{ + return usrdirPathBDPatch; } -char* getDirName() -{ - return dirName; +char* getDirName() +{ + return dirName; } int _wcsicmp( const wchar_t * dst, const wchar_t * src ) { wchar_t f,l; - // validation section + // validation section // _VALIDATE_RETURN(dst != NULL, EINVAL, _NLSCMPERROR); // _VALIDATE_RETURN(src != NULL, EINVAL, _NLSCMPERROR); @@ -117,7 +117,7 @@ size_t wcsnlen(const wchar_t *wcs, size_t maxsize) return n; } -VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) +VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) { SceDateTime dateTime; int err = sceRtcGetCurrentClock(&dateTime, 0); @@ -133,8 +133,8 @@ VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) lpSystemTime->wMilliseconds = sceRtcGetMicrosecond(&dateTime)/1000; } BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { PSVITA_STUBBED; return false; } -BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) -{ +BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) +{ SceUInt64 diffHundredNanos; SceDateTime dateTime; int err = sceRtcGetCurrentClock(&dateTime, 0); @@ -143,11 +143,11 @@ BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) lpFileTime->dwHighDateTime = diffHundredNanos >> 32; lpFileTime->dwLowDateTime = diffHundredNanos & 0xffffffff; - return true; + return true; } -VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) -{ +VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) +{ SceDateTime dateTime; int err = sceRtcGetCurrentClockLocalTime(&dateTime); assert(err == SCE_OK); @@ -163,26 +163,26 @@ VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) } HANDLE CreateEvent(void* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName) { PSVITA_STUBBED; return NULL; } -VOID Sleep(DWORD dwMilliseconds) -{ +VOID Sleep(DWORD dwMilliseconds) +{ C4JThread::Sleep(dwMilliseconds); } BOOL SetThreadPriority(HANDLE hThread, int nPriority) { PSVITA_STUBBED; return FALSE; } DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { PSVITA_STUBBED; return false; } -LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) -{ +LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) +{ return sceAtomicCompareAndSwap32((int32_t*)Destination, (int32_t)Comperand, (int32_t)Exchange); } -LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) -{ +LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) +{ return sceAtomicCompareAndSwap64((int64_t*)Destination, (int64_t)Comperand, (int64_t)Exchange); } -VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) { char name[1] = {0}; @@ -191,7 +191,7 @@ VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) } -VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) +VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) { // no spin count on PSVita InitializeCriticalSection(CriticalSection); @@ -203,16 +203,16 @@ VOID DeleteCriticalSection(PCRITICAL_SECTION CriticalSection) PSVITA_ASSERT_SCE_ERROR(err); } -extern CRITICAL_SECTION g_singleThreadCS; +extern CRITICAL_SECTION g_singleThreadCS; -VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) { int err = sceKernelLockLwMutex ((SceKernelLwMutexWork *)(&CriticalSection->mutex), 1, NULL); PSVITA_ASSERT_SCE_ERROR(err); } -VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) +VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) { int err = sceKernelUnlockLwMutex ((SceKernelLwMutexWork *)(&CriticalSection->mutex), 1); PSVITA_ASSERT_SCE_ERROR(err); @@ -272,8 +272,8 @@ VOID LeaveCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection, bool Write) -BOOL CloseHandle(HANDLE hObject) -{ +BOOL CloseHandle(HANDLE hObject) +{ sceFiosFHCloseSync(NULL,(SceFiosFH)((int32_t)hObject)); return true; } @@ -292,8 +292,8 @@ BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { return PSVitaTLSStorage: static void* VirtualAllocs[1000]; // a list of 1MB allocations static int VirtualNumAllocs = 0; // how many 1MB chunks have been allocated -LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) -{ +LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) +{ if( flAllocationType == MEM_COMMIT ) { // how many pages do we need @@ -318,7 +318,7 @@ LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWO return (void*) VIRTUAL_OFFSET; } -BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) +BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) { while( VirtualNumAllocs ) { @@ -332,7 +332,7 @@ BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) // memset a section of the virtual chunks -VOID VirtualMemset(LPVOID lpDestOffset, int val, SIZE_T dwSize) +VOID VirtualMemset(LPVOID lpDestOffset, int val, SIZE_T dwSize) { int DestOffset = ((int)(lpDestOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset int StartPage = DestOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on @@ -370,7 +370,7 @@ VOID VirtualMemset(LPVOID lpDestOffset, int val, SIZE_T dwSize) // copy a block of memory to the virtual chunks -VOID VirtualCopyTo(LPVOID lpDestOffset, LPVOID lpSrc, SIZE_T dwSize) +VOID VirtualCopyTo(LPVOID lpDestOffset, LPVOID lpSrc, SIZE_T dwSize) { int DestOffset = ((int)(lpDestOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset int StartPage = DestOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on @@ -409,7 +409,7 @@ VOID VirtualCopyTo(LPVOID lpDestOffset, LPVOID lpSrc, SIZE_T dwSize) } // copy a block of memory from the virtual chunks -VOID VirtualCopyFrom(LPVOID lpDest, LPVOID lpSrcOffset, SIZE_T dwSize) +VOID VirtualCopyFrom(LPVOID lpDest, LPVOID lpSrcOffset, SIZE_T dwSize) { int SrcOffset = ((int)(lpSrcOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset int StartPage = SrcOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on @@ -448,7 +448,7 @@ VOID VirtualCopyFrom(LPVOID lpDest, LPVOID lpSrcOffset, SIZE_T dwSize) } // copy a block of memory between the virtual chunks -VOID VirtualMove(LPVOID lpDestOffset, LPVOID lpSrcOffset, SIZE_T dwSize) +VOID VirtualMove(LPVOID lpDestOffset, LPVOID lpSrcOffset, SIZE_T dwSize) { int DestOffset = ((int)(lpDestOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset int DestChunkOffset = DestOffset % VIRTUAL_PAGE_SIZE; // what is the byte offset within the current 1MB page @@ -651,7 +651,7 @@ DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) { SceFiosFH fh = (SceFiosFH)(hFile); - // 4J Stu - sceFiosFHGetSize didn't seem to work...so doing this for now + // 4J Stu - sceFiosFHGetSize didn't seem to work...so doing this for now //SceFiosSize FileSize; //FileSize=sceFiosFHGetSize(fh); SceFiosStat statData; @@ -693,7 +693,7 @@ BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPD return FALSE; } -BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) +BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) { SceFiosFH fh = (SceFiosFH)((int64_t)hFile); // sceFiosFHReadSync - Non-negative values are the number of bytes read, 0 <= result <= length. Negative values are error codes. @@ -742,7 +742,7 @@ void replaceBackslashes(char* szFilename) } } -HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { char filePath[256]; std::string mountedPath = StorageManager.GetMountedPath(lpFileName); @@ -767,7 +767,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, #ifndef _CONTENT_PACKAGE printf("*** Opening %s\n",filePath); #endif - + SceFiosFH fh; int err = sceFiosFHOpenSync(NULL, &fh, filePath, NULL); assert( err == SCE_FIOS_OK ); @@ -775,8 +775,8 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, return (void*)fh; } -BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) -{ +BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) +{ #ifndef _CONTENT_PACKAGE char filePath[256]; sprintf(filePath,"%s/%s",usrdirPath, lpPathName ); @@ -793,12 +793,12 @@ BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttribu BOOL DeleteFileA(LPCSTR lpFileName) { PSVITA_STUBBED; return false; } -// BOOL XCloseHandle(HANDLE a) -// { -// cellFsClose(int(a)); +// BOOL XCloseHandle(HANDLE a) +// { +// cellFsClose(int(a)); // } -DWORD GetFileAttributesA(LPCSTR lpFileName) +DWORD GetFileAttributesA(LPCSTR lpFileName) { char filePath[256]; std::string mountedPath = StorageManager.GetMountedPath(lpFileName); @@ -834,7 +834,7 @@ VOID DebugBreak(VOID) { SCE_BREAK(); } DWORD GetLastError(VOID) { PSVITA_STUBBED; return 0; } -VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) +VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) { PSVITA_STUBBED; /* malloc_managed_size stat; @@ -849,9 +849,9 @@ VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) lpBuffer->dwAvailVirtual = stat.max_system_size - stat.current_inuse_size;*/ } -DWORD GetTickCount() +DWORD GetTickCount() { - // This function returns the current system time at this function is called. + // This function returns the current system time at this function is called. // The system time is represented the time elapsed since the system starts up in microseconds. uint64_t sysTime = sceKernelGetProcessTimeWide(); @@ -860,11 +860,11 @@ DWORD GetTickCount() } // we should really use libperf for this kind of thing, but this will do for now. -BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) -{ +BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) +{ // microseconds - lpFrequency->QuadPart = (1000 * 1000); - return false; + lpFrequency->QuadPart = (1000 * 1000); + return false; } BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { @@ -874,24 +874,24 @@ BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) } #ifndef _FINAL_BUILD -VOID OutputDebugStringW(LPCWSTR lpOutputString) -{ - wprintf(lpOutputString); +VOID OutputDebugStringW(LPCWSTR lpOutputString) +{ + wprintf(lpOutputString); } -VOID OutputDebugString(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugString(LPCSTR lpOutputString) +{ + printf(lpOutputString); } -VOID OutputDebugStringA(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugStringA(LPCSTR lpOutputString) +{ + printf(lpOutputString); } #endif // _CONTENT_PACKAGE BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation) -{ +{ WIN32_FILE_ATTRIBUTE_DATA *fileInfoBuffer = (WIN32_FILE_ATTRIBUTE_DATA*) lpFileInformation; char filePath[256]; @@ -920,32 +920,32 @@ BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId, } HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) -{ - PSVITA_STUBBED; +{ + PSVITA_STUBBED; return 0; } -BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) -{ +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) +{ PSVITA_STUBBED; return false; } errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%d",_Value); else if(_Radix==16) sprintf(_DstBuf,"%lx",_Value); else return -1; return 0; } -errno_t _i64toa_s(int64_t _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } int _wtoi(const wchar_t *_Str) { return wcstol(_Str, NULL, 10); } -DWORD XGetLanguage() -{ +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) + if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) { sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_LANG,&iLang); } @@ -960,7 +960,7 @@ DWORD XGetLanguage() 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 : + case SCE_SYSTEM_PARAM_LANG_SPANISH : if(app.IsAmericanSKU()) { return XC_LANGUAGE_LATINAMERICANSPANISH; @@ -995,8 +995,8 @@ DWORD XGetLanguage() } } -DWORD XGetLocale() -{ +DWORD XGetLocale() +{ SceInt32 iLang; sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_LANG,&iLang); switch(iLang) @@ -1005,7 +1005,7 @@ DWORD XGetLocale() case SCE_SYSTEM_PARAM_LANG_ENGLISH_US : return XC_LOCALE_UNITED_STATES; case SCE_SYSTEM_PARAM_LANG_FRENCH : return XC_LOCALE_FRANCE; - case SCE_SYSTEM_PARAM_LANG_SPANISH : + case SCE_SYSTEM_PARAM_LANG_SPANISH : if(app.IsAmericanSKU()) { return XC_LOCALE_LATIN_AMERICA; @@ -1039,7 +1039,7 @@ DWORD XGetLocale() } } -DWORD XEnableGuestSignin(BOOL fEnable) -{ - return 0; +DWORD XEnableGuestSignin(BOOL fEnable) +{ + return 0; } diff --git a/Minecraft.Client/PSVita/PSVitaExtras/libdivide.h b/Minecraft.Client/PSVita/PSVitaExtras/libdivide.h index 1bbe7067..20103018 100644 --- a/Minecraft.Client/PSVita/PSVitaExtras/libdivide.h +++ b/Minecraft.Client/PSVita/PSVitaExtras/libdivide.h @@ -29,8 +29,8 @@ #if ! LIBDIVIDE_HAS_STDINT_TYPES typedef __int32 int32_t; typedef unsigned __int32 uint32_t; -typedef int64_t int64_t; -typedef uint64_t uint64_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; typedef __int8 int8_t; typedef unsigned __int8 uint8_t; #endif @@ -83,7 +83,7 @@ u32: [0-4] shift value [5] ignored [6] add indicator [7] shift path - + s32: [0-4] shift value [5] shift path [6] add indicator @@ -106,7 +106,7 @@ enum { LIBDIVIDE_U32_SHIFT_PATH = 0x80, LIBDIVIDE_U64_SHIFT_PATH = 0x80, LIBDIVIDE_S32_SHIFT_PATH = 0x20, - LIBDIVIDE_NEGATIVE_DIVISOR = 0x80 + LIBDIVIDE_NEGATIVE_DIVISOR = 0x80 }; @@ -123,7 +123,7 @@ struct libdivide_s32_t { struct libdivide_u64_t { uint64_t magic; uint8_t more; -}; +}; struct libdivide_s64_t { int64_t magic; @@ -146,7 +146,7 @@ LIBDIVIDE_API struct libdivide_s32_t libdivide_s32_gen(int32_t y); LIBDIVIDE_API struct libdivide_u32_t libdivide_u32_gen(uint32_t y); LIBDIVIDE_API struct libdivide_s64_t libdivide_s64_gen(int64_t y); LIBDIVIDE_API struct libdivide_u64_t libdivide_u64_gen(uint64_t y); - + LIBDIVIDE_API int32_t libdivide_s32_do(int32_t numer, const struct libdivide_s32_t *denom); LIBDIVIDE_API uint32_t libdivide_u32_do(uint32_t numer, const struct libdivide_u32_t *denom); LIBDIVIDE_API int64_t libdivide_s64_do(int64_t numer, const struct libdivide_s64_t *denom); @@ -156,19 +156,19 @@ LIBDIVIDE_API int libdivide_u32_get_algorithm(const struct libdivide_u32_t *deno LIBDIVIDE_API uint32_t libdivide_u32_do_alg0(uint32_t numer, const struct libdivide_u32_t *denom); LIBDIVIDE_API uint32_t libdivide_u32_do_alg1(uint32_t numer, const struct libdivide_u32_t *denom); LIBDIVIDE_API uint32_t libdivide_u32_do_alg2(uint32_t numer, const struct libdivide_u32_t *denom); - + LIBDIVIDE_API int libdivide_u64_get_algorithm(const struct libdivide_u64_t *denom); LIBDIVIDE_API uint64_t libdivide_u64_do_alg0(uint64_t numer, const struct libdivide_u64_t *denom); LIBDIVIDE_API uint64_t libdivide_u64_do_alg1(uint64_t numer, const struct libdivide_u64_t *denom); LIBDIVIDE_API uint64_t libdivide_u64_do_alg2(uint64_t numer, const struct libdivide_u64_t *denom); - + LIBDIVIDE_API int libdivide_s32_get_algorithm(const struct libdivide_s32_t *denom); LIBDIVIDE_API int32_t libdivide_s32_do_alg0(int32_t numer, const struct libdivide_s32_t *denom); LIBDIVIDE_API int32_t libdivide_s32_do_alg1(int32_t numer, const struct libdivide_s32_t *denom); LIBDIVIDE_API int32_t libdivide_s32_do_alg2(int32_t numer, const struct libdivide_s32_t *denom); LIBDIVIDE_API int32_t libdivide_s32_do_alg3(int32_t numer, const struct libdivide_s32_t *denom); LIBDIVIDE_API int32_t libdivide_s32_do_alg4(int32_t numer, const struct libdivide_s32_t *denom); - + LIBDIVIDE_API int libdivide_s64_get_algorithm(const struct libdivide_s64_t *denom); LIBDIVIDE_API int64_t libdivide_s64_do_alg0(int64_t numer, const struct libdivide_s64_t *denom); LIBDIVIDE_API int64_t libdivide_s64_do_alg1(int64_t numer, const struct libdivide_s64_t *denom); @@ -202,17 +202,17 @@ LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg2(__m128i numers, const struct LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg3(__m128i numers, const struct libdivide_s64_t * denom); LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg4(__m128i numers, const struct libdivide_s64_t * denom); #endif - - - + + + //////// Internal Utility Functions - + static inline uint32_t libdivide__mullhi_u32(uint32_t x, uint32_t y) { uint64_t xl = x, yl = y; uint64_t rl = xl * yl; return (uint32_t)(rl >> 32); } - + static uint64_t libdivide__mullhi_u64(uint64_t x, uint64_t y) { #if HAS_INT128_T __uint128_t xl = x, yl = y; @@ -227,18 +227,18 @@ static uint64_t libdivide__mullhi_u64(uint64_t x, uint64_t y) { const uint64_t x0y1 = x0 * (uint64_t)y1; const uint64_t x1y0 = x1 * (uint64_t)y0; const uint64_t x1y1 = x1 * (uint64_t)y1; - + uint64_t temp = x1y0 + x0y0_hi; uint64_t temp_lo = temp & mask, temp_hi = temp >> 32; return x1y1 + temp_hi + ((temp_lo + x0y1) >> 32); #endif } - + static inline int64_t libdivide__mullhi_s64(int64_t x, int64_t y) { #if HAS_INT128_T __int128_t xl = x, yl = y; __int128_t rl = xl * yl; - return (int64_t)(rl >> 64); + return (int64_t)(rl >> 64); #else //full 128 bits are x0 * y0 + (x0 * y1 << 32) + (x1 * y0 << 32) + (x1 * y1 << 64) const uint32_t mask = 0xFFFFFFFF; @@ -250,7 +250,7 @@ static inline int64_t libdivide__mullhi_s64(int64_t x, int64_t y) { return x1*(int64_t)y1 + (t >> 32) + (w1 >> 32); #endif } - + #if LIBDIVIDE_USE_SSE2 static inline __m128i libdivide__u64_to_m128(uint64_t x) { @@ -275,7 +275,7 @@ static inline __m128i libdivide_get_FFFFFFFF00000000(void) { __m128i result = _mm_set1_epi8(-1); //optimizes to pcmpeqd on OS X return _mm_slli_epi64(result, 32); } - + static inline __m128i libdivide_get_00000000FFFFFFFF(void) { //returns the same as _mm_set1_epi64(0x00000000FFFFFFFFULL) without touching memory __m128i result = _mm_set1_epi8(-1); //optimizes to pcmpeqd on OS X @@ -288,7 +288,7 @@ static inline __m128i libdivide_get_0000FFFF(void) { __m128i result; //we don't care what its contents are result = _mm_cmpeq_epi8(result, result); //all 1s result = _mm_srli_epi32(result, 16); - return result; + return result; } static inline __m128i libdivide_s64_signbits(__m128i v) { @@ -302,7 +302,7 @@ static inline __m128i libdivide_s64_signbits(__m128i v) { static inline __m128i libdivide_u32_to_m128i(uint32_t amt) { return _mm_set_epi32(0, 0, 0, amt); } - + static inline __m128i libdivide_s64_shift_right_vector(__m128i v, int amt) { //implementation of _mm_sra_epi64. Here we have two 64 bit values which are shifted right to logically become (64 - amt) values, and are then sign extended from a (64 - amt) bit number. const int b = 64 - amt; @@ -320,7 +320,7 @@ static inline __m128i libdivide__mullhi_u32_flat_vector(__m128i a, __m128i b) { return _mm_or_si128(hi_product_0Z2Z, hi_product_Z1Z3); // = hi_product_0123 } - + /* Here, y is assumed to contain one 64 bit value repeated twice. */ static inline __m128i libdivide_mullhi_u64_flat_vector(__m128i x, __m128i y) { //full 128 bits are x0 * y0 + (x0 * y1 << 32) + (x1 * y0 << 32) + (x1 * y1 << 64) @@ -331,12 +331,12 @@ static inline __m128i libdivide_mullhi_u64_flat_vector(__m128i x, __m128i y) { const __m128i x0y1 = _mm_mul_epu32(x0, y1); const __m128i x1y0 = _mm_mul_epu32(x1, y0); const __m128i x1y1 = _mm_mul_epu32(x1, y1); - + const __m128i temp = _mm_add_epi64(x1y0, x0y0_hi); __m128i temp_lo = _mm_and_si128(temp, mask), temp_hi = _mm_srli_epi64(temp, 32); temp_lo = _mm_srli_epi64(_mm_add_epi64(temp_lo, x0y1), 32); temp_hi = _mm_add_epi64(x1y1, temp_hi); - + return _mm_add_epi64(temp_lo, temp_hi); } @@ -349,9 +349,9 @@ static inline __m128i libdivide_mullhi_s64_flat_vector(__m128i x, __m128i y) { p = _mm_sub_epi64(p, t2); return p; } - + #ifdef LIBDIVIDE_USE_SSE4_1 - + /* b is one 32 bit value repeated four times. */ static inline __m128i libdivide_mullhi_s32_flat_vector(__m128i a, __m128i b) { __m128i hi_product_0Z2Z = _mm_srli_epi64(_mm_mul_epi32(a, b), 32); @@ -359,7 +359,7 @@ static inline __m128i libdivide_mullhi_s32_flat_vector(__m128i a, __m128i b) { __m128i hi_product_Z1Z3 = _mm_and_si128(_mm_mul_epi32(a1X3X, b), libdivide_get_FFFFFFFF00000000()); return _mm_or_si128(hi_product_0Z2Z, hi_product_Z1Z3); // = hi_product_0123 } - + #else /* SSE2 does not have a signed multiplication instruction, but we can convert unsigned to signed pretty efficiently. Again, b is just a 32 bit value repeated four times. */ @@ -373,7 +373,7 @@ static inline __m128i libdivide_mullhi_s32_flat_vector(__m128i a, __m128i b) { } #endif #endif - + static inline int32_t libdivide__count_trailing_zeros32(uint32_t val) { #if __GNUC__ || __has_builtin(__builtin_ctz) /* Fast way to count trailing zeros */ @@ -389,7 +389,7 @@ static inline int32_t libdivide__count_trailing_zeros32(uint32_t val) { return result; #endif } - + static inline int32_t libdivide__count_trailing_zeros64(uint64_t val) { #if __LP64__ && (__GNUC__ || __has_builtin(__builtin_ctzll)) /* Fast way to count trailing zeros. Note that we disable this in 32 bit because gcc does something horrible - it calls through to a dynamically bound function. */ @@ -401,11 +401,11 @@ static inline int32_t libdivide__count_trailing_zeros64(uint64_t val) { return 32 + libdivide__count_trailing_zeros32((uint32_t)(val >> 32)); #endif } - + static inline int32_t libdivide__count_leading_zeros32(uint32_t val) { #if __GNUC__ || __has_builtin(__builtin_clzll) /* Fast way to count leading zeros */ - return __builtin_clz(val); + return __builtin_clz(val); #else /* Dorky way to count leading zeros. Note that this hangs for val = 0! */ int32_t result = 0; @@ -413,10 +413,10 @@ static inline int32_t libdivide__count_leading_zeros32(uint32_t val) { val <<= 1; result++; } - return result; + return result; #endif } - + static inline int32_t libdivide__count_leading_zeros64(uint64_t val) { #if __GNUC__ || __has_builtin(__builtin_clzll) /* Fast way to count leading zeros */ @@ -450,7 +450,7 @@ static uint32_t libdivide_64_div_32_to_32(uint32_t u1, uint32_t u0, uint32_t v, return result; } #endif - + #if LIBDIVIDE_IS_X86_64 && LIBDIVIDE_GCC_STYLE_ASM static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r) { //u0 -> rax @@ -465,10 +465,10 @@ static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, } #else - + /* Code taken from Hacker's Delight, http://www.hackersdelight.org/HDcode/divlu.c . License permits inclusion here per http://www.hackersdelight.org/permissions.htm */ -static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r) { +static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r) { const uint64_t b = (1ULL << 32); // Number base (16 bits). uint64_t un1, un0, // Norm. dividend LSD's. vn1, vn0, // Norm. divisor digits. @@ -476,25 +476,25 @@ static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, un64, un21, un10,// Dividend digit pairs. rhat; // A remainder. int s; // Shift amount for norm. - + if (u1 >= v) { // If overflow, set rem. if (r != NULL) // to an impossible value, *r = (uint64_t)(-1); // and return the largest return (uint64_t)(-1);} // possible quotient. - + /* count leading zeros */ s = libdivide__count_leading_zeros64(v); // 0 <= s <= 63. - + v = v << s; // Normalize divisor. vn1 = v >> 32; // Break divisor up into vn0 = v & 0xFFFFFFFF; // two 32-bit digits. - + un64 = (u1 << s) | ((u0 >> (64 - s)) & (-s >> 31)); un10 = u0 << s; // Shift dividend left. - + un1 = un10 >> 32; // Break right half of un0 = un10 & 0xFFFFFFFF; // dividend into two digits. - + q1 = un64/vn1; // Compute the first rhat = un64 - q1*vn1; // quotient digit, q1. again1: @@ -502,9 +502,9 @@ again1: q1 = q1 - 1; rhat = rhat + vn1; if (rhat < b) goto again1;} - + un21 = un64*b + un1 - q1*v; // Multiply and subtract. - + q0 = un21/vn1; // Compute the second rhat = un21 - q0*vn1; // quotient digit, q0. again2: @@ -512,21 +512,21 @@ again2: q0 = q0 - 1; rhat = rhat + vn1; if (rhat < b) goto again2;} - + if (r != NULL) // If remainder is wanted, *r = (un21*b + un0 - q0*v) >> s; // return it. return q1*b + q0; } #endif - + #if LIBDIVIDE_ASSERTIONS_ON #define LIBDIVIDE_ASSERT(x) do { if (! (x)) { fprintf(stderr, "Assertion failure on line %ld: %s\n", (long)__LINE__, #x); exit(-1); } } while (0) #else -#define LIBDIVIDE_ASSERT(x) +#define LIBDIVIDE_ASSERT(x) #endif - + #ifndef LIBDIVIDE_HEADER_ONLY - + ////////// UINT32 struct libdivide_u32_t libdivide_u32_gen(uint32_t d) { @@ -537,14 +537,14 @@ struct libdivide_u32_t libdivide_u32_gen(uint32_t d) { } else { const uint32_t floor_log_2_d = 31 - libdivide__count_leading_zeros32(d); - + uint8_t more; uint32_t rem, proposed_m; proposed_m = libdivide_64_div_32_to_32(1U << floor_log_2_d, 0, d, &rem); LIBDIVIDE_ASSERT(rem > 0 && rem < d); const uint32_t e = d - rem; - + /* This power works if e < 2**floor_log_2_d. */ if (e < (1U << floor_log_2_d)) { /* This power works */ @@ -560,7 +560,7 @@ struct libdivide_u32_t libdivide_u32_gen(uint32_t d) { result.magic = 1 + proposed_m; result.more = more; //result.more's shift should in general be ceil_log_2_d. But if we used the smaller power, we subtract one from the shift because we're using the smaller power. If we're using the larger power, we subtract one from the shift because it's taken care of by the add indicator. So floor_log_2_d happens to be correct in both cases. - + } return result; } @@ -582,23 +582,23 @@ uint32_t libdivide_u32_do(uint32_t numer, const struct libdivide_u32_t *denom) { } } - + int libdivide_u32_get_algorithm(const struct libdivide_u32_t *denom) { uint8_t more = denom->more; if (more & LIBDIVIDE_U32_SHIFT_PATH) return 0; else if (! (more & LIBDIVIDE_ADD_MARKER)) return 1; else return 2; } - + uint32_t libdivide_u32_do_alg0(uint32_t numer, const struct libdivide_u32_t *denom) { return numer >> (denom->more & LIBDIVIDE_32_SHIFT_MASK); } - + uint32_t libdivide_u32_do_alg1(uint32_t numer, const struct libdivide_u32_t *denom) { uint32_t q = libdivide__mullhi_u32(denom->magic, numer); return q >> denom->more; -} - +} + uint32_t libdivide_u32_do_alg2(uint32_t numer, const struct libdivide_u32_t *denom) { // denom->add != 0 uint32_t q = libdivide__mullhi_u32(denom->magic, numer); @@ -608,8 +608,8 @@ uint32_t libdivide_u32_do_alg2(uint32_t numer, const struct libdivide_u32_t *den - -#if LIBDIVIDE_USE_SSE2 + +#if LIBDIVIDE_USE_SSE2 __m128i libdivide_u32_do_vector(__m128i numers, const struct libdivide_u32_t *denom) { uint8_t more = denom->more; if (more & LIBDIVIDE_U32_SHIFT_PATH) { @@ -622,7 +622,7 @@ __m128i libdivide_u32_do_vector(__m128i numers, const struct libdivide_u32_t *de //return t >> denom->shift; __m128i t = _mm_add_epi32(_mm_srli_epi32(_mm_sub_epi32(numers, q), 1), q); return _mm_srl_epi32(t, libdivide_u32_to_m128i(more & LIBDIVIDE_32_SHIFT_MASK)); - + } else { //q >> denom->shift @@ -647,7 +647,7 @@ __m128i libdivide_u32_do_vector_alg2(__m128i numers, const struct libdivide_u32_ } #endif - + /////////// UINT64 struct libdivide_u64_t libdivide_u64_gen(uint64_t d) { @@ -658,14 +658,14 @@ struct libdivide_u64_t libdivide_u64_gen(uint64_t d) { } else { const uint32_t floor_log_2_d = 63 - libdivide__count_leading_zeros64(d); - + uint64_t proposed_m, rem; uint8_t more; proposed_m = libdivide_128_div_64_to_64(1ULL << floor_log_2_d, 0, d, &rem); //== (1 << (64 + floor_log_2_d)) / d LIBDIVIDE_ASSERT(rem > 0 && rem < d); const uint64_t e = d - rem; - + /* This power works if e < 2**floor_log_2_d. */ if (e < (1ULL << floor_log_2_d)) { /* This power works */ @@ -702,30 +702,30 @@ uint64_t libdivide_u64_do(uint64_t numer, const struct libdivide_u64_t *denom) { } } - + int libdivide_u64_get_algorithm(const struct libdivide_u64_t *denom) { uint8_t more = denom->more; if (more & LIBDIVIDE_U64_SHIFT_PATH) return 0; else if (! (more & LIBDIVIDE_ADD_MARKER)) return 1; else return 2; } - + uint64_t libdivide_u64_do_alg0(uint64_t numer, const struct libdivide_u64_t *denom) { - return numer >> (denom->more & LIBDIVIDE_64_SHIFT_MASK); + return numer >> (denom->more & LIBDIVIDE_64_SHIFT_MASK); } - + uint64_t libdivide_u64_do_alg1(uint64_t numer, const struct libdivide_u64_t *denom) { uint64_t q = libdivide__mullhi_u64(denom->magic, numer); return q >> denom->more; } - + uint64_t libdivide_u64_do_alg2(uint64_t numer, const struct libdivide_u64_t *denom) { uint64_t q = libdivide__mullhi_u64(denom->magic, numer); uint64_t t = ((numer - q) >> 1) + q; return t >> (denom->more & LIBDIVIDE_64_SHIFT_MASK); } - -#if LIBDIVIDE_USE_SSE2 + +#if LIBDIVIDE_USE_SSE2 __m128i libdivide_u64_do_vector(__m128i numers, const struct libdivide_u64_t * denom) { uint8_t more = denom->more; if (more & LIBDIVIDE_U64_SHIFT_PATH) { @@ -761,11 +761,11 @@ __m128i libdivide_u64_do_vector_alg2(__m128i numers, const struct libdivide_u64_ return _mm_srl_epi64(t, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_64_SHIFT_MASK)); } - + #endif - + /////////// SINT32 - + static inline int32_t libdivide__mullhi_s32(int32_t x, int32_t y) { int64_t xl = x, yl = y; @@ -775,7 +775,7 @@ static inline int32_t libdivide__mullhi_s32(int32_t x, int32_t y) { struct libdivide_s32_t libdivide_s32_gen(int32_t d) { struct libdivide_s32_t result; - + /* If d is a power of 2, or negative a power of 2, we have to use a shift. This is especially important because the magic algorithm fails for -1. To check if d is a power of 2 or its inverse, it suffices to check whether its absolute value has exactly one bit set. This works even for INT_MIN, because abs(INT_MIN) == INT_MIN, and INT_MIN has one bit set and is a power of 2. */ uint32_t absD = (uint32_t)(d < 0 ? -d : d); //gcc optimizes this to the fast abs trick if ((absD & (absD - 1)) == 0) { //check if exactly one bit is set, don't care if absD is 0 since that's divide by zero @@ -784,14 +784,14 @@ struct libdivide_s32_t libdivide_s32_gen(int32_t d) { } else { const uint32_t floor_log_2_d = 31 - libdivide__count_leading_zeros32(absD); - LIBDIVIDE_ASSERT(floor_log_2_d >= 1); - + LIBDIVIDE_ASSERT(floor_log_2_d >= 1); + uint8_t more; //the dividend here is 2**(floor_log_2_d + 31), so the low 32 bit word is 0 and the high word is floor_log_2_d - 1 uint32_t rem, proposed_m; proposed_m = libdivide_64_div_32_to_32(1U << (floor_log_2_d - 1), 0, absD, &rem); const uint32_t e = absD - rem; - + /* We are going to start with a power of floor_log_2_d - 1. This works if works if e < 2**floor_log_2_d. */ if (e < (1U << floor_log_2_d)) { /* This power works */ @@ -807,7 +807,7 @@ struct libdivide_s32_t libdivide_s32_gen(int32_t d) { proposed_m += 1; result.magic = (d < 0 ? -(int32_t)proposed_m : (int32_t)proposed_m); result.more = more; - + } return result; } @@ -832,57 +832,57 @@ int32_t libdivide_s32_do(int32_t numer, const struct libdivide_s32_t *denom) { q += (q < 0); return q; } -} - +} + int libdivide_s32_get_algorithm(const struct libdivide_s32_t *denom) { uint8_t more = denom->more; int positiveDivisor = ! (more & LIBDIVIDE_NEGATIVE_DIVISOR); if (more & LIBDIVIDE_S32_SHIFT_PATH) return (positiveDivisor ? 0 : 1); - else if (more & LIBDIVIDE_ADD_MARKER) return (positiveDivisor ? 2 : 3); + else if (more & LIBDIVIDE_ADD_MARKER) return (positiveDivisor ? 2 : 3); else return 4; } - + int32_t libdivide_s32_do_alg0(int32_t numer, const struct libdivide_s32_t *denom) { uint8_t shifter = denom->more & LIBDIVIDE_32_SHIFT_MASK; int32_t q = numer + ((numer >> 31) & ((1 << shifter) - 1)); return q >> shifter; } - + int32_t libdivide_s32_do_alg1(int32_t numer, const struct libdivide_s32_t *denom) { uint8_t shifter = denom->more & LIBDIVIDE_32_SHIFT_MASK; int32_t q = numer + ((numer >> 31) & ((1 << shifter) - 1)); return - (q >> shifter); } - + int32_t libdivide_s32_do_alg2(int32_t numer, const struct libdivide_s32_t *denom) { int32_t q = libdivide__mullhi_s32(denom->magic, numer); q += numer; q >>= denom->more & LIBDIVIDE_32_SHIFT_MASK; - q += (q < 0); + q += (q < 0); return q; } - + int32_t libdivide_s32_do_alg3(int32_t numer, const struct libdivide_s32_t *denom) { int32_t q = libdivide__mullhi_s32(denom->magic, numer); q -= numer; q >>= denom->more & LIBDIVIDE_32_SHIFT_MASK; - q += (q < 0); + q += (q < 0); return q; } - + int32_t libdivide_s32_do_alg4(int32_t numer, const struct libdivide_s32_t *denom) { int32_t q = libdivide__mullhi_s32(denom->magic, numer); q >>= denom->more & LIBDIVIDE_32_SHIFT_MASK; - q += (q < 0); + q += (q < 0); return q; } -#if LIBDIVIDE_USE_SSE2 +#if LIBDIVIDE_USE_SSE2 __m128i libdivide_s32_do_vector(__m128i numers, const struct libdivide_s32_t * denom) { uint8_t more = denom->more; if (more & LIBDIVIDE_S32_SHIFT_PATH) { uint32_t shifter = more & LIBDIVIDE_32_SHIFT_MASK; - __m128i roundToZeroTweak = _mm_set1_epi32((1 << shifter) - 1); //could use _mm_srli_epi32 with an all -1 register + __m128i roundToZeroTweak = _mm_set1_epi32((1 << shifter) - 1); //could use _mm_srli_epi32 with an all -1 register __m128i q = _mm_add_epi32(numers, _mm_and_si128(_mm_srai_epi32(numers, 31), roundToZeroTweak)); //q = numer + ((numer >> 31) & roundToZeroTweak); q = _mm_sra_epi32(q, libdivide_u32_to_m128i(shifter)); // q = q >> shifter __m128i shiftMask = _mm_set1_epi32((int32_t)((int8_t)more >> 7)); //set all bits of shift mask = to the sign bit of more @@ -893,7 +893,7 @@ __m128i libdivide_s32_do_vector(__m128i numers, const struct libdivide_s32_t * d __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); if (more & LIBDIVIDE_ADD_MARKER) { __m128i sign = _mm_set1_epi32((int32_t)(int8_t)more >> 7); //must be arithmetic shift - q = _mm_add_epi32(q, _mm_sub_epi32(_mm_xor_si128(numers, sign), sign)); // q += ((numer ^ sign) - sign); + q = _mm_add_epi32(q, _mm_sub_epi32(_mm_xor_si128(numers, sign), sign)); // q += ((numer ^ sign) - sign); } q = _mm_sra_epi32(q, libdivide_u32_to_m128i(more & LIBDIVIDE_32_SHIFT_MASK)); //q >>= shift q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); // q += (q < 0) @@ -919,7 +919,7 @@ __m128i libdivide_s32_do_vector_alg2(__m128i numers, const struct libdivide_s32_ __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); q = _mm_add_epi32(q, numers); q = _mm_sra_epi32(q, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_32_SHIFT_MASK)); - q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); + q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); return q; } @@ -927,7 +927,7 @@ __m128i libdivide_s32_do_vector_alg3(__m128i numers, const struct libdivide_s32_ __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); q = _mm_sub_epi32(q, numers); q = _mm_sra_epi32(q, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_32_SHIFT_MASK)); - q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); + q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); return q; } @@ -935,16 +935,16 @@ __m128i libdivide_s32_do_vector_alg4(__m128i numers, const struct libdivide_s32_ __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); q = _mm_sra_epi32(q, libdivide_u32_to_m128i(denom->more)); //q >>= shift q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); // q += (q < 0) - return q; + return q; } #endif - + ///////////// SINT64 - + struct libdivide_s64_t libdivide_s64_gen(int64_t d) { struct libdivide_s64_t result; - + /* If d is a power of 2, or negative a power of 2, we have to use a shift. This is especially important because the magic algorithm fails for -1. To check if d is a power of 2 or its inverse, it suffices to check whether its absolute value has exactly one bit set. This works even for INT_MIN, because abs(INT_MIN) == INT_MIN, and INT_MIN has one bit set and is a power of 2. */ const uint64_t absD = (uint64_t)(d < 0 ? -d : d); //gcc optimizes this to the fast abs trick if ((absD & (absD - 1)) == 0) { //check if exactly one bit is set, don't care if absD is 0 since that's divide by zero @@ -952,14 +952,14 @@ struct libdivide_s64_t libdivide_s64_gen(int64_t d) { result.magic = 0; } else { - const uint32_t floor_log_2_d = 63 - libdivide__count_leading_zeros64(absD); - + const uint32_t floor_log_2_d = 63 - libdivide__count_leading_zeros64(absD); + //the dividend here is 2**(floor_log_2_d + 63), so the low 64 bit word is 0 and the high word is floor_log_2_d - 1 uint8_t more; uint64_t rem, proposed_m; proposed_m = libdivide_128_div_64_to_64(1ULL << (floor_log_2_d - 1), 0, absD, &rem); const uint64_t e = absD - rem; - + /* We are going to start with a power of floor_log_2_d - 1. This works if works if e < 2**floor_log_2_d. */ if (e < (1ULL << floor_log_2_d)) { /* This power works */ @@ -1000,9 +1000,9 @@ int64_t libdivide_s64_do(int64_t numer, const struct libdivide_s64_t *denom) { q += (q < 0); return q; } -} - - +} + + int libdivide_s64_get_algorithm(const struct libdivide_s64_t *denom) { uint8_t more = denom->more; int positiveDivisor = ! (more & LIBDIVIDE_NEGATIVE_DIVISOR); @@ -1010,20 +1010,20 @@ int libdivide_s64_get_algorithm(const struct libdivide_s64_t *denom) { else if (more & LIBDIVIDE_ADD_MARKER) return (positiveDivisor ? 2 : 3); else return 4; } - + int64_t libdivide_s64_do_alg0(int64_t numer, const struct libdivide_s64_t *denom) { uint32_t shifter = denom->more & LIBDIVIDE_64_SHIFT_MASK; int64_t q = numer + ((numer >> 63) & ((1LL << shifter) - 1)); - return q >> shifter; + return q >> shifter; } - + int64_t libdivide_s64_do_alg1(int64_t numer, const struct libdivide_s64_t *denom) { //denom->shifter != -1 && demo->shiftMask != 0 uint32_t shifter = denom->more & LIBDIVIDE_64_SHIFT_MASK; int64_t q = numer + ((numer >> 63) & ((1LL << shifter) - 1)); return - (q >> shifter); } - + int64_t libdivide_s64_do_alg2(int64_t numer, const struct libdivide_s64_t *denom) { int64_t q = libdivide__mullhi_s64(denom->magic, numer); q += numer; @@ -1031,20 +1031,20 @@ int64_t libdivide_s64_do_alg2(int64_t numer, const struct libdivide_s64_t *denom q += (q < 0); return q; } - + int64_t libdivide_s64_do_alg3(int64_t numer, const struct libdivide_s64_t *denom) { int64_t q = libdivide__mullhi_s64(denom->magic, numer); q -= numer; q >>= denom->more & LIBDIVIDE_64_SHIFT_MASK; - q += (q < 0); + q += (q < 0); return q; } - + int64_t libdivide_s64_do_alg4(int64_t numer, const struct libdivide_s64_t *denom) { int64_t q = libdivide__mullhi_s64(denom->magic, numer); q >>= denom->more; q += (q < 0); - return q; + return q; } @@ -1065,7 +1065,7 @@ __m128i libdivide_s64_do_vector(__m128i numers, const struct libdivide_s64_t * d __m128i q = libdivide_mullhi_s64_flat_vector(numers, libdivide__u64_to_m128(magic)); if (more & LIBDIVIDE_ADD_MARKER) { __m128i sign = _mm_set1_epi32((int32_t)((int8_t)more >> 7)); //must be arithmetic shift - q = _mm_add_epi64(q, _mm_sub_epi64(_mm_xor_si128(numers, sign), sign)); // q += ((numer ^ sign) - sign); + q = _mm_add_epi64(q, _mm_sub_epi64(_mm_xor_si128(numers, sign), sign)); // q += ((numer ^ sign) - sign); } q = libdivide_s64_shift_right_vector(q, more & LIBDIVIDE_64_SHIFT_MASK); //q >>= denom->mult_path.shift q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); // q += (q < 0) @@ -1102,20 +1102,20 @@ __m128i libdivide_s64_do_vector_alg3(__m128i numers, const struct libdivide_s64_ q = _mm_sub_epi64(q, numers); q = libdivide_s64_shift_right_vector(q, denom->more & LIBDIVIDE_64_SHIFT_MASK); q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); // q += (q < 0) - return q; + return q; } __m128i libdivide_s64_do_vector_alg4(__m128i numers, const struct libdivide_s64_t *denom) { __m128i q = libdivide_mullhi_s64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); q = libdivide_s64_shift_right_vector(q, denom->more); q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); - return q; + return q; } #endif - + /////////// C++ stuff - + #ifdef __cplusplus /* The C++ template design here is a total mess. This needs to be fixed by someone better at templates than I. The current design is: @@ -1131,7 +1131,7 @@ __m128i libdivide_s64_do_vector_alg4(__m128i numers, const struct libdivide_s64_ */ namespace libdivide_internal { - + #if LIBDIVIDE_USE_SSE2 #define MAYBE_VECTOR(x) x #define MAYBE_VECTOR_PARAM __m128i vector_func(__m128i, const DenomType *) @@ -1149,12 +1149,12 @@ namespace libdivide_internal { #endif template - class divider_base { + class divider_base { public: DenomType denom; divider_base(IntType d) : denom(gen_func(d)) { } divider_base(const DenomType & d) : denom(d) { } - + IntType perform_divide(IntType val) const { return do_func(val, &denom); } #if LIBDIVIDE_USE_SSE2 __m128i perform_divide_vector(__m128i val) const { return vector_func(val, &denom); } @@ -1162,37 +1162,37 @@ namespace libdivide_internal { int get_algorithm() const { return get_algo(&denom); } }; - - + + template struct divider_mid { }; - + template<> struct divider_mid { typedef uint32_t IntType; typedef struct libdivide_u32_t DenomType; template struct denom { typedef divider_base divider; }; - + template struct algo { }; template struct algo<-1, J> { typedef denom::divider divider; }; template struct algo<0, J> { typedef denom::divider divider; }; template struct algo<1, J> { typedef denom::divider divider; }; template struct algo<2, J> { typedef denom::divider divider; }; - - /* Define two more bogus ones so that the same (templated, presumably) code can handle both signed and unsigned */ + + /* Define two more bogus ones so that the same (templated, presumably) code can handle both signed and unsigned */ template struct algo<3, J> { typedef denom::divider divider; }; template struct algo<4, J> { typedef denom::divider divider; }; }; - + template<> struct divider_mid { typedef int32_t IntType; typedef struct libdivide_s32_t DenomType; template struct denom { typedef divider_base divider; }; - - + + template struct algo { }; template struct algo<-1, J> { typedef denom::divider divider; }; template struct algo<0, J> { typedef denom::divider divider; }; @@ -1200,36 +1200,36 @@ namespace libdivide_internal { template struct algo<2, J> { typedef denom::divider divider; }; template struct algo<3, J> { typedef denom::divider divider; }; template struct algo<4, J> { typedef denom::divider divider; }; - + }; - + template<> struct divider_mid { typedef uint64_t IntType; typedef struct libdivide_u64_t DenomType; template struct denom { typedef divider_base divider; }; - + template struct algo { }; template struct algo<-1, J> { typedef denom::divider divider; }; template struct algo<0, J> { typedef denom::divider divider; }; template struct algo<1, J> { typedef denom::divider divider; }; template struct algo<2, J> { typedef denom::divider divider; }; - + /* Define two more bogus ones so that the same (templated, presumably) code can handle both signed and unsigned */ template struct algo<3, J> { typedef denom::divider divider; }; template struct algo<4, J> { typedef denom::divider divider; }; }; - + template<> struct divider_mid { typedef int64_t IntType; typedef struct libdivide_s64_t DenomType; template struct denom { typedef divider_base divider; }; - + template struct algo { }; template struct algo<-1, J> { typedef denom::divider divider; }; template struct algo<0, J> { typedef denom::divider divider; }; @@ -1248,29 +1248,29 @@ class divider typename libdivide_internal::divider_mid::template algo::divider sub; template friend divider unswitch(const divider & d); divider(const typename libdivide_internal::divider_mid::DenomType & denom) : sub(denom) { } - + public: - + /* Ordinary constructor, that takes the divisor as a parameter. */ divider(T n) : sub(n) { } - + /* Default constructor, that divides by 1 */ divider() : sub(1) { } - + /* Divides the parameter by the divisor, returning the quotient */ T perform_divide(T val) const { return sub.perform_divide(val); } - + #if LIBDIVIDE_USE_SSE2 /* Treats the vector as either two or four packed values (depending on the size), and divides each of them by the divisor, returning the packed quotients. */ - __m128i perform_divide_vector(__m128i val) const { return sub.perform_divide_vector(val); } + __m128i perform_divide_vector(__m128i val) const { return sub.perform_divide_vector(val); } #endif /* Returns the index of algorithm, for use in the unswitch function */ int get_algorithm() const { return sub.get_algorithm(); } // returns the algorithm for unswitching - + /* operator== */ bool operator==(const divider & him) const { return sub.denom.magic == him.sub.denom.magic && sub.denom.more == him.sub.denom.more; } - + bool operator!=(const divider & him) const { return ! (*this == him); } }; @@ -1291,10 +1291,10 @@ __m128i operator/(__m128i numer, const divider & denom) { return denom.perform_divide_vector(numer); } #endif - - + + #endif //__cplusplus - + #endif //LIBDIVIDE_HEADER_ONLY #ifdef __cplusplus } //close namespace libdivide diff --git a/Minecraft.Client/PSVita/PSVitaExtras/zconf.h b/Minecraft.Client/PSVita/PSVitaExtras/zconf.h index 981886db..48405ca0 100644 --- a/Minecraft.Client/PSVita/PSVitaExtras/zconf.h +++ b/Minecraft.Client/PSVita/PSVitaExtras/zconf.h @@ -485,7 +485,7 @@ typedef uLong FAR uLongf; # define z_off64_t off64_t #else # if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t int64_t +# define z_off64_t __int64 # else # define z_off64_t z_off_t # endif diff --git a/Minecraft.Client/PSVita/PSVita_App.cpp b/Minecraft.Client/PSVita/PSVita_App.cpp index 6cba116d..a21699c0 100644 --- a/Minecraft.Client/PSVita/PSVita_App.cpp +++ b/Minecraft.Client/PSVita/PSVita_App.cpp @@ -307,7 +307,7 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() wstring wWorldName = L"TestWorld"; bool isFlat = false; - int64_t seedValue = 0;//BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + __int64 seedValue = 0;//BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements NetworkGameInitData *param = new NetworkGameInitData(); param->seed = seedValue; @@ -320,7 +320,7 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() app.SetGameHostOption(eGameHostOption_Gamertags,1); app.SetGameHostOption(eGameHostOption_BedrockFog,1); - app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId()); + app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId()); app.SetGameHostOption(eGameHostOption_LevelType, 0 ); app.SetGameHostOption(eGameHostOption_Structures, 1 ); app.SetGameHostOption(eGameHostOption_BonusChest, 0 ); @@ -391,7 +391,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_GetProductList: - { + { m_eCommerce_State=eCommerce_State_GetProductList_Pending; SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); std::list::iterator iter = pCategories->subCategories.begin(); @@ -407,7 +407,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_AddProductInfoDetailed: - { + { m_eCommerce_State=eCommerce_State_AddProductInfoDetailed_Pending; // for each of the products in the categories, get the detailed info. We really only need the long description and price info. @@ -444,7 +444,7 @@ void CConsoleMinecraftApp::CommerceTick() break; case eCommerce_State_RegisterDLC: - { + { m_eCommerce_State=eCommerce_State_Online; // register the DLC info SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); @@ -531,20 +531,20 @@ SonyCommerce::CategoryInfo *CConsoleMinecraftApp::GetCategoryInfo() return &m_CategoryInfo; } -#endif +#endif void CConsoleMinecraftApp::ClearCommerceDetails() { #ifdef VITA_COMMERCE_ENABLED for(int i=0;i* pProductList=&m_ProductListA[i]; + std::vector* pProductList=&m_ProductListA[i]; pProductList->clear(); } if(m_ProductListA!=NULL) { - delete [] m_ProductListA; + delete [] m_ProductListA; m_ProductListA=NULL; } @@ -580,11 +580,11 @@ void CConsoleMinecraftApp::GetDLCSkuIDFromProductList(char * pchDLCProductID, ch { SonyCommerce::ProductInfo Info=*it; if(strcmp(pchDLCProductID,Info.productId)==0) - { + { memcpy(pchSkuID,Info.skuId,SCE_NP_COMMERCE2_SKU_ID_LEN); return; } - } + } } } return; @@ -607,18 +607,18 @@ void CConsoleMinecraftApp::Checkout(char *pchSkuID) { SonyCommerce::ProductInfo Info=*it; if(strcmp(pchSkuID,Info.skuId)==0) - { + { productInfo = &(*it); break; } - } + } } } if(productInfo) { if(m_eCommerce_State==eCommerce_State_Online) - { + { strcpy(m_pchSkuID,productInfo->skuId); m_pCheckoutProductInfo = productInfo; m_eCommerce_State=eCommerce_State_Checkout; @@ -633,7 +633,7 @@ void CConsoleMinecraftApp::Checkout(char *pchSkuID) void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) { if(m_eCommerce_State==eCommerce_State_Online) - { + { strcpy(m_pchSkuID,pchSkuID); m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased; } @@ -642,7 +642,7 @@ void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) bool CConsoleMinecraftApp::UpgradeTrial() { if(m_eCommerce_State==eCommerce_State_Online) - { + { m_eCommerce_State=eCommerce_State_UpgradeTrial; return true; } @@ -687,7 +687,7 @@ bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) { SonyCommerce::ProductInfo Info=*it; if(strcmp(pchTitle,Info.skuId)==0) - { + { if(Info.purchasabilityFlag==SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED) { return false; @@ -697,7 +697,7 @@ bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) return true; } } - } + } } } #endif //#ifdef VITA_COMMERCE_ENABLED @@ -734,7 +734,7 @@ void CConsoleMinecraftApp::CommerceGetCategoriesCallback(LPVOID lpParam,int err) if(err==0) { pClass->m_ProductListCategoriesC=pClass->m_CategoryInfo.countOfSubCategories; - // allocate the memory for the product info for each categories + // allocate the memory for the product info for each categories if(pClass->m_CategoryInfo.countOfSubCategories>0) { pClass->m_ProductListA = (std::vector *) new std::vector [pClass->m_CategoryInfo.countOfSubCategories]; @@ -768,7 +768,7 @@ void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err { // we're done, so now retrieve the additional product details for each product pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; - pClass->m_bCommerceProductListRetrieved=true; + pClass->m_bCommerceProductListRetrieved=true; } else { @@ -778,21 +778,21 @@ void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err else { pClass->m_eCommerce_State=eCommerce_State_Error; - pClass->m_bCommerceProductListRetrieved=true; + pClass->m_bCommerceProductListRetrieved=true; } } // void CConsoleMinecraftApp::CommerceGetDetailedProductInfoCallback(LPVOID lpParam,int err) // { // CConsoleMinecraftApp *pScene=(CConsoleMinecraftApp *)lpParam; -// +// // if(err==0) // { // pScene->m_eCommerce_State=eCommerce_State_Idle; -// //pScene->m_bCommerceProductListRetrieved=true; +// //pScene->m_bCommerceProductListRetrieved=true; // } // //printf("Callback hit, error 0x%08x\n", err); -// +// // } void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam,int err) @@ -812,7 +812,7 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam { // MGH - change this to a while loop so we can skip empty categories. do - { + { pClass->m_iCurrentCategory++; }while(pClass->m_ProductListA[pClass->m_iCurrentCategory].size() == 0 && pClass->m_iCurrentCategorym_ProductListCategoriesC); @@ -821,12 +821,12 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam { // there are no more categories, so we're done pClass->m_eCommerce_State=eCommerce_State_RegisterDLC; - pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_bProductListAdditionalDetailsRetrieved=true; } else { // continue with the next category - pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; + pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; } } else @@ -838,7 +838,7 @@ void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam else { pClass->m_eCommerce_State=eCommerce_State_Error; - pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_bProductListAdditionalDetailsRetrieved=true; pClass->m_iCurrentProduct=0; pClass->m_iCurrentCategory=0; } @@ -1109,7 +1109,7 @@ void printSaveState() case C4JStorage::ESaveGame_SaveCache: strState = "ESaveGame_SaveCache"; break; case C4JStorage::ESaveGame_ReconstructCache: strState = "ESaveGame_ReconstructCache"; break; } - + app.DebugPrintf("[printSaveState] GetSaveState == %s.\n", strState.c_str()); #endif } @@ -1156,7 +1156,7 @@ void CConsoleMinecraftApp::SaveDataTick() { app.DebugPrintf("[SaveDataTick] eSaveDataDeleteState_abort.\n"); StorageManager.CancelIncompleteOperation(); - } + } else if (m_bSaveDataDeleteDialogState == eSaveDataDeleteState_continue) { app.DebugPrintf("[SaveDataTick] eSaveDataDeleteState_continue.\n"); @@ -1228,7 +1228,7 @@ void CConsoleMinecraftApp::Callback_SaveGameIncomplete(void *pParam, C4JStorage: int CConsoleMinecraftApp::NoSaveSpaceReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { int blocksRequired = (int)pParam; if(blocksRequired > 0) @@ -1256,7 +1256,7 @@ int CConsoleMinecraftApp::cbConfirmDeleteMessageBox(void *pParam, int iPad, cons if (pClass != NULL && pClass->m_pSaveToDelete != NULL) { - if (result == C4JStorage::EMessage_ResultDecline) + if (result == C4JStorage::EMessage_ResultDecline) { pClass->m_bSaveDataDeleteDialogState = eSaveDataDeleteState_deleting; C4JStorage::ESaveGameState eDeleteStatus = StorageManager.DeleteSaveData(pClass->m_pSaveToDelete, cbSaveDataDeleted, pClass); @@ -1290,7 +1290,7 @@ void CConsoleMinecraftApp::initSaveIncompleteDialog(int spaceNeeded) param.sysMsgParam->sysMsgType = SCE_SAVEDATA_DIALOG_SYSMSG_TYPE_NOSPACE_CONTINUABLE; param.sysMsgParam->value = (SceInt32) spaceNeeded; - + SceInt32 ret = sceSaveDataDialogInit(¶m); if (ret == SCE_OK) { @@ -1376,13 +1376,13 @@ void CConsoleMinecraftApp::initSaveDataDeleteDialog() // Start getting saves data to use when deleting. if (StorageManager.ReturnSavesInfo() == NULL) { - C4JStorage::ESaveGameState eSGIStatus - = StorageManager.GetSavesInfo( + C4JStorage::ESaveGameState eSGIStatus + = StorageManager.GetSavesInfo( ProfileManager.GetPrimaryPad(), - NULL, - this, + NULL, + this, "save" - ); + ); } // Dim background because sony doesn't do that. @@ -1414,7 +1414,7 @@ void CConsoleMinecraftApp::updateSaveDataDeleteDialog() { SceSaveDataDialogResult dialogResult; ZeroMemory(&dialogResult, sizeof(SceSaveDataDialogResult)); - + SceInt32 ret = sceSaveDataDialogGetResult(&dialogResult); if (ret == SCE_OK) { @@ -1438,7 +1438,7 @@ void CConsoleMinecraftApp::updateSaveDataDeleteDialog() { SceAppUtilSaveDataSlotParam slotParam; ret = sceAppUtilSaveDataSlotGetParam( dialogResult.slotId, &slotParam, NULL ); - + if (ret == SCE_OK) { int saveindex = -1; @@ -1469,12 +1469,12 @@ void CConsoleMinecraftApp::updateSaveDataDeleteDialog() { app.DebugPrintf("[SaveDataDeleteDialog] ERROR: PERFORMING DELETE OPERATION, pSavesDetails is null.\n"); } - + if (pSaveInfo != NULL) { app.DebugPrintf( "[SaveDataDeleteDialog] User wishes to delete slot_%d:\n\t" - "4jsaveindex=%d, filename='%s', title='%s', subtitle='%s', size=%dKiB.\n", + "4jsaveindex=%d, filename='%s', title='%s', subtitle='%s', size=%dKiB.\n", dialogResult.slotId, saveindex, pSaveInfo->UTF8SaveFilename, @@ -1490,7 +1490,7 @@ void CConsoleMinecraftApp::updateSaveDataDeleteDialog() }; ui.RequestMessageBox( - IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, + IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, 0, &cbConfirmDeleteMessageBox, this, @@ -1498,7 +1498,7 @@ void CConsoleMinecraftApp::updateSaveDataDeleteDialog() ); m_bSaveDataDeleteDialogState = eSaveDataDeleteState_userConfirmation; - + m_pSaveToDelete = pSaveInfo; } else @@ -1571,7 +1571,7 @@ void CConsoleMinecraftApp::getSaveDataDeleteDialogParam(SceSaveDataDialogParam * { SceAppUtilSaveDataSlotParam slotParam; int ret = sceAppUtilSaveDataSlotGetParam( i, &slotParam, NULL ); - + if (ret == SCE_OK) { SceAppUtilSaveDataSlot slot; @@ -1584,7 +1584,7 @@ void CConsoleMinecraftApp::getSaveDataDeleteDialogParam(SceSaveDataDialogParam * slots.push_back( slot ); } } - + SceAppUtilSaveDataSlot *pSavesList = new SceAppUtilSaveDataSlot[slots.size()]; int slotIndex = 0; @@ -1618,7 +1618,7 @@ void CConsoleMinecraftApp::getSaveDataDeleteDialogParam(SceSaveDataDialogParam * listParam.listTitle = (const SceChar8 *) strPtr; listParam.itemStyle = SCE_SAVEDATA_DIALOG_LIST_ITEM_STYLE_TITLE_SUBTITLE_DATE; - + baseParam->mode = SCE_SAVEDATA_DIALOG_MODE_LIST; baseParam->dispType = SCE_SAVEDATA_DIALOG_TYPE_DELETE; baseParam->listParam = &listParam; @@ -1659,10 +1659,10 @@ int CConsoleMinecraftApp::cbSaveDataDeleted( void *pParam, const bool success ) void CConsoleMinecraftApp::finishedDeletingSaves(bool bContinue) { app.DebugPrintf( "[finishedDeletingSaves] %s.\n", (bContinue?"Continuing":"Aborting") ); - + StorageManager.SetSaveDisabled(false); LeaveSaveNotificationSection(); - + StorageManager.ClearSaveError(); StorageManager.ClearOptionsSaveError(); diff --git a/Minecraft.Client/PlayerChunkMap.cpp b/Minecraft.Client/PlayerChunkMap.cpp index 1c7516cf..aedd5a9d 100644 --- a/Minecraft.Client/PlayerChunkMap.cpp +++ b/Minecraft.Client/PlayerChunkMap.cpp @@ -54,7 +54,7 @@ void PlayerChunkMap::PlayerChunk::add(shared_ptr player, bool send //app.DebugPrintf("--- Adding player to chunk x=%d\tz=%d\n",x, z); if (find(players.begin(),players.end(),player) != players.end()) { - // 4J-PB - At the start of the game, lots of chunks are added, and we can then move into an area that is outside the diameter of our starting area, + // 4J-PB - At the start of the game, lots of chunks are added, and we can then move into an area that is outside the diameter of our starting area, // but is inside the area loaded at the start. app.DebugPrintf("--- Adding player to chunk x=%d\t z=%d, but they are already in there!\n",pos.x, pos.z); return; @@ -69,7 +69,7 @@ void PlayerChunkMap::PlayerChunk::add(shared_ptr player, bool send if( sendPacket ) player->connection->send( shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, true) ) ); players.push_back(player); - + player->chunksToSend.push_back(pos); #ifdef _LARGE_WORLDS @@ -93,7 +93,7 @@ void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) players.erase(it); if (players.size() == 0) { - int64_t id = (pos.x + 0x7fffffffLL) | ((pos.z + 0x7fffffffLL) << 32); + __int64 id = (pos.x + 0x7fffffffLL) | ((pos.z + 0x7fffffffLL) << 32); AUTO_VAR(it, parent->chunks.find(id)); if( it != parent->chunks.end() ) { @@ -116,7 +116,7 @@ void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) { INetworkPlayer *thisNetPlayer = player->connection->getNetworkPlayer(); bool noOtherPlayersFound = true; - + if( thisNetPlayer != NULL ) { for( AUTO_VAR(it, players.begin()); it < players.end(); ++it ) @@ -203,7 +203,7 @@ void PlayerChunkMap::PlayerChunk::broadcast(shared_ptr packet) } else { - for(unsigned int j = 0; j < sentTo.size(); j++ ) + for(unsigned int j = 0; j < sentTo.size(); j++ ) { shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); @@ -265,7 +265,7 @@ void PlayerChunkMap::PlayerChunk::broadcast(shared_ptr packet) } else { - for(unsigned int j = 0; j < sentTo.size(); j++ ) + for(unsigned int j = 0; j < sentTo.size(); j++ ) { shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); @@ -327,7 +327,7 @@ bool PlayerChunkMap::PlayerChunk::broadcastChanges(bool allowRegionUpdate) // Fix for buf #95007 : TCR #001 BAS Game Stability: TU12: Code: Compliance: More than 192 dropped items causes game to freeze or crash. // Block region update packets can only encode ys in a range of 1 - 256 - if( ys > 256 ) ys = 256; + if( ys > 256 ) ys = 256; 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); @@ -433,13 +433,13 @@ void PlayerChunkMap::tick() bool PlayerChunkMap::hasChunk(int x, int z) { - int64_t id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); return chunks.find(id) != chunks.end(); } PlayerChunkMap::PlayerChunk *PlayerChunkMap::getChunk(int x, int z, bool create) { - int64_t id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); AUTO_VAR(it, chunks.find(id)); PlayerChunk *chunk = NULL; @@ -460,7 +460,7 @@ PlayerChunkMap::PlayerChunk *PlayerChunkMap::getChunk(int x, int z, bool create) // queue a request for it to be created. void PlayerChunkMap::getChunkAndAddPlayer(int x, int z, shared_ptr player) { - int64_t id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); AUTO_VAR(it, chunks.find(id)); if( it != chunks.end() ) @@ -487,7 +487,7 @@ void PlayerChunkMap::getChunkAndRemovePlayer(int x, int z, shared_ptr player) int px = (int)player->x; int pz = (int)player->z; int minDistSq = -1; - + AUTO_VAR(itNearest, addRequests.end()); for( AUTO_VAR(it, addRequests.begin()); it != addRequests.end(); it++ ) { @@ -721,7 +721,7 @@ void PlayerChunkMap::move(shared_ptr player) for (int x = xc - radius; x <= xc + radius; x++) for (int z = zc - radius; z <= zc + radius; z++) - { + { if (!chunkInRange(x, z, last_xc, last_zc)) { // 4J - changed from separate getChunk & add so we can wrap these operations up and queue @@ -783,7 +783,7 @@ void PlayerChunkMap::setRadius(int newRadius) for (int x = xc - newRadius; x <= xc + newRadius; x++) for (int z = zc - newRadius; z <= zc + newRadius; z++) - { + { // check if this chunk is outside the old radius area if ( x < xc - radius || x > xc + radius || z < zc - radius || z > zc + radius ) { diff --git a/Minecraft.Client/PlayerChunkMap.h b/Minecraft.Client/PlayerChunkMap.h index 08cda2a7..61324272 100644 --- a/Minecraft.Client/PlayerChunkMap.h +++ b/Minecraft.Client/PlayerChunkMap.h @@ -66,7 +66,7 @@ public: vector > players; void flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFound); // 4J added private: - unordered_map chunks; // 4J - was LongHashMap + unordered_map<__int64,PlayerChunk *,LongKeyHash,LongKeyEq> chunks; // 4J - was LongHashMap vector changedChunks; vector addRequests; // 4J added void tickAddRequests(shared_ptr player); // 4J added diff --git a/Minecraft.Client/PlayerConnection.h b/Minecraft.Client/PlayerConnection.h index d7b56a83..0d4ce2f6 100644 --- a/Minecraft.Client/PlayerConnection.h +++ b/Minecraft.Client/PlayerConnection.h @@ -30,9 +30,9 @@ private: bool didTick; int lastKeepAliveId; - int64_t lastKeepAliveTime; + __int64 lastKeepAliveTime; static Random random; - int64_t lastKeepAliveTick; + __int64 lastKeepAliveTick; int chatSpamTickCount; int dropSpamTickCount; @@ -81,7 +81,7 @@ private: public: // 4J Stu - Handlers only valid in debug mode -#ifndef _CONTENT_PACKAGE +#ifndef _CONTENT_PACKAGE virtual void handleContainerSetSlot(shared_ptr packet); #endif virtual void handleContainerClick(shared_ptr packet); @@ -89,13 +89,13 @@ public: 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 handleKeepAlive(shared_ptr packet); virtual void handlePlayerInfo(shared_ptr packet); // 4J Added virtual bool isServerPacketListener(); virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); virtual void handleCustomPayload(shared_ptr customPayloadPacket); - // 4J Added + // 4J Added virtual void handleCraftItem(shared_ptr packet); virtual void handleTradeItem(shared_ptr packet); virtual void handleDebugOptions(shared_ptr packet); diff --git a/Minecraft.Client/ProgressRenderer.cpp b/Minecraft.Client/ProgressRenderer.cpp index 575a4510..a7c3fd30 100644 --- a/Minecraft.Client/ProgressRenderer.cpp +++ b/Minecraft.Client/ProgressRenderer.cpp @@ -24,7 +24,7 @@ void ProgressRenderer::progressStart(int title) void ProgressRenderer::progressStartNoAbort(int string) { - noAbort = true; + noAbort = true; _progressStart(string); } @@ -36,7 +36,7 @@ void ProgressRenderer::_progressStart(int title) if (noAbort) return; // throw new StopGameException(); // 4J - removed } - + EnterCriticalSection( &ProgressRenderer::s_progress ); lastPercent = 0; this->title = title; @@ -88,7 +88,7 @@ void ProgressRenderer::progressStagePercentage(int i) } - int64_t now = System::currentTimeMillis(); + __int64 now = System::currentTimeMillis(); if (now - lastTime < 20) return; lastTime = now; diff --git a/Minecraft.Client/ProgressRenderer.h b/Minecraft.Client/ProgressRenderer.h index a66c73fb..29c847d0 100644 --- a/Minecraft.Client/ProgressRenderer.h +++ b/Minecraft.Client/ProgressRenderer.h @@ -25,7 +25,7 @@ private: int status; Minecraft *minecraft; int title; - int64_t lastTime; + __int64 lastTime; bool noAbort; wstring m_wstrText; eProgressStringType m_eType; diff --git a/Minecraft.Client/ScrolledSelectionList.h b/Minecraft.Client/ScrolledSelectionList.h index 0fc38e50..77ec1fd8 100644 --- a/Minecraft.Client/ScrolledSelectionList.h +++ b/Minecraft.Client/ScrolledSelectionList.h @@ -28,7 +28,7 @@ private: float yo; int lastSelection; - int64_t lastSelectionTime ; + __int64 lastSelectionTime ; bool renderSelection; bool _renderHeader; @@ -40,7 +40,7 @@ public: protected: void setRenderHeader(bool renderHeader, int headerHeight); - virtual int getNumberOfItems() = 0; + virtual int getNumberOfItems() = 0; virtual void selectItem(int item, bool doubleClick) = 0; virtual bool isSelectedItem(int item) = 0; virtual int getMaxPosition(); diff --git a/Minecraft.Client/SelectWorldScreen.cpp b/Minecraft.Client/SelectWorldScreen.cpp index 068d9b6c..a07eb7b2 100644 --- a/Minecraft.Client/SelectWorldScreen.cpp +++ b/Minecraft.Client/SelectWorldScreen.cpp @@ -246,7 +246,7 @@ void SelectWorldScreen::WorldSelectionList::selectItem(int item, bool doubleClic parent->deleteButton->active = active; parent->renameButton->active = active; - if (doubleClick && active) + if (doubleClick && active) { parent->worldSelected(item); } @@ -294,7 +294,7 @@ void SelectWorldScreen::WorldSelectionList::renderItem(int i, int x, int y, int swprintf(buffer,20,L"%d/%d/%d %d:%02d",time.wDay, time.wMonth, time.wYear, time.wHour, time.wMinute); // 4J - TODO Localise this id = id + L" (" + buffer; - int64_t size = levelSummary->getSizeOnDisk(); + __int64 size = levelSummary->getSizeOnDisk(); id = id + L", " + _toString(size / 1024 * 100 / 1024 / 100.0f) + L" MB)"; wstring info; diff --git a/Minecraft.Client/ServerLevel.cpp b/Minecraft.Client/ServerLevel.cpp index 05566ad8..de8c66cd 100644 --- a/Minecraft.Client/ServerLevel.cpp +++ b/Minecraft.Client/ServerLevel.cpp @@ -93,8 +93,8 @@ void ServerLevel::staticCtor() 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); + InitializeCriticalSection(&m_limiterCS); + InitializeCriticalSection(&m_tickNextTickCS); InitializeCriticalSection(&m_csQueueSendTileUpdates); m_fallingTileCount = 0; m_primedTntCount = 0; @@ -192,7 +192,7 @@ void ServerLevel::tick() if (!somebodyWokeUp) { // skip time until new day - int64_t newTime = levelData->getTime() + TICKS_PER_DAY; + __int64 newTime = levelData->getTime() + TICKS_PER_DAY; // 4J : WESTY : Changed so that time update goes through stats tracking update code. //levelData->setTime(newTime - (newTime % TICKS_PER_DAY)); @@ -222,7 +222,7 @@ void ServerLevel::tick() } } } - + PIXBeginNamedEvent(0,"runTileEvents"); // run after entity updates runTileEvents(); @@ -230,7 +230,7 @@ void ServerLevel::tick() //4J - temporarily disabling saves as they are causing gameplay to generally stutter quite a lot - int64_t time = levelData->getTime() + 1; + __int64 time = levelData->getTime() + 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)) @@ -492,7 +492,7 @@ void ServerLevel::tickTiles() { Biome *b = getBiome(x + xo, z + zo); if (b->hasRain()) - { + { int tile = getTile(x + xo, yy - 1, z + zo); if (tile != 0) { @@ -593,7 +593,7 @@ 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++) { @@ -783,7 +783,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)); @@ -861,7 +861,7 @@ void ServerLevel::save(bool force, ProgressListener *progressListener, bool bAut if(StorageManager.GetSaveDisabled()) return; - if (progressListener != NULL) + if (progressListener != NULL) { if(bAutosave) { @@ -871,7 +871,7 @@ void ServerLevel::save(bool force, ProgressListener *progressListener, bool bAut { progressListener->progressStartNoAbort(IDS_PROGRESS_SAVING_LEVEL); } - + } PIXBeginNamedEvent(0,"Saving level data"); saveLevelData(); @@ -931,7 +931,7 @@ void ServerLevel::saveToDisc(ProgressListener *progressListener, bool autosave) DLCPack * pDLCPack=pDLCTexPack->getDLCInfoParentPack(); if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) - { + { return; } } @@ -1032,7 +1032,7 @@ shared_ptr ServerLevel::explode(shared_ptr source, double x, } else { - for(unsigned int j = 0; j < sentTo.size(); j++ ) + for(unsigned int j = 0; j < sentTo.size(); j++ ) { shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); @@ -1139,9 +1139,9 @@ EntityTracker *ServerLevel::getTracker() return tracker; } -void ServerLevel::setTimeAndAdjustTileTicks(int64_t newTime) +void ServerLevel::setTimeAndAdjustTileTicks(__int64 newTime) { - int64_t delta = newTime - levelData->getTime(); + __int64 delta = newTime - levelData->getTime(); // 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; @@ -1303,7 +1303,7 @@ 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 ) { EnterCriticalSection(&m_limiterCS); @@ -1316,7 +1316,7 @@ 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 ) { EnterCriticalSection(&m_limiterCS); @@ -1329,7 +1329,7 @@ void ServerLevel::entityRemovedExtra(shared_ptr e) } // printf("entity removed: arrow entity count now %d\n",m_arrowEntities.size()); LeaveCriticalSection(&m_limiterCS); - } + } else if( dynamic_pointer_cast(e) != NULL ) { EnterCriticalSection(&m_limiterCS); @@ -1342,7 +1342,7 @@ void ServerLevel::entityRemovedExtra(shared_ptr e) } // printf("entity removed: experience orb entity count now %d\n",m_arrowEntities.size()); LeaveCriticalSection(&m_limiterCS); - } + } else if( dynamic_pointer_cast(e) != NULL ) { EnterCriticalSection(&m_limiterCS); diff --git a/Minecraft.Client/ServerLevel.h b/Minecraft.Client/ServerLevel.h index ae413d11..644c15c0 100644 --- a/Minecraft.Client/ServerLevel.h +++ b/Minecraft.Client/ServerLevel.h @@ -114,7 +114,7 @@ protected: public: MinecraftServer *getServer(); EntityTracker *getTracker(); - void setTimeAndAdjustTileTicks(int64_t newTime); + void setTimeAndAdjustTileTicks(__int64 newTime); PlayerChunkMap *getChunkMap(); void queueSendTileUpdate(int x, int y, int z); // 4J Added @@ -142,7 +142,7 @@ public: 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/ServerPlayer.cpp b/Minecraft.Client/ServerPlayer.cpp index eebab435..489e6f34 100644 --- a/Minecraft.Client/ServerPlayer.cpp +++ b/Minecraft.Client/ServerPlayer.cpp @@ -142,7 +142,7 @@ void ServerPlayer::flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFou unsigned int j = index % 32; unsigned int uiMask = 0x80000000 >> j; - flags[i] |= uiMask; + flags[i] |= uiMask; } } } @@ -345,14 +345,14 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) 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); - - if( dontDelayChunks || + + if( dontDelayChunks || (canSendOnSlowQueue && (connection->countDelayedPackets() < 4 )&& #ifdef _XBOX_ONE @@ -361,7 +361,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) (g_NetworkManager.GetHostPlayer()->GetSendQueueSizeBytes( NULL, true ) < 8192 )&& #else (g_NetworkManager.GetHostPlayer()->GetSendQueueSizeMessages( NULL, true ) < 4 )&& -#endif +#endif //(tickCount - lastBrupSendTickCount) > (connection->getNetworkPlayer()->GetCurrentRtt()>>4) && !connection->done) ) { @@ -369,9 +369,9 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) okToSend = true; MinecraftServer::s_slowQueuePacketSent = true; -// static unordered_map mapLastTime; -// int64_t thisTime = System::currentTimeMillis(); -// int64_t lastTime = mapLastTime[connection->getNetworkPlayer()->GetUID().toString()]; +// static unordered_map mapLastTime; +// __int64 thisTime = System::currentTimeMillis(); +// __int64 lastTime = mapLastTime[connection->getNetworkPlayer()->GetUID().toString()]; // app.DebugPrintf(" - OK to send (%d ms since last)\n", thisTime - lastTime); // mapLastTime[connection->getNetworkPlayer()->GetUID().toString()] = thisTime; } @@ -445,7 +445,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) for (unsigned int i = 0; i < tes->size(); i++) { // 4J Stu - Added delay param to ensure that these arrive after the BRUPs from above - // 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”. broadcast(tes->at(i), !connection->isLocal() && !dontDelayChunks); } delete tes; @@ -462,7 +462,7 @@ void ServerPlayer::doTickB(bool ignorePortal) if(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<dimension->id == 0 ) - { + { ignorePortal=false; isInsidePortal=true; portalTime=1; @@ -473,7 +473,7 @@ void ServerPlayer::doTickB(bool ignorePortal) // else if (app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<dimension->id == 0 ) -// { +// { // server->players->toggleDimension( dynamic_pointer_cast( shared_from_this() ), 1 ); // } // unsigned int uiVal=app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad()); @@ -482,7 +482,7 @@ void ServerPlayer::doTickB(bool ignorePortal) else if (app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<dimension->id != 0 ) - { + { ignorePortal=false; isInsidePortal=true; portalTime=1; @@ -577,7 +577,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) // 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()) ) { return false; @@ -595,7 +595,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) bool returnVal = Player::hurt(dmgSource, dmg); if( returnVal ) - { + { // 4J Stu - Work out the source of this damage for telemetry m_lastDamageSource = eTelemetryChallenges_Unknown; @@ -667,7 +667,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) m_lastDamageSource = eTelemetryPlayerDeathSource_Ghast; break; }; - } + } }; } @@ -707,7 +707,7 @@ void ServerPlayer::changeDimension(int i) INetworkPlayer *checkPlayer = servPlayer->connection->getNetworkPlayer(); if(thisPlayer != checkPlayer && checkPlayer != NULL && thisPlayer->IsSameSystem( checkPlayer ) && !servPlayer->wonGame ) { - servPlayer->wonGame = true; + servPlayer->wonGame = true; servPlayer->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::WIN_GAME, thisPlayer->GetUserIndex() ) ) ); app.DebugPrintf("Sending packet to %d\n", thisPlayer->GetUserIndex()); } @@ -759,7 +759,7 @@ void ServerPlayer::take(shared_ptr e, int orgCount) 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) ) ); @@ -841,7 +841,7 @@ 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; } @@ -858,7 +858,7 @@ bool ServerPlayer::startEnchanting(int x, int y, int z) else { app.DebugPrintf("ServerPlayer tried to open enchanting container when one was already open\n"); - } + } return true; } @@ -876,7 +876,7 @@ bool ServerPlayer::startRepairing(int x, int y, int z) else { app.DebugPrintf("ServerPlayer tried to open enchanting container when one was already open\n"); - } + } return true; } @@ -932,7 +932,7 @@ bool ServerPlayer::openTrap(shared_ptr trap) { app.DebugPrintf("ServerPlayer tried to open dispenser when one was already open\n"); } - + return true; } @@ -1234,7 +1234,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxEnemies))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxEnemies))); } } break; @@ -1245,7 +1245,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxVillagers))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxVillagers))); } } break; @@ -1255,7 +1255,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredPigsSheepCows))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredPigsSheepCows))); } } break; @@ -1265,7 +1265,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredChickens))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredChickens))); } } break; @@ -1275,7 +1275,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredMooshrooms))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredMooshrooms))); } } break; @@ -1286,7 +1286,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredWolves))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredWolves))); } } break; @@ -1297,7 +1297,7 @@ void ServerPlayer::displayClientMessage(int messageId) shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantShearMooshroom))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantShearMooshroom))); } } break; @@ -1321,7 +1321,7 @@ void ServerPlayer::displayClientMessage(int messageId) { player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantSpawnInPeaceful))); } - } + } break; case IDS_MAX_BOATS: @@ -1332,7 +1332,7 @@ void ServerPlayer::displayClientMessage(int messageId) { player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBoats))); } - } + } break; default: @@ -1391,7 +1391,7 @@ void ServerPlayer::onEffectRemoved(MobEffectInstance *effect) connection->send(shared_ptr( new RemoveMobEffectPacket(entityId, effect) ) ); } -void ServerPlayer::teleportTo(double x, double y, double z) +void ServerPlayer::teleportTo(double x, double y, double z) { connection->teleport(x, y, z, yRot, xRot); } @@ -1508,7 +1508,7 @@ void ServerPlayer::handleCollectItem(shared_ptr item) } #ifndef _CONTENT_PACKAGE -void ServerPlayer::debug_setPosition(double x, double y, double z, double nYRot, double nXRot) +void ServerPlayer::debug_setPosition(double x, double y, double z, double nYRot, double nXRot) { connection->teleport(x, y, z, nYRot, nXRot); } diff --git a/Minecraft.Client/StringTable.cpp b/Minecraft.Client/StringTable.cpp index 9920a8f2..b0c46a7b 100644 --- a/Minecraft.Client/StringTable.cpp +++ b/Minecraft.Client/StringTable.cpp @@ -30,12 +30,12 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) app.getLocale(locales); bool foundLang = false; - int64_t bytesToSkip = 0; + __int64 bytesToSkip = 0; int dataSize = 0; // for( AUTO_VAR(it_locales, locales.begin()); - it_locales!=locales.end() && (!foundLang); + it_locales!=locales.end() && (!foundLang); it_locales++ ) { @@ -72,8 +72,8 @@ 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 + + isStatic = false; // 4J-JEV: Versions 1 and up could use if (langVersion > 0) // integers rather than wstrings as keys. isStatic = dis2.readBoolean(); @@ -109,7 +109,7 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) isStatic = false; } - + // We can't delete this data in the dtor, so clear the reference bais.reset(); } diff --git a/Minecraft.Client/TileRenderer.cpp b/Minecraft.Client/TileRenderer.cpp index 3962cc71..3b8d4c4e 100644 --- a/Minecraft.Client/TileRenderer.cpp +++ b/Minecraft.Client/TileRenderer.cpp @@ -3582,9 +3582,9 @@ bool TileRenderer::tesselateCrossInWorld( Tile* tt, int x, int y, int z ) if (tt == Tile::tallgrass) { - int64_t seed = (x * 3129871) ^ (z * 116129781l) ^ (y); + __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; @@ -3821,7 +3821,7 @@ bool TileRenderer::tesselateLilypadInWorld(Tile *tt, int x, int y, int z) float u1 = tex->getU1(true); float v1 = tex->getV1(true); - int64_t seed = (x * 3129871) ^ (z * 116129781l) ^ (y); + __int64 seed = (x * 3129871) ^ (z * 116129781l) ^ (y); seed = seed * seed * 42317861 + seed * 11; int dir = (int) ((seed >> 16) & 0x3); @@ -7155,7 +7155,7 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl data = Facing::UP; } - tile->updateDefaultShape(); + tile->updateDefaultShape(); setShape(tile); glRotatef(90, 0, 1, 0); diff --git a/Minecraft.Client/Timer.cpp b/Minecraft.Client/Timer.cpp index 5cd4714a..b451c034 100644 --- a/Minecraft.Client/Timer.cpp +++ b/Minecraft.Client/Timer.cpp @@ -20,9 +20,9 @@ Timer::Timer(float ticksPerSecond) void Timer::advanceTime() { - int64_t nowMs = System::currentTimeMillis(); - int64_t passedMs = nowMs - lastMs; - int64_t msSysTime = System::nanoTime() / 1000000; + __int64 nowMs = System::currentTimeMillis(); + __int64 passedMs = nowMs - lastMs; + __int64 msSysTime = System::nanoTime() / 1000000; double now = msSysTime / 1000.0; @@ -39,7 +39,7 @@ void Timer::advanceTime() accumMs += passedMs; if (accumMs > 1000) { - int64_t passedMsSysTime = msSysTime - lastMsSysTime; + __int64 passedMsSysTime = msSysTime - lastMsSysTime; double adjustTimeT = accumMs / (double) passedMsSysTime; adjustTime += (adjustTimeT - adjustTime) * 0.2f; @@ -88,9 +88,9 @@ void Timer::advanceTimeQuickly() void Timer::skipTime() { - int64_t nowMs = System::currentTimeMillis(); - int64_t passedMs = nowMs - lastMs; - int64_t msSysTime = System::nanoTime() / 1000000; + __int64 nowMs = System::currentTimeMillis(); + __int64 passedMs = nowMs - lastMs; + __int64 msSysTime = System::nanoTime() / 1000000; double now = msSysTime / 1000.0; @@ -107,7 +107,7 @@ void Timer::skipTime() accumMs += passedMs; if (accumMs > 1000) { - int64_t passedMsSysTime = msSysTime - lastMsSysTime; + __int64 passedMsSysTime = msSysTime - lastMsSysTime; double adjustTimeT = accumMs / (double) passedMsSysTime; adjustTime += (adjustTimeT - adjustTime) * 0.2f; diff --git a/Minecraft.Client/Timer.h b/Minecraft.Client/Timer.h index 8bea39d4..f9737eb0 100644 --- a/Minecraft.Client/Timer.h +++ b/Minecraft.Client/Timer.h @@ -17,9 +17,9 @@ public: float passedTime; private: - int64_t lastMs; - int64_t lastMsSysTime; - int64_t accumMs; + __int64 lastMs; + __int64 lastMsSysTime; + __int64 accumMs; double adjustTime; diff --git a/Minecraft.Client/Windows64/4JLibs/inc/4J_Storage.h b/Minecraft.Client/Windows64/4JLibs/inc/4J_Storage.h index 45bfb31a..896f730a 100644 --- a/Minecraft.Client/Windows64/4JLibs/inc/4J_Storage.h +++ b/Minecraft.Client/Windows64/4JLibs/inc/4J_Storage.h @@ -15,7 +15,7 @@ typedef struct } CONTAINER_METADATA; -typedef struct +typedef struct { char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; char UTF8SaveTitle[MAX_DISPLAYNAME_LENGTH]; @@ -24,7 +24,7 @@ typedef struct } SAVE_INFO,*PSAVE_INFO; -typedef struct +typedef struct { int iSaveC; PSAVE_INFO SaveInfoA; @@ -43,7 +43,7 @@ class C4JStorage public: // Structs defined in the DLC_Creator, but added here to be used in the app - typedef struct + typedef struct { unsigned int uiFileSize; DWORD dwType; @@ -61,7 +61,7 @@ public: DLC_FILE_PARAM, *PDLC_FILE_PARAM; // End of DLC_Creator structs - typedef struct + typedef struct { WCHAR wchDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH]; @@ -71,7 +71,7 @@ public: CACHEINFOSTRUCT; // structure to hold DLC info in TMS - typedef struct + typedef struct { DWORD dwVersion; DWORD dwNewOffers; @@ -111,7 +111,7 @@ public: enum ESaveGameControlState { ESaveGameControl_Idle=0, - ESaveGameControl_Save, + ESaveGameControl_Save, ESaveGameControl_InternalRequestingDevice, ESaveGameControl_InternalGetSaveName, ESaveGameControl_InternalSaving, @@ -122,16 +122,16 @@ public: enum ESaveGameState { ESaveGame_Idle=0, - ESaveGame_Save, + ESaveGame_Save, ESaveGame_InternalRequestingDevice, ESaveGame_InternalGetSaveName, ESaveGame_InternalSaving, ESaveGame_CopySave, ESaveGame_CopyingSave, - ESaveGame_Load, - ESaveGame_GetSavesInfo, - ESaveGame_Rename, - ESaveGame_Delete, + ESaveGame_Load, + ESaveGame_GetSavesInfo, + ESaveGame_Rename, + ESaveGame_Delete, ESaveGame_GetSaveThumbnail // Not used as an actual state in the PS4, but the game expects this to be returned to indicate success when getting a thumbnail @@ -210,7 +210,7 @@ public: }; - typedef struct + typedef struct { CHAR szFilename[256]; int iFileSize; @@ -218,14 +218,14 @@ public: } TMSPP_FILE_DETAILS, *PTMSPP_FILE_DETAILS; - typedef struct + typedef struct { int iCount; PTMSPP_FILE_DETAILS FileDetailsA; } TMSPP_FILE_LIST, *PTMSPP_FILE_LIST; - typedef struct + typedef struct { DWORD dwSize; PBYTE pbData; @@ -264,7 +264,7 @@ public: void SetSaveImages( PBYTE pbThumbnail,DWORD dwThumbnailBytes,PBYTE pbImage,DWORD dwImageBytes, PBYTE pbTextData ,DWORD dwTextDataBytes); // Sets the thumbnail & image for the save, optionally setting the metadata in the png C4JStorage::ESaveGameState SaveSaveData(int( *Func)(LPVOID ,const bool),LPVOID lpParam); void CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam); - void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected); + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected); bool GetSaveDeviceSelected(unsigned int iPad); C4JStorage::ESaveGameState DoesSaveExist(bool *pbExists); bool EnoughSpaceForAMinSaveGame(); @@ -286,12 +286,12 @@ public: // DLC void RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam ); void SetDLCPackageRoot(char *pszDLCRoot); - C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmask=XMARKETPLACE_OFFERING_TYPE_CONTENT); + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmask=XMARKETPLACE_OFFERING_TYPE_CONTENT); DWORD CancelGetDLCOffers(); void ClearDLCOffers(); XMARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw); int GetOfferCount(); - DWORD InstallOffer(int iOfferIDC, uint64_t *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false); + DWORD InstallOffer(int iOfferIDC, __uint64 *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false); DWORD GetAvailableDLCCount( int iPad); C4JStorage::EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); @@ -335,7 +335,7 @@ public: unsigned int CRC(unsigned char *buf, int len); // #ifdef _DEBUG -// void SetSaveName(int i); +// void SetSaveName(int i); // #endif // string table for all the Storage problems. Loaded by the application C4JStringTable *m_pStringTable; diff --git a/Minecraft.Client/Windows64/Iggy/include/rrCore.h b/Minecraft.Client/Windows64/Iggy/include/rrCore.h index fbdaa3c5..e88b5f8c 100644 --- a/Minecraft.Client/Windows64/Iggy/include/rrCore.h +++ b/Minecraft.Client/Windows64/Iggy/include/rrCore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/Windows64/Miles/include/mss.h b/Minecraft.Client/Windows64/Miles/include/mss.h index 754f536b..531dcbc9 100644 --- a/Minecraft.Client/Windows64/Miles/include/mss.h +++ b/Minecraft.Client/Windows64/Miles/include/mss.h @@ -39,7 +39,7 @@ // doc system stuff #ifndef EXPAPI -#define EXPAPI +#define EXPAPI #endif #ifndef EXPTYPE #define EXPTYPE @@ -69,10 +69,10 @@ // For docs EXPGROUP(_NullGroup) #define MilesVersion "9.3m" EXPMACRO -#define MilesMajorVersion 9 EXPMACRO +#define MilesMajorVersion 9 EXPMACRO #define MilesMinorVersion 3 EXPMACRO -#define MilesBuildNumber 11 EXPMACRO -#define MilesCustomization 0 EXPMACRO +#define MilesBuildNumber 11 EXPMACRO +#define MilesCustomization 0 EXPMACRO EXPGROUP(_RootGroup) @@ -273,14 +273,14 @@ typedef void VOIDFUNC(void); //================ EXPGROUP(Basic Types) -#define AILCALL EXPTAG(AILCALL) +#define AILCALL EXPTAG(AILCALL) /* Internal calling convention that all external Miles functions use. Usually cdecl or stdcall on Windows. */ -#define AILCALLBACK EXPTAG(AILCALLBACK docproto) +#define AILCALLBACK EXPTAG(AILCALLBACK docproto) /* Calling convention that user supplied callbacks from Miles use. @@ -326,7 +326,7 @@ RADDEFSTART typedef CHAR *LPSTR, *PSTR; #ifdef IS_WIN64 - typedef uint64_t ULONG_PTR, *PULONG_PTR; + typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; #else #ifdef _Wp64 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 @@ -348,13 +348,13 @@ RADDEFSTART typedef struct HWAVEOUT__ *HWAVEOUT; typedef HWAVEIN *LPHWAVEIN; typedef HWAVEOUT *LPHWAVEOUT; - + #ifndef WAVE_MAPPER #define WAVE_MAPPER ((UINT)-1) #endif typedef struct waveformat_tag *LPWAVEFORMAT; - + typedef struct HMIDIOUT__ *HMIDIOUT; typedef HMIDIOUT *LPHMIDIOUT; typedef struct HWND__ *HWND; @@ -368,9 +368,9 @@ RADDEFSTART // If compiling MSS DLL, use __declspec(dllexport) for both // declarations and definitions // - + #ifdef IS_WIN32 - + #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) #define AILLIBCALLBACK __stdcall #define AILCALL __stdcall @@ -382,20 +382,20 @@ RADDEFSTART #define AILCALLBACK __cdecl #define AILEXPORT __cdecl #endif - + #ifdef __RADINDLL__ #define DXDEC __declspec(dllexport) #define DXDEF __declspec(dllexport) #else - + #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) #define DXDEC extern #else #define DXDEC __declspec(dllimport) #endif - + #endif - + #ifdef IS_WIN64 #define MSSDLLNAME "MSS64.DLL" #define MSS_REDIST_DIR_NAME "redist64" @@ -403,11 +403,11 @@ RADDEFSTART #define MSSDLLNAME "MSS32.DLL" #define MSS_REDIST_DIR_NAME "redist" #endif - + #define MSS_DIR_SEP "\\" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - + #endif typedef void * LPVOID; @@ -420,7 +420,7 @@ RADDEFSTART #define AILLIBCALLBACK #define AILCALL #define AILEXPORT - #define AILCALLBACK + #define AILCALLBACK #elif defined(__RADX86__) #define AILLIBCALLBACK __attribute__((cdecl)) #define AILCALL __attribute__((cdecl)) @@ -437,7 +437,7 @@ RADDEFSTART #define DXDEC extern #define DXDEF #endif - + #ifdef __RADX64__ #define MSS_REDIST_DIR_NAME "redist/x64" #elif defined(IS_X86) @@ -447,7 +447,7 @@ RADDEFSTART #else #error "No Redist Dir Specified" #endif - + #define MSS_DIR_SEP "/" #define MSS_DIR_UP ".." MSS_DIR_SEP #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP @@ -714,7 +714,7 @@ typedef enum #ifndef FILE_ERRS #define FILE_ERRS - + #define AIL_NO_ERROR 0 #define AIL_IO_ERROR 1 #define AIL_OUT_OF_MEMORY 2 @@ -736,9 +736,9 @@ EXPTYPEBEGIN typedef SINTa HMSSENUM; EXPTYPEEND /* specifies a type used to enumerate through a list of properties. - + $:MSS_FIRST use this value to start the enumeration process. - + The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call the enumeration function until it returns 0. @@ -751,7 +751,7 @@ the enumeration function until it returns 0. // Preference names and default values // -#define AIL_MM_PERIOD 0 +#define AIL_MM_PERIOD 0 #define DEFAULT_AMP 1 // Default MM timer period = 5 msec. #define AIL_TIMERS 1 @@ -1877,7 +1877,7 @@ typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D posi F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. F32 spread; - + HSAMPLE owner; // May be NULL if used for temporary/internal calculations AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired @@ -1915,7 +1915,7 @@ typedef struct _SAMPLE // Sample instance S32 index; // Numeric index of this sample SMPBUF buf[8]; // Source data buffers - + U32 src_fract; // Fractional part of source address U32 mix_delay; // ms until start mixing (decreased every buffer mix) @@ -1924,7 +1924,7 @@ typedef struct _SAMPLE // Sample instance U64 mix_bytes; // total number of bytes sent to the mixer for this sample. S32 group_id; // ID for grouped operations. - + // size of the next dynamic arrays U32 chan_buf_alloced; U32 chan_buf_used; @@ -1946,10 +1946,10 @@ typedef struct _SAMPLE // Sample instance // these are dynamic arrays F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) - + S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # // 99% of the time this is a 1:1 mapping and is zero. - + S32 lp_any_on; // are any of the low pass filters on? S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? @@ -1989,7 +1989,7 @@ typedef struct _SAMPLE // Sample instance U32 low_pass_changed; // bit mask for what channels changed. - + S32 bus; // Bus assignment for this sample. S32 bus_comp_sends; // Which buses this bus routes compressor input to. S32 bus_comp_installed; // Nonzero if we have a compressor installed. @@ -2042,7 +2042,7 @@ typedef struct _SAMPLE // Sample instance SPINFO pipeline[N_SAMPLE_STAGES]; S32 n_active_filters; // # of SP_FILTER_n stages active - + // // 3D-related state for all platforms (including Xbox) // @@ -2113,14 +2113,14 @@ DXDEC void AILCALL AIL_serve(void); #ifdef IS_MAC typedef void * LPSTR; - + #define WHDR_DONE 0 - + typedef struct _WAVEIN { long temp; } * HWAVEIN; - + typedef struct _WAVEHDR { S32 dwFlags; @@ -2133,7 +2133,7 @@ DXDEC void AILCALL AIL_serve(void); S32 dwLoops; void * lpNext; U32 * reserved; - + } WAVEHDR, * LPWAVEHDR; #endif @@ -2145,7 +2145,7 @@ typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver #ifdef IS_MAC #define AIL_DIGITAL_INPUT_DEFAULT 0 - + typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver { U32 tag; // HDIN @@ -2478,7 +2478,7 @@ typedef struct _DIG_DRIVER // Handle to digital audio driver U32 last_ds_play; U32 last_ds_write; U32 last_ds_move; - + #endif #ifdef IS_X86 @@ -2661,7 +2661,7 @@ typedef struct _SEQUENCE // XMIDI sequence state table void const *EVNT; U8 const *EVNT_ptr; // Current event pointer - + U8 *ICA; // Indirect Controller Array AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler @@ -3121,13 +3121,13 @@ DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); #elif defined(__RADANDROID__) DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); - + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); #define AIL_open_digital_driver(frequency, bits, channel, flags) \ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) - + #elif defined(IS_PSP2) DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); @@ -3221,7 +3221,7 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire { Str255 version_name; } MSS_VersionType; - + #define AIL_MSS_version(str,len) \ { \ long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ @@ -3269,11 +3269,11 @@ DXDEC S32 AILCALL AIL_digital_handle_reacquire } \ } \ } - + #endif DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - + DXDEC S32 AILCALL AIL_digital_handle_reacquire (HDIGDRIVER drvr); @@ -3339,18 +3339,18 @@ DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 c $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only - affected when popped. + affected when popped. $- - If you want more control over whether a sample will be affected by a push or a pop operation, + If you want more control over whether a sample will be affected by a push or a pop operation, see $AIL_set_sample_level_mask. - + */ DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); /* - Pops the current system state and returns the system to the way it + Pops the current system state and returns the system to the way it was before the last push. $:dig The driver to pop. @@ -3374,7 +3374,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); $:S The sample to set the mask for. $:mask The bitmask of levels for which the sample will play. - Under normal push/pop operations, a sample's mask is set when it is + Under normal push/pop operations, a sample's mask is set when it is started to the level the system is at. If the system is pushed without a reset, then the mask is adjusted to include the new level. When a system is popped, if the sample is going to continue playing, @@ -3435,7 +3435,7 @@ DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); $:return The HSAMPLE for the new bus. A bus allows you to treat a group of samples as one sample. With the bus sample you can - do almost all of the things you can do with a normal sample handle. The only exception + do almost all of the things you can do with a normal sample handle. The only exception is you can't adjust the playback rate of the sample. Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. @@ -3495,7 +3495,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); /* - Installs the Compressor filter on to a bus, using another bus as the input for + Installs the Compressor filter on to a bus, using another bus as the input for compression/limiting. $:dig The driver the busses exist on. @@ -3508,7 +3508,7 @@ DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_inde its signal strength to the filter, allowing it to attenuate the bus_index bus based on another bus's contents. - To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and + To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties are documented under $(Compressor Filter) */ @@ -4325,7 +4325,7 @@ typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); #define MSS_STREAM_CHUNKS 8 -typedef struct _STREAM +typedef struct _STREAM { S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream S32 using_ASI; // 1 if using ASI decoder to uncompress stream data @@ -4349,7 +4349,7 @@ typedef struct _STREAM S32 read_IO_index; // index of buffer to be loaded into Miles next S32 bufsize; // size of each buffer - + U32 datarate; // datarate in bytes per second S32 filerate; // original datarate of the file S32 filetype; // file format type @@ -4987,7 +4987,7 @@ typedef struct OGG_INFO; DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, - U8 *Ogg_file_image, + U8 *Ogg_file_image, S32 Ogg_file_size); DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); @@ -5102,10 +5102,10 @@ DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); // 3D-related calls // -DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, +DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, S32 bus_index); -DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, +DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, S32 bus_index, S32 room_type); @@ -5180,7 +5180,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSS $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If + This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be called otherwise. @@ -5195,8 +5195,8 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, M $:graph The array of points to use as the graph. $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - This marks a sample as having an exclusion that varies as a function of distance to the listener. If - a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion + This marks a sample as having an exclusion that varies as a function of distance to the listener. If + a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion affects reverb wet level. The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. @@ -5230,7 +5230,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECT other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional source. - If there is neither spread falloff nor volume falloff specified, spread will be automatically applied + If there is neither spread falloff nor volume falloff specified, spread will be automatically applied when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff and $AIL_set_sample_3D_volume_falloff. @@ -5243,7 +5243,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); $:S Sample to affect. $:spread The value to set the spread to. - Spread is how much the directionality of a sample "spreads" to more speakers - emulating + Spread is how much the directionality of a sample "spreads" to more speakers - emulating the effect a sound has when it occupies more than a point source. For instance, a sound point source that sits directly to the left of the listener would have a very strong left speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be @@ -5392,7 +5392,7 @@ EXPGROUP(Miles High Level Event System) EXPTYPE typedef struct MSSSOUNDBANK {}; /* Internal structure. - + Use $HMSOUNDBANK instead. */ @@ -5401,7 +5401,7 @@ EXPTYPE typedef struct MSSSOUNDBANK {}; EXPTYPE typedef struct SoundBank *HMSOUNDBANK; /* Describes a handle to an open sound bank. - + This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. */ @@ -5424,7 +5424,7 @@ DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); Close a soundbank previously opened with $AIL_open_soundbank. $:bank Soundbank to close. - + Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from this soundbank are no longer valid. */ @@ -5448,7 +5448,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. - The name of the bank is the name used in asset names. This is distinct from the + The name of the bank is the name used in asset names. This is distinct from the file name of the bank. The return value should not be deleted. @@ -5457,7 +5457,7 @@ DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); /* Returns the amount of data used by the soundbank management structures. - + $:bank Soundbank to query. $:return Total memory allocated. @@ -5476,7 +5476,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sound presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5503,7 +5503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMS $:return Returns 0 when enumeration is complete. Enumerates the environment presets available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* PresetName = 0; @@ -5530,7 +5530,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* $:return Returns 0 when enumeration is complete. Enumerates the sounds available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* SoundName = 0; @@ -5549,7 +5549,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* Note that name should NOT be deleted by the caller - this points at memory owned by Miles. */ - + DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); /* Enumerate the events stored in a soundbank. @@ -5561,7 +5561,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, $:return Returns 0 when enumeration is complete. Enumerates the events available inside of a bank file. Example usage: - + ${ HMSSENUM Token = MSS_FIRST; const char* EventName = 0; @@ -5624,7 +5624,7 @@ DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. This will alter the properties on a given sample, based on the given preset. -*/ +*/ DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); /* @@ -5644,7 +5644,7 @@ DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK ba $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. Presets may or may not affect any given property. Only the properties affected by the specified - preset will have their values restored to default. + preset will have their values restored to default. */ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); @@ -5658,7 +5658,7 @@ typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPO $:isfloat nonzero if the output needs to be a float. The function callback should convert variable expressions in to an output value of the - requested type. + requested type. */ DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); @@ -5777,7 +5777,7 @@ DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name $:name The name of the sound asset to find. $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. - $:return Returns the byte size of the buffer required for out_name. + $:return Returns the byte size of the buffer required for out_name. This function must be called in order to resolve the sound asset name to something that can be used by miles. To ensure safe buffer containment, call @@ -5832,7 +5832,7 @@ typedef struct _MEMDUMP* HMEMDUMP; ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." - Discussion = "Primarily designed for offline use, this function is the first step in + Discussion = "Primarily designed for offline use, this function is the first step in creating an event that can be consumed by the MilesEvent system. Usage is as follows: HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); @@ -5850,7 +5850,7 @@ typedef struct _MEMDUMP* HMEMDUMP; Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following $AIL_complete_event_queue_processing. - + Events are generally tailored to the MilesEvent system, even though there is nothing preventing you from writing your own event system, or creation ui. " @@ -5906,7 +5906,7 @@ EXPTYPEEND /* Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. - $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same + $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same sound to play twice in a row. This is the only selection type that doesn't require a state variable. $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. @@ -5926,10 +5926,10 @@ EXPTYPEEND Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." - In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. - If there are multiple names listed, the sound will be chosen at random based on the given weights. This + In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. + If there are multiple names listed, the sound will be chosen at random based on the given weights. This string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always - terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use + terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use an empty string as an entry." In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" @@ -5944,7 +5944,7 @@ EXPTYPEEND In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." - In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound + In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound with a priority strictly less than the given priority." In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." @@ -5969,19 +5969,19 @@ DXDEC S32 AILCALL AIL_add_start_sound_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_SoundNames, - const char* i_PresetName, + const char* i_PresetName, U8 i_PresetIsDynamic, const char* i_EventName, const char* i_StartMarker, const char* i_EndMarker, char const* i_StateVar, char const* i_VarInit, - const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, + const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, const char* i_StartOffset, F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, F32 i_FadeInTime, - U8 i_EvictionType, + U8 i_EvictionType, U8 i_SelectType ); @@ -6004,7 +6004,7 @@ AIL_add_start_sound_event_step( In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to be called with the same parameters. - + If you are using MilesEvent, the data is refcounted so the sound will not be freed until all samples using it complete." } @@ -6089,7 +6089,7 @@ DXDEC S32 AILCALL AIL_add_control_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, + HMSSEVENTCONSTRUCT i_Event, const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, const char* i_PresetName, U8 i_PresetApplyType, @@ -6191,7 +6191,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Defines a named blend function to be referenced by a blended sound later. $:i_Event The event to add the step to. - $:i_Name The name of the blend. This is the name that will be + $:i_Name The name of the blend. This is the name that will be referenced by the state variable in start sound, as well as the variable name to set by the game to update the blend for an instance. $:i_SoundCount The number of sounds this blend will affect. Max 10. @@ -6226,7 +6226,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, Miles max sample count." } */ -DXDEC S32 AILCALL +DXDEC S32 AILCALL AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); /*! @@ -6257,8 +6257,8 @@ AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitNa AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" } */ -DXDEC S32 AILCALL -AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, +DXDEC S32 AILCALL +AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, const char* i_Labels, U8 i_IsDynamic ); @@ -6272,13 +6272,13 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * n thus shouldn't be checked via strlen, etc. $:return Returns 0 on fail. - Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, + Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, rather than inspected directly. */ DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); /* - Clears all persistent state in the runtime. + Clears all persistent state in the runtime. $:i_Event The event to add the step to. @@ -6311,7 +6311,7 @@ DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Ev DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); /* Adds a step to define a variable that oscillates over time. - + $:i_Event The event to add the step to. $:i_Name The nane of the variable to oscillate. $:i_Base The value to oscillate around, or a variable name to use as the base. @@ -6327,15 +6327,15 @@ DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); /* Adds a step to set and move a variable over time on a curve. - + $:i_Event The event to add the step to. $:i_Name The variable to move. $:i_Times The midpoint and final times for the curves $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) $:i_Values The initial, midpoint, and final values for the variable. - + The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. - + If an existing move var exists when the new one is added, the old one is replaced. */ @@ -6450,7 +6450,7 @@ struct EVENT_STEP_INFO U8 isdynamic; } persist; - struct + struct { MSSSTRINGC name; MSSSTRINGC labels; @@ -6522,7 +6522,7 @@ struct EVENT_STEP_INFO the string location of the next event step in the buffer." Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be - used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the + used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the next step. In this manner it can be used in a loop: // Create an event to stop all sounds. @@ -6610,11 +6610,11 @@ EXPTYPE typedef void* HEVENTSYSTEM; DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); /* Initializes the Miles Event system and associates it with an open digital driver. - + $:dig The digital sound driver that this event system should use. $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). - $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. - Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. + $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. + Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. Use 0 to let Miles to allocate this buffer itself. $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). @@ -6633,8 +6633,8 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); $:return A handle to the event system to use in various high level functions. Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. - - To enqueue events to the new system, use $AIL_enqueue_event_system. + + To enqueue events to the new system, use $AIL_enqueue_event_system. To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. @@ -6646,7 +6646,7 @@ DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); /* Shuts down the Miles event system. - + This function will closes everything in the event system - it ignores reference counts. It will free all event memory, sound banks, and samples used by the system. */ @@ -6660,10 +6660,10 @@ DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char c $:return The handle to the newly loaded soundbank (zero on failure). This function opens the sound bank and makes it available to the event system. The filename - is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. + is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', and while using the name 'gamebank' for authoring and auditioning. - + Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds is played, or a sound requiring it plays. @@ -6685,7 +6685,7 @@ DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); Any other data references still existing (queued events, persisted presets, etc) will report errors when used, but will not crash. - + Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. @@ -6698,24 +6698,24 @@ DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name) (EXPAPI removed to prevent release in docs) Searches for an event by name in the event system. - + $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". $:return A pointer to the event contents (or 0, if the event isn't found). - + This function is normally used as the event parameter for $AIL_enqueue_event. It searches one or all open soundbanks for a particular event name. - - This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with + + This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with MILESEVENT_ENQUEUE_BY_NAME. - + Events that are not enqueued by name can not be tracked by the Auditioner. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to a specific system. Used only if you have multiple event systems running. - + $:system The event system to attach the event to. $:return See $AIL_enqueue_event for return description. @@ -6728,10 +6728,10 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); $:name The full name of the event, eg "soundbank/path/to/event". $:return See $AIL_enqueue_event for return description. - - This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. - - For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent + + This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. + + For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) For introduction to the auditioning system, see $integrating_events. @@ -6743,9 +6743,9 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); $:return A token used for passing to functions that add data to the event. - This is used to pass more data to an event that will be executed. For instance, if + This is used to pass more data to an event that will be executed. For instance, if an event is going to spatialize a sound, but there's no need to move the sound over the course of - its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a + its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a sound is started it will use that for its initial position, and there is no need to do any game object <-> event id tracking. @@ -6762,7 +6762,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); The enqueue process is still completely thread safe. No locks are used, however only 8 enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start - will yield the thread until a slot is open. + will yield the thread until a slot is open. The ONLY time that should happen is if events enqueues are started but never ended: @@ -6838,7 +6838,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as user_buffer is never dereferenced. - $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and + $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and carried with the event. During sound enumeration this buffer is made available, and you never have to worry about memory management. $- @@ -6855,7 +6855,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data->game_stat = 1; data->needed_info = 2; - // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound + // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound // completes and we're done using it in the enumeration loop. S32 ptr_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); @@ -6874,7 +6874,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, data.game_stat = 1; data.needed_info = 2; - // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use + // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use // a stack variable like this S32 buf_token = AIL_enqueue_event_start(); AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); @@ -6895,7 +6895,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* nam $:value The value of the variable to set. $:return 0 if the enqueue buffer is full - When a sound starts, the given variable will be set to the given value prior to any possible + When a sound starts, the given variable will be set to the given value prior to any possible references being used by presets. */ @@ -6904,7 +6904,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); Limits the effects of the event to sounds started by the given ID. $:token A token created with $AIL_enqueue_event_start - $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an + $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an event, it will apply to all sounds started by the event, and any events queued by that event. $:return 0 if the enqueue buffer is full @@ -6932,7 +6932,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); $:selection The value to use for selecting the sound to play. $:return 0 if the enqueue buffer is full - The selection index is used to programatically select a sound from the + The selection index is used to programatically select a sound from the loaded banks. The index passed in replaces any numeric value at the end of the sound name existing in any start sound event step. For example, if a start sound event plays "mybank/sound1", and the event is queued with @@ -6969,52 +6969,52 @@ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* even As with all of the enqueue functions it is completely thread-safe. Upon completion of this function, the enqueue slot is release and available for another - $AIL_enqueue_event_start. + $AIL_enqueue_event_start. */ DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); /* Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. - - $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. + + $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. - $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. - This data is then accessible later, when enumerating the instances. + $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. + This data is then accessible later, when enumerating the instances. $:user_buffer_len Size of the buffer pointed to by user_buffer. $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, - when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if + when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you - execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. + execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. - $:return On success, returns QueuedID value that is unique to this queued event for the rest of this + $:return On success, returns QueuedID value that is unique to this queued event for the rest of this program run (you can use this ID to uniquely identify sounds triggered from this event). - + This function enqueues an event to be triggered - this is how you begin execution of an event. First, you queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to execute an event. - - This function is very lightweight. It does nothing more than post the event and data to a + + This function is very lightweight. It does nothing more than post the event and data to a command buffer that gets executed via $AIL_begin_event_queue_processing. The user_buffer parameter can be used in different ways. If no flags are passed in, then Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with the queued sound - you can then free the user_buffer data completely! This lets Miles keep track - of all your sound related memory directly and is the normal way to use the system (it is very + of all your sound related memory directly and is the normal way to use the system (it is very convenient once you get used to it). If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will simply be associated with each sound that this event may start. In this case, user_buffer_len is ignored. - - In both cases, when you later enumerate the sound instances, you can access your sound data + + In both cases, when you later enumerate the sound instances, you can access your sound data with the $(MILESEVENTSOUNDINFO::UserBuffer) field. - + You can call this function from any number threads - it's designed to be called from anywhere in your game. If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done - by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and + by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. */ @@ -7044,23 +7044,23 @@ DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); /* Begin execution of all of the enqueued events. - $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events + $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events (out of memory, bank file not found, bad data, etc). You can get the specific error by calling $AIL_last_error. - + This function executes all the events currently in the queue. This is where all major processing takes place in the event system. - + Once you execute this functions, then sound instances will be in one of three states: - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7082,7 +7082,7 @@ ${ MILESEVENTSOUNDINFO Info; HMSSENUM SoundEnum = MSS_FIRST; - while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) { game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue @@ -7098,13 +7098,13 @@ ${ } } - $AIL_complete_event_queue_processing( ); - $} - - Note that if any event step drastically fails, the rest of the command queue is + $AIL_complete_event_queue_processing( ); + $} + + Note that if any event step drastically fails, the rest of the command queue is skipped, and this function returns 0! For this reason, you shouldn't assume that a start sound event will always result in a completed sound later. - + Therefore, you should allocate memory that you want associated with a sound instance during the enumeration loop, rather than at enqueue time. Otherwise, you need to detect that the sound didn't start and then free the memory (which can be complicated). @@ -7120,7 +7120,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO HSTREAM Stream; void* UserBuffer; S32 UserBufferLen; - S32 Status; + S32 Status; U32 Flags; S32 UsedDelay; F32 UsedVolume; @@ -7130,10 +7130,10 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO } MILESEVENTSOUNDINFO; /* Sound instance data that is associated with each active sound instance. - + $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound - was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from + was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from $AIL_enqueue_event, and EventID represents the completion event. $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). $:Sample The $HSAMPLE for this playing sound. @@ -7148,7 +7148,7 @@ EXPTYPE typedef struct _MILESEVENTSOUNDINFO $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted and is only valid for the until the next call in to Miles. $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. - + This structure is returned by the $AIL_enumerate_sound_instances function. It returns information about an active sound instance. */ @@ -7157,7 +7157,7 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7183,14 +7183,14 @@ DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will // get 20. $} - + */ DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); /* Sets a named variable that the designer can reference in the tool. - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM to set a global variable for a specific system, 0 to set a global variable for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. $:name The name of the variable to set. @@ -7265,7 +7265,7 @@ DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, the sound starting. Generally you don't need to do this manually, since the sound designer should do this, however if you need to restart a sound that stopped - for example a stream that went to error - you will have to set the start position via code. - + However, since there can be a delay between the time the sound is first seen in the sound iteration and the time it gets set to the data, start positions set via the low level miles calls can get lost, so use this. @@ -7281,11 +7281,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. - $:info Returns the data for each sound instance. + $:info Returns the data for each sound instance. $:return Returns 0 when enumeration is complete. Enumerates the sound instances. This will generally be used between - calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to + calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to manage the sound instances. The label_query is a list of labels to match, separated by commas. By default, comma-separated @@ -7302,11 +7302,11 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSS $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). @@ -7315,7 +7315,7 @@ ${ HMSSENUM SoundEnum = MSS_FIRST; MILESEVENTSOUNDINFO Info; - while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) + while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) { if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) { @@ -7330,23 +7330,23 @@ $} EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; #define MILESEVENT_SOUND_STATUS_PENDING 0x1 -#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 +#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 #define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were created by events that had a "Start Sound Step". Note that these instances aren't audible yet, so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - + on the sound before Miles begins to play it. + $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously started and are continuing to play (you might update the 3D position for these, for example). - + $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing since the last this frame (you might use this status to free any game related memory, for example). - + These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. */ @@ -7360,13 +7360,13 @@ EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; EXPTYPEEND /* Specifies the status of a sound instance. - + $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event and couldn't find anything in the loaded banks. $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, or a limit on the sound itself. - $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. + $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. The sound will start when sufficient data has been loaded to hopefully avoid a skip. $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible that the sound playback will catch up to the read position under poor I/O conditions. @@ -7375,7 +7375,7 @@ EXPTYPEEND sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media was removed during load, or the file was not found. - + These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances may have more than one flag, logically 'or'ed together. */ @@ -7383,16 +7383,16 @@ EXPTYPEEND DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); /* Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). - + $:return Returns 0 on failure. - This function must be called as a pair with $AIL_begin_event_queue_processing. - - In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't - started playing yet. Old sound instances that have finished playing are still valid - they - haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances + This function must be called as a pair with $AIL_begin_event_queue_processing. + + In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't + started playing yet. Old sound instances that have finished playing are still valid - they + haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances and frees the completed ones - it's the 2nd half of the event processing. - + Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound instances. */ @@ -7400,7 +7400,7 @@ DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a stop sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7408,7 +7408,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, this function accomplishes that, and is captured by the auditioner for replay. @@ -7417,7 +7417,7 @@ DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a pause sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7425,7 +7425,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, this function accomplishes that, and is captured by the auditioner for replay. @@ -7434,7 +7434,7 @@ DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); /* Allows the programmer to manually enqueue a resume sound event into the event system. - + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. @@ -7442,17 +7442,17 @@ DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U6 Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances for a description of the label_query format). - + Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, this function accomplishes that, and is captured by the auditioner for replay. */ -DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, +DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); /* Allows the programmer to manually enqueue a start sound event into the event system. - + $:bank The bank containing the sound to start. $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. @@ -7463,10 +7463,10 @@ DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. $:return Returns a non-zero EnqueueID on success. - Enqueues an event to start the specified sound asset. - + Enqueues an event to start the specified sound asset. + Usually the programmer should trigger an event that the sound designer has specifically - create to start the appropriate sounds, but this function gives the programmer + create to start the appropriate sounds, but this function gives the programmer manual control, if necessary. This function is not captured by the auditioner. */ @@ -7488,7 +7488,7 @@ DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char co Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based on the settings in the event step). - + Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. Note that this replaces those events, it does not supplement. */ @@ -7503,7 +7503,7 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS that this pointer can change frame to frame and should be immediately copied to a client-allocated buffer if persistence is desired. $:return Returns 0 when enumeration is complete. - + This function lets you enumerate all the persisting presets that are currently active in the system. It is mostly a debugging aid. */ @@ -7511,12 +7511,12 @@ DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSS DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); /* Returns a big string describing the current state of the event system. - - $:return String description of current systems state. + + $:return String description of current systems state. This function is a debugging aid - it can be used to show all of the active allocations, active sounds, etc. - + You must delete the pointer returned from this function with $AIL_mem_free_lock. */ @@ -7535,7 +7535,7 @@ EXPTYPE typedef struct _MILESEVENTSTATE } MILESEVENTSTATE; /* returns the current state of the Miles Event System. - + $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. $:HeapRemaining The number of bytes in HeapSize that is remaining. @@ -7615,7 +7615,7 @@ EXPTYPE typedef struct _MILESBANKFUNCTIONS } MILESBANKFUNCTIONS; /* specifies callbacks for each of the Miles event system. - + $:FreeAll Callback that tells you to free all user-side bank memory. $:GetPreset Callback to retrieve a sound preset. $:GetEnvironment Callback to retrieve an environment preset. @@ -7645,13 +7645,13 @@ DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleC In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). - + */ DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); /* Allows you to override the internal bank file resource management.. - + $:Functions A pointer to a structure containing all the callback functions. This function is used to completely override the high-level resource management system. @@ -7856,7 +7856,7 @@ EXPTYPEEND $:MILES_PLAT_IPHONE Apple iDevices $:MILES_PLAT_LINUX Linux Flavors $:MILES_PLAT_WII Nintendo Wii - $:MILES_PLAT_PSP2 Sony NGP + $:MILES_PLAT_PSP2 Sony NGP Values representing the various platforms the high level tool allows. */ @@ -7891,11 +7891,11 @@ EXPGROUP(Miles High Level Event System) DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); /* Returns an information structure about the current state of the Miles Event System. - + $:system The system to retrieve information for, or zero for the default system. $:state A pointer to a structure to receive the state information. - This function is a debugging aid - it returns information for the event system. + This function is a debugging aid - it returns information for the event system. */ DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); @@ -7923,7 +7923,7 @@ DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); // Callback for the error handler. EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); /* - The function prototype to use for a callback that will be made when the event system + The function prototype to use for a callback that will be made when the event system encounters an unrecoverable error. $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. @@ -7937,7 +7937,7 @@ EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_ EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); /* The function definition to use when defining your own random function. - + You can define a function with this prototype and pass it to $AIL_register_random if you want to tie the Miles random calls in with your game's (for logging and such). */ @@ -7953,7 +7953,7 @@ DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_Error can sometimes be somewhat invisible. This function allows you to see what went wrong, when it went wrong. - The basic usage is to have the callback check $AIL_last_error() for the overall category of + The basic usage is to have the callback check $AIL_last_error() for the overall category of failure. The parameter passed to the callback might provide some context, but it can and will be zero on occasion. Generally it will represent the resource string that is being worked on when the error occurred. @@ -8009,7 +8009,7 @@ typedef C8 * (AILCALL *FLT_ERROR)(void); typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, MSS_FREE_TYPE * pfree, - UINTa user, + UINTa user, HDIGDRIVER dig, void * memory); typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); diff --git a/Minecraft.Client/Windows64/Miles/include/rrcore.h b/Minecraft.Client/Windows64/Miles/include/rrcore.h index 17ebee3a..e88b5f8c 100644 --- a/Minecraft.Client/Windows64/Miles/include/rrcore.h +++ b/Minecraft.Client/Windows64/Miles/include/rrcore.h @@ -114,8 +114,8 @@ #define __RADLITTLEENDIAN__ #ifdef __i386__ #define __RADX86__ - #else - #define __RADARM__ + #else + #define __RADARM__ #endif #define RADINLINE inline #define RADRESTRICT __restrict @@ -132,7 +132,7 @@ #define __RADX86__ #else #error Unknown processor -#endif +#endif #define __RADLITTLEENDIAN__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -155,7 +155,7 @@ #define __RADNACL__ #define __RAD32__ #define __RADLITTLEENDIAN__ - #define __RADX86__ + #define __RADX86__ #define RADINLINE inline #define RADRESTRICT __restrict @@ -196,7 +196,7 @@ #define __RAD64REGS__ #define __RADLITTLEENDIAN__ #define RADINLINE inline - #define RADRESTRICT __restrict + #define RADRESTRICT __restrict #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) @@ -265,7 +265,7 @@ #endif #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) - + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it #define __RADWIIU__ @@ -480,7 +480,7 @@ #undef RADRESTRICT /* could have been defined above... */ #define RADRESTRICT __restrict - + #undef RADSTRUCT #define RADSTRUCT struct __attribute__((__packed__)) #endif @@ -885,7 +885,7 @@ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var #else // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / #endif // WARNING : RAD_TLS should really only be used for debug/tools stuff @@ -917,8 +917,8 @@ #define RAD_S32 signed int // But pointers are 64 bits. #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed long long - #define RAD_UINTa __w64 unsigned long long + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 #else // non-vc.net compiler or /Wp64 turned off #define RAD_UINTa unsigned long long #define RAD_SINTa signed long long @@ -976,8 +976,8 @@ #define RAD_U64 unsigned long long #define RAD_S64 signed long long #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 #else // 16-bit typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s @@ -1134,7 +1134,7 @@ // helpers for doing an if ( ) with expect : // if ( RAD_LIKELY(expr) ) { ... } - + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) @@ -1324,7 +1324,7 @@ __pragma(warning(push)) \ __pragma(warning(disable:4127)) \ } while(0) \ - __pragma(warning(pop)) + __pragma(warning(pop)) #define RAD_STATEMENT_END_TRUE \ __pragma(warning(push)) \ @@ -1333,10 +1333,10 @@ __pragma(warning(pop)) #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_USE_STANDARD_LOOP_CONSTRUCT #endif #ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT @@ -1345,7 +1345,7 @@ #define RAD_STATEMENT_END_FALSE \ } while ( (void)0,0 ) - + #define RAD_STATEMENT_END_TRUE \ } while ( (void)1,1 ) @@ -1355,7 +1355,7 @@ RAD_STATEMENT_START \ code \ RAD_STATEMENT_END_FALSE - + #define RAD_INFINITE_LOOP( code ) \ RAD_STATEMENT_START \ code \ @@ -1363,7 +1363,7 @@ // Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later # define RR_UNUSED_VARIABLE(x) (void) x #else # define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) @@ -1473,7 +1473,7 @@ // just to make gcc shut up about derefing null : #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object // you should then RR_ASSERT( &(ret->member) == ptr ); #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) @@ -1482,7 +1482,7 @@ // Cache / prefetch macros : // RR_PREFETCH for various platforms : -// +// // RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan // platforms that automatically prefetch sequential (eg. PC) should be a no-op here // RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined @@ -1707,7 +1707,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) //----------------------------------------------------------- - + // RAD_NO_BREAK : option if you don't like your assert to break // CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional #ifdef RAD_NO_BREAK @@ -1725,7 +1725,7 @@ extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; #define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) //----------------------------------- -#ifdef RR_DO_ASSERTS +#ifdef RR_DO_ASSERTS #define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) #define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) @@ -1883,7 +1883,7 @@ unsigned long __cdecl _byteswap_ulong (unsigned long _Long); #define RR_BSWAP16 _byteswap_ushort #define RR_BSWAP32 _byteswap_ulong -unsigned long long __cdecl _byteswap_uint64 (unsigned long long val); +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); #pragma intrinsic(_byteswap_uint64) #define RR_BSWAP64 _byteswap_uint64 @@ -1909,7 +1909,7 @@ RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) return _Long; } -RADFORCEINLINE unsigned long long RR_BSWAP64 (unsigned long long _Long) +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) { __asm { mov eax, DWORD PTR _Long @@ -2250,10 +2250,10 @@ void __storewordbytereverse (unsigned int val, int offset, void *bas #if ( defined(_MSC_VER) && _MSC_VER >= 1300) -unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); #pragma intrinsic(_rotl64) -#define RR_ROTL64(x,k) _rotl64((unsigned long long)(x),(int)(k)) +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) #elif defined(__RADCELL__) @@ -2262,7 +2262,7 @@ unsigned long long __cdecl _rotl64(unsigned long long _Val, int _Shift); #elif defined(__RADLINUX__) || defined(__RADMACAPI__) -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. #define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) #else diff --git a/Minecraft.Client/Windows64/Windows64_App.cpp b/Minecraft.Client/Windows64/Windows64_App.cpp index d5564804..bba33cad 100644 --- a/Minecraft.Client/Windows64/Windows64_App.cpp +++ b/Minecraft.Client/Windows64/Windows64_App.cpp @@ -76,7 +76,7 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() StorageManager.SetSaveTitle(wWorldName.c_str()); bool isFlat = false; - int64_t seedValue = 0; // BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + __int64 seedValue = 0; // BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements NetworkGameInitData *param = new NetworkGameInitData(); param->seed = seedValue; diff --git a/Minecraft.Client/Xbox/4JLibs/inc/4J_Storage.h b/Minecraft.Client/Xbox/4JLibs/inc/4J_Storage.h index 2ba90566..2988dc2c 100644 --- a/Minecraft.Client/Xbox/4JLibs/inc/4J_Storage.h +++ b/Minecraft.Client/Xbox/4JLibs/inc/4J_Storage.h @@ -5,7 +5,7 @@ using namespace std; class CXuiStringTable; -typedef struct +typedef struct { FILETIME fTime; XCONTENT_DATA Content; @@ -34,7 +34,7 @@ class C4JStorage public: // Structs defined in the DLC_Creator, but added here to be used in the app - typedef struct + typedef struct { unsigned int uiFileSize; DWORD dwType; @@ -52,7 +52,7 @@ public: DLC_FILE_PARAM, *PDLC_FILE_PARAM; // End of DLC_Creator structs - typedef struct + typedef struct { WCHAR wchDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH]; @@ -62,7 +62,7 @@ public: CACHEINFOSTRUCT; // structure to hold DLC info in TMS - typedef struct + typedef struct { DWORD dwVersion; DWORD dwNewOffers; @@ -102,7 +102,7 @@ public: enum ESaveGameControlState { ESaveGameControl_Idle=0, - ESaveGameControl_Save, + ESaveGameControl_Save, ESaveGameControl_InternalRequestingDevice, ESaveGameControl_InternalGetSaveName, ESaveGameControl_InternalSaving, @@ -189,7 +189,7 @@ public: TMS_UGCTYPE_MAX }; - typedef struct + typedef struct { CHAR szFilename[256]; int iFileSize; @@ -197,14 +197,14 @@ public: } TMSPP_FILE_DETAILS, *PTMSPP_FILE_DETAILS; - typedef struct + typedef struct { int iCount; PTMSPP_FILE_DETAILS FileDetailsA; } TMSPP_FILE_LIST, *PTMSPP_FILE_LIST; - typedef struct + typedef struct { DWORD dwSize; PBYTE pbData; @@ -241,7 +241,7 @@ public: PVOID AllocateSaveData(unsigned int uiBytes); void SaveSaveData(unsigned int uiBytes,PBYTE pbThumbnail=NULL,DWORD cbThumbnail=0,PBYTE pbTextData=NULL, DWORD dwTextLen=0); void CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam); - void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected); + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected); bool GetSaveDeviceSelected(unsigned int iPad); C4JStorage::ELoadGameStatus DoesSaveExist(bool *pbExists); bool EnoughSpaceForAMinSaveGame(); @@ -260,13 +260,13 @@ public: // DLC void RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam ); void SetDLCPackageRoot(char *pszDLCRoot); - C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmask=XMARKETPLACE_OFFERING_TYPE_CONTENT); + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmask=XMARKETPLACE_OFFERING_TYPE_CONTENT); DWORD CancelGetDLCOffers(); void ClearDLCOffers(); //XMARKETPLACE_CONTENTOFFER_INFO& GetOffer(DWORD dw); XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO& GetOffer(DWORD dw); int GetOfferCount(); - DWORD InstallOffer(int iOfferIDC,uint64_t *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false); + DWORD InstallOffer(int iOfferIDC,unsigned __int64 *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial=false); DWORD GetAvailableDLCCount( int iPad); C4JStorage::EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); @@ -297,7 +297,7 @@ public: HRESULT TMSPP_SetTitleGroupID(LPCSTR szGroupID); // #ifdef _DEBUG -// void SetSaveName(int i); +// void SetSaveName(int i); // #endif // string table for all the Storage problems. Loaded by the application CXuiStringTable *m_pStringTable; diff --git a/Minecraft.Client/Xbox/Sentient/Include/SenClientUGCTypes.h b/Minecraft.Client/Xbox/Sentient/Include/SenClientUGCTypes.h index 12876ea8..6d1056ff 100644 --- a/Minecraft.Client/Xbox/Sentient/Include/SenClientUGCTypes.h +++ b/Minecraft.Client/Xbox/Sentient/Include/SenClientUGCTypes.h @@ -43,7 +43,7 @@ namespace Sentient }; typedef unsigned int SenUGCMetaDataFlags; - enum + enum { SenUGCMetaDataFlags_NoFlags = 0x00000000, SenUGCMetaDataFlags_FriendsCanEdit = 0x00000001, @@ -66,7 +66,7 @@ namespace Sentient #pragma warning ( disable : 4996 ) // @TODO - Removed once Int16 Descriptors are deprecated memset(descriptors, 0, sizeof(SenUGCDescriptor) * NrUgcDescriptors); #pragma warning ( default : 4996 ) - memset(descriptors2, 0, sizeof(int64_t) * NrUgcDescriptors); + memset(descriptors2, 0, sizeof(__int64) * NrUgcDescriptors); } SenUGCID parentID; @@ -80,10 +80,10 @@ namespace Sentient wchar_t shortName[ShortNameLength]; static const int NrUgcDescriptors = 4; - + __declspec(deprecated("Descriptors have increased in size (from Int16 to Int64). Please Use descriptors2 instead")) SenUGCDescriptor descriptors[NrUgcDescriptors]; - int64_t descriptors2[NrUgcDescriptors]; + __int64 descriptors2[NrUgcDescriptors]; static const int BlobSizeLimit = 1024; size_t metaDataBlobSize; @@ -160,10 +160,10 @@ namespace Sentient enum SenUGCSortBy { - SenUGCSortBy_CreationDate, - SenUGCSortBy_TopFavorites, - SenUGCSortBy_TopReviewScoreAverage, - SenUGCSortBy_TopDownloadsTotal + SenUGCSortBy_CreationDate, + SenUGCSortBy_TopFavorites, + SenUGCSortBy_TopReviewScoreAverage, + SenUGCSortBy_TopDownloadsTotal }; enum SenUGCAuthorType @@ -211,7 +211,7 @@ namespace Sentient }; // ***** Leaderboard types - typedef int64_t SenLeaderboardEntryValue; + typedef __int64 SenLeaderboardEntryValue; typedef ULONGLONG SenLeaderboardActorId; enum SenLeaderboardSortType @@ -224,7 +224,7 @@ namespace Sentient /// @brief Leaderboard Metadata retrieval flag. /// /// @details When retrieving Leaderboard information, a client can choose - /// to bypass retrieval or retrieve specific details regarding the + /// to bypass retrieval or retrieve specific details regarding the /// Metadata stored for a given Leaderboard or Leaderboard Entry. /// enum SenLeaderboardMetadataFlag diff --git a/Minecraft.Client/Xbox/XML/ATGXmlParser.cpp b/Minecraft.Client/Xbox/XML/ATGXmlParser.cpp index cfa92064..5366e721 100644 --- a/Minecraft.Client/Xbox/XML/ATGXmlParser.cpp +++ b/Minecraft.Client/Xbox/XML/ATGXmlParser.cpp @@ -1,13 +1,13 @@ -// 4J-PB - -// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG). -// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples. -// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples. -// You are encouraged to incorporate this code into your titles. +// 4J-PB - +// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG). +// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples. +// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples. +// You are encouraged to incorporate this code into your titles. //------------------------------------------------------------------------------------- // AtgXmlParser.cpp -// +// // Simple callback non-validating XML parser implementation. // // Xbox Advanced Technology Group. @@ -35,7 +35,7 @@ XMLParser::XMLParser() // Name: XMLParser::~XMLParser //------------------------------------------------------------------------------------- XMLParser::~XMLParser() -{ +{ } @@ -51,11 +51,11 @@ VOID XMLParser::FillBuffer() if( m_hFile == NULL ) { - if( m_uInXMLBufferCharsLeft > XML_READ_BUFFER_SIZE ) + if( m_uInXMLBufferCharsLeft > XML_READ_BUFFER_SIZE ) NChars = XML_READ_BUFFER_SIZE; else NChars = m_uInXMLBufferCharsLeft; - + CopyMemory( m_pReadBuf, m_pInXMLBuffer, NChars ); m_uInXMLBufferCharsLeft -= NChars; m_pInXMLBuffer += NChars; @@ -69,7 +69,7 @@ VOID XMLParser::FillBuffer() } m_dwCharsConsumed += NChars; - int64_t iProgress = m_dwCharsTotal ? (( (int64_t)m_dwCharsConsumed * 1000 ) / (int64_t)m_dwCharsTotal) : 0; + __int64 iProgress = m_dwCharsTotal ? (( (__int64)m_dwCharsConsumed * 1000 ) / (__int64)m_dwCharsTotal) : 0; m_pISAXCallback->SetParseProgress( (DWORD)iProgress ); m_pReadBuf[ NChars ] = '\0'; @@ -89,7 +89,7 @@ VOID XMLParser::SkipNextAdvance() //------------------------------------------------------------------------------------- // Name: XMLParser::ConsumeSpace -// Desc: Skips spaces in the current stream +// Desc: Skips spaces in the current stream //------------------------------------------------------------------------------------- HRESULT XMLParser::ConsumeSpace() { @@ -104,29 +104,29 @@ HRESULT XMLParser::ConsumeSpace() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - } - SkipNextAdvance(); + } + SkipNextAdvance(); return S_OK; } //------------------------------------------------------------------------------------- // Name: XMLParser::ConvertEscape -// Desc: Copies and converts an escape sequence into m_pWriteBuf +// Desc: Copies and converts an escape sequence into m_pWriteBuf //------------------------------------------------------------------------------------- HRESULT XMLParser::ConvertEscape() -{ +{ HRESULT hr; WCHAR wVal = 0; - + if( FAILED( hr = AdvanceCharacter() ) ) return hr; - // all escape sequences start with &, so ignore the first character - + // all escape sequences start with &, so ignore the first character + if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + if ( m_Ch == '#' ) // character as hex or decimal { if( FAILED( hr = AdvanceCharacter() ) ) @@ -135,9 +135,9 @@ HRESULT XMLParser::ConvertEscape() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + while ( m_Ch != ';' ) - { + { wVal *= 16; if ( ( m_Ch >= '0' ) && ( m_Ch <= '9' ) ) @@ -151,11 +151,11 @@ HRESULT XMLParser::ConvertEscape() else if ( ( m_Ch >= 'A' ) && ( m_Ch <= 'F' ) ) { wVal += m_Ch - 'A' + 10; - } + } else { - Error( E_INVALID_XML_SYNTAX, "Expected hex digit as part of &#x escape sequence" ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Expected hex digit as part of &#x escape sequence" ); + return E_INVALID_XML_SYNTAX; } if( FAILED( hr = AdvanceCharacter() ) ) @@ -165,7 +165,7 @@ HRESULT XMLParser::ConvertEscape() else // decimal number { while ( m_Ch != ';' ) - { + { wVal *= 10; if ( ( m_Ch >= '0' ) && ( m_Ch <= '9' ) ) @@ -174,7 +174,7 @@ HRESULT XMLParser::ConvertEscape() } else { - Error( E_INVALID_XML_SYNTAX, "Expected decimal digit as part of &# escape sequence" ); + Error( E_INVALID_XML_SYNTAX, "Expected decimal digit as part of &# escape sequence" ); return E_INVALID_XML_SYNTAX; } @@ -187,7 +187,7 @@ HRESULT XMLParser::ConvertEscape() m_Ch = wVal; return S_OK; - } + } // must be an entity reference @@ -197,13 +197,13 @@ HRESULT XMLParser::ConvertEscape() SkipNextAdvance(); if( FAILED( hr = AdvanceName() ) ) return hr; - + EntityRefLen = (UINT)( m_pWritePtr - pEntityRefVal ); m_pWritePtr = pEntityRefVal; if ( EntityRefLen == 0 ) { - Error( E_INVALID_XML_SYNTAX, "Expecting entity name after &" ); + Error( E_INVALID_XML_SYNTAX, "Expecting entity name after &" ); return E_INVALID_XML_SYNTAX; } @@ -219,7 +219,7 @@ HRESULT XMLParser::ConvertEscape() wVal = '"'; else { - Error( E_INVALID_XML_SYNTAX, "Unrecognized entity name after & - (should be lt, gt, amp, apos, or quot)" ); + Error( E_INVALID_XML_SYNTAX, "Unrecognized entity name after & - (should be lt, gt, amp, apos, or quot)" ); return E_INVALID_XML_SYNTAX; // return false if unrecognized token sequence } @@ -228,10 +228,10 @@ HRESULT XMLParser::ConvertEscape() if( m_Ch != ';' ) { - Error( E_INVALID_XML_SYNTAX, "Expected terminating ; for entity reference" ); + Error( E_INVALID_XML_SYNTAX, "Expected terminating ; for entity reference" ); return E_INVALID_XML_SYNTAX; // malformed reference - needs terminating ; } - + m_Ch = wVal; return S_OK; } @@ -250,41 +250,41 @@ HRESULT XMLParser::AdvanceAttrVal() return hr; if( ( m_Ch != '"' ) && ( m_Ch != '\'' ) ) - { - Error( E_INVALID_XML_SYNTAX, "Attribute values must be enclosed in quotes" ); + { + Error( E_INVALID_XML_SYNTAX, "Attribute values must be enclosed in quotes" ); return E_INVALID_XML_SYNTAX; } wQuoteChar = m_Ch; - + for( ;; ) { if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - else if( m_Ch == wQuoteChar ) - break; + return hr; + else if( m_Ch == wQuoteChar ) + break; else if( m_Ch == '&' ) { SkipNextAdvance(); if( FAILED( hr = ConvertEscape() ) ) - return hr; + return hr; } - else if( m_Ch == '<' ) + else if( m_Ch == '<' ) { - Error( E_INVALID_XML_SYNTAX, "Illegal character '<' in element tag" ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Illegal character '<' in element tag" ); + return E_INVALID_XML_SYNTAX; } - + // copy character into the buffer - - if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) + + if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) { - Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); + return E_INVALID_XML_SYNTAX; } - + *m_pWritePtr = m_Ch; - m_pWritePtr++; + m_pWritePtr++; } return S_OK; } @@ -296,18 +296,18 @@ HRESULT XMLParser::AdvanceAttrVal() // Ignores leading whitespace. Currently does not support unicode names //------------------------------------------------------------------------------------- HRESULT XMLParser::AdvanceName() -{ +{ HRESULT hr; if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; if( ( ( m_Ch < 'A' ) || ( m_Ch > 'Z' ) ) && ( ( m_Ch < 'a' ) || ( m_Ch > 'z' ) ) && ( m_Ch != '_' ) && ( m_Ch != ':' ) ) { - Error( E_INVALID_XML_SYNTAX, "Names must start with an alphabetic character or _ or :" ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Names must start with an alphabetic character or _ or :" ); + return E_INVALID_XML_SYNTAX; } while( ( ( m_Ch >= 'A' ) && ( m_Ch <= 'Z' ) ) || @@ -319,17 +319,17 @@ HRESULT XMLParser::AdvanceName() if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) { - Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); + Error( E_INVALID_XML_SYNTAX, "Total element tag size may not be more than %d characters", XML_WRITE_BUFFER_SIZE ); return E_INVALID_XML_SYNTAX; - } + } *m_pWritePtr = m_Ch; m_pWritePtr++; if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; } - + SkipNextAdvance(); return S_OK; } @@ -343,7 +343,7 @@ HRESULT XMLParser::AdvanceName() // Returns S_OK if there are more characters, E_ABORT for no characters to read //------------------------------------------------------------------------------------- HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) -{ +{ if( m_bSkipNextAdvance ) { m_bSkipNextAdvance = FALSE; @@ -351,20 +351,20 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) } // If we hit EOF in the middle of a character, - // it's ok-- we'll just have a corrupt last character + // it's ok-- we'll just have a corrupt last character // (the buffer is padded with double NULLs ) if ( ( m_pReadPtr[0] == '\0' ) && ( m_pReadPtr[1] == '\0' ) ) { // Read more from the file - FillBuffer(); + FillBuffer(); // We are at EOF if it is still NULL if ( ( m_pReadPtr[0] == '\0' ) && ( m_pReadPtr[1] == '\0' ) ) { if( !bOkToFail ) { - Error( E_INVALID_XML_SYNTAX, "Unexpected EOF while parsing XML file" ); + Error( E_INVALID_XML_SYNTAX, "Unexpected EOF while parsing XML file" ); return E_INVALID_XML_SYNTAX; } else @@ -372,7 +372,7 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) return E_FAIL; } } - } + } if( m_bUnicode == FALSE ) { @@ -382,13 +382,13 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) else // if( m_bUnicode == TRUE ) { m_Ch = *((WCHAR *)m_pReadPtr); - + if( m_bReverseBytes ) { m_Ch = ( m_Ch << 8 ) + ( m_Ch >> 8 ); } - - m_pReadPtr += 2; + + m_pReadPtr += 2; } if( m_Ch == '\n' ) @@ -398,114 +398,114 @@ HRESULT XMLParser::AdvanceCharacter( BOOL bOkToFail ) } else if( m_Ch != '\r' ) m_pISAXCallback->m_LinePos++; - + return S_OK; } //------------------------------------------------------------------------------------- // Name: XMLParser::AdvanceElement -// Desc: Builds data, calls callback +// Desc: Builds data, calls callback //------------------------------------------------------------------------------------- HRESULT XMLParser::AdvanceElement() -{ +{ HRESULT hr; // write ptr at the beginning of the buffer m_pWritePtr = m_pWriteBuf; - + if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - + return hr; + // if first character wasn't '<', we wouldn't be here - + if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; if( m_Ch == '!' ) { - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; if ( m_Ch == '-' ) { - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - if( m_Ch != '-' ) + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; + if( m_Ch != '-' ) { Error( E_INVALID_XML_SYNTAX, "Expecting '-' after 'ElementEnd( pEntityRefVal, + if( FAILED( m_pISAXCallback->ElementEnd( pEntityRefVal, (UINT) ( m_pWritePtr - pEntityRefVal ) ) ) ) return E_ABORT; - - if( FAILED( hr = ConsumeSpace() ) ) + + if( FAILED( hr = ConsumeSpace() ) ) return hr; - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; if( m_Ch != '>' ) { @@ -513,42 +513,42 @@ HRESULT XMLParser::AdvanceElement() return E_INVALID_XML_SYNTAX; } } - else if( m_Ch == '?' ) + else if( m_Ch == '?' ) { // just skip any xml header tag since not really important after identifying character set for( ;; ) { - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; + if ( m_Ch == '>' ) return S_OK; } } else { - XMLAttribute Attributes[ XML_MAX_ATTRIBUTES_PER_ELEMENT ]; + XMLAttribute Attributes[ XML_MAX_ATTRIBUTES_PER_ELEMENT ]; UINT NumAttrs; WCHAR *pEntityRefVal = m_pWritePtr; UINT EntityRefLen; NumAttrs = 0; - + SkipNextAdvance(); // Entity tag - if( FAILED( hr = AdvanceName() ) ) + if( FAILED( hr = AdvanceName() ) ) return hr; EntityRefLen = (UINT)( m_pWritePtr - pEntityRefVal ); - if( FAILED( hr = ConsumeSpace() ) ) + if( FAILED( hr = ConsumeSpace() ) ) return hr; - + if( FAILED( hr = AdvanceCharacter() ) ) - return hr; - + return hr; + // read attributes while( ( m_Ch != '>' ) && ( m_Ch != '/' ) ) { @@ -556,31 +556,31 @@ HRESULT XMLParser::AdvanceElement() if ( NumAttrs >= XML_MAX_ATTRIBUTES_PER_ELEMENT ) { - Error( E_INVALID_XML_SYNTAX, "Elements may not have more than %d attributes", XML_MAX_ATTRIBUTES_PER_ELEMENT ); - return E_INVALID_XML_SYNTAX; + Error( E_INVALID_XML_SYNTAX, "Elements may not have more than %d attributes", XML_MAX_ATTRIBUTES_PER_ELEMENT ); + return E_INVALID_XML_SYNTAX; } Attributes[ NumAttrs ].strName = m_pWritePtr; - + // Attribute name if( FAILED( hr = AdvanceName() ) ) return hr; - + Attributes[ NumAttrs ].NameLen = (UINT)( m_pWritePtr - Attributes[ NumAttrs ].strName ); if( FAILED( hr = ConsumeSpace() ) ) return hr; - if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + if( FAILED( hr = AdvanceCharacter() ) ) + return hr; - if( m_Ch != '=' ) + if( m_Ch != '=' ) { Error( E_INVALID_XML_SYNTAX, "Expecting '=' character after attribute name" ); return E_INVALID_XML_SYNTAX; } - - if( FAILED( hr = ConsumeSpace() ) ) + + if( FAILED( hr = ConsumeSpace() ) ) return hr; Attributes[ NumAttrs ].strValue = m_pWritePtr; @@ -588,29 +588,29 @@ HRESULT XMLParser::AdvanceElement() if( FAILED( hr = AdvanceAttrVal() ) ) return hr; - Attributes[ NumAttrs ].ValueLen = (UINT)( m_pWritePtr - + Attributes[ NumAttrs ].ValueLen = (UINT)( m_pWritePtr - Attributes[ NumAttrs ].strValue ); ++NumAttrs; - + if( FAILED( hr = ConsumeSpace() ) ) - return hr; + return hr; if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; } if( m_Ch == '/' ) { if( FAILED( hr = AdvanceCharacter() ) ) - return hr; + return hr; if( m_Ch != '>' ) { Error( E_INVALID_XML_SYNTAX, "Expecting '>' after '/' in element tag" ); return E_INVALID_XML_SYNTAX; } - if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, + if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, Attributes, NumAttrs ) ) ) return E_ABORT; @@ -619,7 +619,7 @@ HRESULT XMLParser::AdvanceElement() } else { - if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, + if( FAILED( m_pISAXCallback->ElementBegin( pEntityRefVal, EntityRefLen, Attributes, NumAttrs ) ) ) return E_ABORT; } @@ -637,7 +637,7 @@ HRESULT XMLParser::AdvanceCDATA() { HRESULT hr; WORD wStage = 0; - + if( FAILED( m_pISAXCallback->CDATABegin() ) ) return E_ABORT; @@ -645,10 +645,10 @@ HRESULT XMLParser::AdvanceCDATA() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + *m_pWritePtr = m_Ch; m_pWritePtr++; - + if( ( m_Ch == ']' ) && ( wStage == 0 ) ) wStage = 1; else if( ( m_Ch == ']' ) && ( wStage == 1 ) ) @@ -666,9 +666,9 @@ HRESULT XMLParser::AdvanceCDATA() if( FAILED( m_pISAXCallback->CDATAData( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), TRUE ) ) ) return E_ABORT; m_pWritePtr = m_pWriteBuf; - } + } } - + if( FAILED( m_pISAXCallback->CDATAData( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) return E_ABORT; @@ -676,7 +676,7 @@ HRESULT XMLParser::AdvanceCDATA() if( FAILED( m_pISAXCallback->CDATAEnd() ) ) return E_ABORT; - + return S_OK; } @@ -694,24 +694,24 @@ HRESULT XMLParser::AdvanceComment() { if( FAILED( hr = AdvanceCharacter() ) ) return hr; - + if (( m_Ch == '-' ) && ( wStage == 0 )) wStage = 1; else if (( m_Ch == '-' ) && ( wStage == 1 )) wStage = 2; - else if (( m_Ch == '>' ) && ( wStage == 2 )) - break; + else if (( m_Ch == '>' ) && ( wStage == 2 )) + break; else - wStage = 0; + wStage = 0; } - + return S_OK; } //------------------------------------------------------------------------------------- // Name: XMLParser::RegisterSAXCallbackInterface -// Desc: Registers callback interface +// Desc: Registers callback interface //------------------------------------------------------------------------------------- VOID XMLParser::RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ) { @@ -721,7 +721,7 @@ VOID XMLParser::RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ) //------------------------------------------------------------------------------------- // Name: XMLParser::GetSAXCallbackInterface -// Desc: Returns current callback interface +// Desc: Returns current callback interface //------------------------------------------------------------------------------------- ISAXCallback* XMLParser::GetSAXCallbackInterface() { @@ -740,7 +740,7 @@ HRESULT XMLParser::MainParseLoop() if( FAILED( m_pISAXCallback->StartDocument() ) ) return E_ABORT; - + m_pWritePtr = m_pWriteBuf; FillBuffer(); @@ -751,57 +751,57 @@ HRESULT XMLParser::MainParseLoop() m_bReverseBytes = FALSE; m_pReadPtr += 2; } - else if ( *((WCHAR *) m_pReadBuf ) == 0xFFFE ) + else if ( *((WCHAR *) m_pReadBuf ) == 0xFFFE ) { m_bUnicode = TRUE; m_bReverseBytes = TRUE; - m_pReadPtr += 2; + m_pReadPtr += 2; } - else if ( *((WCHAR *) m_pReadBuf ) == 0x003C ) + else if ( *((WCHAR *) m_pReadBuf ) == 0x003C ) { - m_bUnicode = TRUE; + m_bUnicode = TRUE; m_bReverseBytes = FALSE; } - else if ( *((WCHAR *) m_pReadBuf ) == 0x3C00 ) + else if ( *((WCHAR *) m_pReadBuf ) == 0x3C00 ) { m_bUnicode = TRUE; - m_bReverseBytes = TRUE; + m_bReverseBytes = TRUE; } else if ( m_pReadBuf[ 0 ] == 0x3C ) { - m_bUnicode = FALSE; - m_bReverseBytes = FALSE; + m_bUnicode = FALSE; + m_bReverseBytes = FALSE; } else - { + { Error( E_INVALID_XML_SYNTAX, "Unrecognized encoding (parser does not support UTF-8 language encodings)" ); - return E_INVALID_XML_SYNTAX; + return E_INVALID_XML_SYNTAX; } - + for( ;; ) { if( FAILED( AdvanceCharacter( TRUE ) ) ) { if ( ( (UINT) ( m_pWritePtr - m_pWriteBuf ) != 0 ) && ( !bWhiteSpaceOnly ) ) - { - if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) - return E_ABORT; + { + if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) + return E_ABORT; bWhiteSpaceOnly = TRUE; } - + if( FAILED( m_pISAXCallback->EndDocument() ) ) return E_ABORT; - - return S_OK; + + return S_OK; } if( m_Ch == '<' ) { if( ( (UINT) ( m_pWritePtr - m_pWriteBuf ) != 0 ) && ( !bWhiteSpaceOnly ) ) - { - if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) - return E_ABORT; + { + if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, (UINT)( m_pWritePtr - m_pWriteBuf ), FALSE ) ) ) + return E_ABORT; bWhiteSpaceOnly = TRUE; } @@ -810,45 +810,45 @@ HRESULT XMLParser::MainParseLoop() m_pWritePtr = m_pWriteBuf; - if( FAILED( hr = AdvanceElement() ) ) - return hr; + if( FAILED( hr = AdvanceElement() ) ) + return hr; m_pWritePtr = m_pWriteBuf; } - else + else { if( m_Ch == '&' ) { SkipNextAdvance(); - if( FAILED( hr = ConvertEscape() ) ) - return hr; + if( FAILED( hr = ConvertEscape() ) ) + return hr; } - if( bWhiteSpaceOnly && ( m_Ch != ' ' ) && ( m_Ch != '\n' ) && ( m_Ch != '\r' ) && - ( m_Ch != '\t' ) ) + if( bWhiteSpaceOnly && ( m_Ch != ' ' ) && ( m_Ch != '\n' ) && ( m_Ch != '\r' ) && + ( m_Ch != '\t' ) ) { bWhiteSpaceOnly = FALSE; } *m_pWritePtr = m_Ch; m_pWritePtr++; - + if( m_pWritePtr - m_pWriteBuf >= XML_WRITE_BUFFER_SIZE ) { if( !bWhiteSpaceOnly ) - { - if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, - ( UINT ) ( m_pWritePtr - m_pWriteBuf ), + { + if( FAILED( m_pISAXCallback->ElementContent( m_pWriteBuf, + ( UINT ) ( m_pWritePtr - m_pWriteBuf ), TRUE ) ) ) { - return E_ABORT; + return E_ABORT; } } m_pWritePtr = m_pWriteBuf; bWhiteSpaceOnly = TRUE; } - } + } } } @@ -858,31 +858,31 @@ HRESULT XMLParser::MainParseLoop() // Desc: Builds element data //------------------------------------------------------------------------------------- HRESULT XMLParser::ParseXMLFile( CONST CHAR *strFilename ) -{ +{ HRESULT hr; if( m_pISAXCallback == NULL ) return E_NOINTERFACE; - m_pISAXCallback->m_LineNum = 1; + m_pISAXCallback->m_LineNum = 1; m_pISAXCallback->m_LinePos = 0; m_pISAXCallback->m_strFilename = strFilename; // save this off only while we parse the file m_bSkipNextAdvance = FALSE; - m_pReadPtr = m_pReadBuf; - + m_pReadPtr = m_pReadBuf; + m_pReadBuf[ 0 ] = '\0'; - m_pReadBuf[ 1 ] = '\0'; - + m_pReadBuf[ 1 ] = '\0'; + m_pInXMLBuffer = NULL; m_uInXMLBufferCharsLeft = 0; - m_hFile = CreateFile( strFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + m_hFile = CreateFile( strFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); if( m_hFile == INVALID_HANDLE_VALUE ) - { + { Error( E_COULD_NOT_OPEN_FILE, "Error opening file" ); hr = E_COULD_NOT_OPEN_FILE; - + } else { @@ -892,14 +892,14 @@ HRESULT XMLParser::ParseXMLFile( CONST CHAR *strFilename ) m_dwCharsConsumed = 0; hr = MainParseLoop(); } - + // Close the file if( m_hFile != INVALID_HANDLE_VALUE ) CloseHandle( m_hFile ); m_hFile = INVALID_HANDLE_VALUE; // we no longer own strFilename, so un-set it - m_pISAXCallback->m_strFilename = NULL; + m_pISAXCallback->m_strFilename = NULL; return hr; } @@ -909,38 +909,38 @@ HRESULT XMLParser::ParseXMLFile( CONST CHAR *strFilename ) // Desc: Builds element data //------------------------------------------------------------------------------------- HRESULT XMLParser::ParseXMLBuffer( CONST CHAR *strBuffer, UINT uBufferSize ) -{ +{ HRESULT hr; - + if( m_pISAXCallback == NULL ) return E_NOINTERFACE; - m_pISAXCallback->m_LineNum = 1; + m_pISAXCallback->m_LineNum = 1; m_pISAXCallback->m_LinePos = 0; m_pISAXCallback->m_strFilename = ""; // save this off only while we parse the file m_bSkipNextAdvance = FALSE; m_pReadPtr = m_pReadBuf; - + m_pReadBuf[ 0 ] = '\0'; - m_pReadBuf[ 1 ] = '\0'; + m_pReadBuf[ 1 ] = '\0'; m_hFile = NULL; m_pInXMLBuffer = strBuffer; m_uInXMLBufferCharsLeft = uBufferSize; m_dwCharsTotal = uBufferSize; m_dwCharsConsumed = 0; - + hr = MainParseLoop(); // we no longer own strFilename, so un-set it - m_pISAXCallback->m_strFilename = NULL; + m_pISAXCallback->m_strFilename = NULL; return hr; } //------------------------------------------------------------------------------------- -// XMLParser::Error() +// XMLParser::Error() // Logs an error through the callback interface //------------------------------------------------------------------------------------- #ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation @@ -955,7 +955,7 @@ VOID XMLParser::Error( HRESULT hErr, CONST CHAR* strFormat, ... ) va_start( pArglist, strFormat ); vsprintf( strBuffer, strFormat, pArglist ); - + m_pISAXCallback->Error( hErr, strBuffer ); va_end( pArglist ); } diff --git a/Minecraft.Client/stdafx.h b/Minecraft.Client/stdafx.h index 06802d4a..05b17e81 100644 --- a/Minecraft.Client/stdafx.h +++ b/Minecraft.Client/stdafx.h @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include #include "PSVitaTypes.h" #include "PSVitaStubs.h" @@ -59,7 +59,7 @@ #include #include #include -#include +typedef unsigned __int64 __uint64; #endif #ifdef _WINDOWS64 @@ -72,7 +72,7 @@ // TODO: reference additional headers your program requires here #include #include -using namespace DirectX; +using namespace DirectX; #define HRESULT_SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) @@ -87,7 +87,7 @@ using namespace DirectX; #include #include #include -using namespace DirectX; +using namespace DirectX; #include #include "DurangoStubs.h" #define HRESULT_SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) @@ -182,12 +182,12 @@ typedef XUID GameSessionUID; #include "Windows64\4JLibs\inc\4J_Storage.h" #include "Windows64\KeyboardMouseInput.h" #elif defined __PSVITA__ - #include "PSVita\4JLibs\inc\4J_Input.h" + #include "PSVita\4JLibs\inc\4J_Input.h" #include "PSVita\4JLibs\inc\4J_Profile.h" #include "PSVita\4JLibs\inc\4J_Render.h" #include "PSVita\4JLibs\inc\4J_Storage.h" #else - #include "Orbis\4JLibs\inc\4J_Input.h" + #include "Orbis\4JLibs\inc\4J_Input.h" #include "Orbis\4JLibs\inc\4J_Profile.h" #include "Orbis\4JLibs\inc\4J_Render.h" #include "Orbis\4JLibs\inc\4J_Storage.h" @@ -258,7 +258,7 @@ typedef XUID GameSessionUID; #include "Durango\Sentient\MinecraftTelemetry.h" #include "DurangoMedia\strings.h" #include "Durango\Durango_App.h" - #include "Durango\Sentient\DynamicConfigurations.h" + #include "Durango\Sentient\DynamicConfigurations.h" #include "Durango\Sentient\TelemetryEnum.h" #include "Durango\Sentient\SentientTelemetryCommon.h" #include "Durango\PresenceIds.h" @@ -276,7 +276,7 @@ typedef XUID GameSessionUID; #include "Windows64\Sentient\DynamicConfigurations.h" #include "Windows64\Sentient\SentientTelemetryCommon.h" #include "Windows64\GameConfig\Minecraft.spa.h" - #include "Windows64\XML\ATGXmlParser.h" + #include "Windows64\XML\ATGXmlParser.h" #include "Windows64\Social\SocialManager.h" #include "Common\Audio\SoundEngine.h" #include "Windows64\Iggy\include\iggy.h" @@ -303,7 +303,7 @@ typedef XUID GameSessionUID; #include "Orbis\Sentient\DynamicConfigurations.h" #include "Orbis\GameConfig\Minecraft.spa.h" #include "OrbisMedia\4J_strings.h" - #include "Orbis\XML\ATGXmlParser.h" + #include "Orbis\XML\ATGXmlParser.h" #include "Windows64\Social\SocialManager.h" #include "Common\Audio\SoundEngine.h" #include "Orbis\Iggy\include\iggy.h" diff --git a/Minecraft.World/AddIslandLayer.cpp b/Minecraft.World/AddIslandLayer.cpp index a8842936..21e9a96d 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, shared_ptrparent) : Layer(seedMixup) +AddIslandLayer::AddIslandLayer(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/AddIslandLayer.h b/Minecraft.World/AddIslandLayer.h index 2446bbf8..e7c9384b 100644 --- a/Minecraft.World/AddIslandLayer.h +++ b/Minecraft.World/AddIslandLayer.h @@ -5,7 +5,7 @@ class AddIslandLayer : public Layer { public: - AddIslandLayer(int64_t seedMixup, shared_ptrparent); + AddIslandLayer(__int64 seedMixup, shared_ptrparent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/AddMushroomIslandLayer.cpp b/Minecraft.World/AddMushroomIslandLayer.cpp index 324c88ee..022a3b29 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, shared_ptr parent) : Layer(seedMixup) +AddMushroomIslandLayer::AddMushroomIslandLayer(__int64 seedMixup, shared_ptr parent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/AddMushroomIslandLayer.h b/Minecraft.World/AddMushroomIslandLayer.h index f691ebda..acda9fa7 100644 --- a/Minecraft.World/AddMushroomIslandLayer.h +++ b/Minecraft.World/AddMushroomIslandLayer.h @@ -4,6 +4,6 @@ class AddMushroomIslandLayer : public Layer { public: - AddMushroomIslandLayer(int64_t seedMixup, shared_ptr parent); + AddMushroomIslandLayer(__int64 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/AddSnowLayer.cpp b/Minecraft.World/AddSnowLayer.cpp index aa459789..d8a33cc9 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, shared_ptr parent) : Layer(seedMixup) +AddSnowLayer::AddSnowLayer(__int64 seedMixup, shared_ptr parent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/AddSnowLayer.h b/Minecraft.World/AddSnowLayer.h index 0b3702da..ede7a226 100644 --- a/Minecraft.World/AddSnowLayer.h +++ b/Minecraft.World/AddSnowLayer.h @@ -4,6 +4,6 @@ class AddSnowLayer : public Layer { public: - AddSnowLayer(int64_t seedMixup, shared_ptr parent); + AddSnowLayer(__int64 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/BasicTree.cpp b/Minecraft.World/BasicTree.cpp index c1c92287..01f10cb3 100644 --- a/Minecraft.World/BasicTree.cpp +++ b/Minecraft.World/BasicTree.cpp @@ -524,7 +524,7 @@ bool BasicTree::place(Level *level, Random *random, int x, int y, int z) // Initialize the instance fields for the level and the seed. thisLevel = level; - int64_t seed = random->nextLong(); + __int64 seed = random->nextLong(); rnd->setSeed(seed); // Initialize the origin of the tree trunk origin[0] = x; diff --git a/Minecraft.World/BasicTypeContainers.h b/Minecraft.World/BasicTypeContainers.h index 8a139e3e..094e9616 100644 --- a/Minecraft.World/BasicTypeContainers.h +++ b/Minecraft.World/BasicTypeContainers.h @@ -57,14 +57,14 @@ public: } static bool isInfinite( double a ) { return false; /*4J TODO*/ } - static double longBitsToDouble( int64_t bits ) + static double longBitsToDouble( __int64 bits ) { return *(double *)&bits; } - static int64_t doubleToLongBits( double d ) + static __int64 doubleToLongBits( double d ) { - return *(int64_t *)&d; + return *(__int64 *)&d; } }; diff --git a/Minecraft.World/BiomeCache.cpp b/Minecraft.World/BiomeCache.cpp index 3ef4f0f6..0d9c017c 100644 --- a/Minecraft.World/BiomeCache.cpp +++ b/Minecraft.World/BiomeCache.cpp @@ -85,7 +85,7 @@ BiomeCache::Block *BiomeCache::getBlockAt(int x, int z) EnterCriticalSection(&m_CS); x >>= ZONE_SIZE_BITS; z >>= ZONE_SIZE_BITS; - int64_t slot = (((int64_t) x) & 0xffffffffl) | ((((int64_t) z) & 0xffffffffl) << 32l); + __int64 slot = (((__int64) x) & 0xffffffffl) | ((((__int64) z) & 0xffffffffl) << 32l); AUTO_VAR(it, cached.find(slot)); Block *block = NULL; if (it == cached.end()) @@ -124,8 +124,8 @@ float BiomeCache::getDownfall(int x, int z) void BiomeCache::update() { EnterCriticalSection(&m_CS); - int64_t now = app.getAppTime(); - int64_t utime = now - lastUpdateTime; + __int64 now = app.getAppTime(); + __int64 utime = now - lastUpdateTime; if (utime > DECAY_TIME / 4 || utime < 0) { lastUpdateTime = now; @@ -133,11 +133,11 @@ void BiomeCache::update() for (AUTO_VAR(it, all.begin()); it != all.end();) { Block *block = *it; - int64_t time = now - block->lastUse; + __int64 time = now - block->lastUse; if (time > DECAY_TIME || time < 0) { it = all.erase(it); - int64_t slot = (((int64_t) block->x) & 0xffffffffl) | ((((int64_t) block->z) & 0xffffffffl) << 32l); + __int64 slot = (((__int64) block->x) & 0xffffffffl) | ((((__int64) block->z) & 0xffffffffl) << 32l); cached.erase(slot); delete block; } diff --git a/Minecraft.World/BiomeCache.h b/Minecraft.World/BiomeCache.h index b2593ce3..bf509f54 100644 --- a/Minecraft.World/BiomeCache.h +++ b/Minecraft.World/BiomeCache.h @@ -10,7 +10,7 @@ private: static const int ZONE_SIZE_MASK = ZONE_SIZE - 1; const BiomeSource *source; - int64_t lastUpdateTime; + __int64 lastUpdateTime; public: class Block @@ -22,7 +22,7 @@ public: // BiomeArray biomes; byteArray biomeIndices; int x, z; - int64_t lastUse; + __int64 lastUse; Block(int x, int z, BiomeCache *parent); ~Block(); @@ -32,7 +32,7 @@ public: }; private: - unordered_map cached; // 4J - was LongHashMap + unordered_map<__int64,Block *,LongKeyHash,LongKeyEq> cached; // 4J - was LongHashMap vector all; // was ArrayList public: diff --git a/Minecraft.World/BiomeInitLayer.cpp b/Minecraft.World/BiomeInitLayer.cpp index 6edd18de..ead63eee 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, shared_ptrparent, LevelType *levelType) : Layer(seed) +BiomeInitLayer::BiomeInitLayer(__int64 seed, shared_ptrparent, LevelType *levelType) : Layer(seed) { this->parent = parent; diff --git a/Minecraft.World/BiomeInitLayer.h b/Minecraft.World/BiomeInitLayer.h index 00bf3812..e645a379 100644 --- a/Minecraft.World/BiomeInitLayer.h +++ b/Minecraft.World/BiomeInitLayer.h @@ -10,7 +10,7 @@ private: BiomeArray startBiomes; public: - BiomeInitLayer(int64_t seed, shared_ptr parent, LevelType *levelType); + BiomeInitLayer(__int64 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.cpp b/Minecraft.World/BiomeSource.cpp index 9f03cc15..b16efd31 100644 --- a/Minecraft.World/BiomeSource.cpp +++ b/Minecraft.World/BiomeSource.cpp @@ -10,10 +10,10 @@ // 4J - removal of separate temperature & downfall layers brought forward from 1.2.3 void BiomeSource::_init() -{ +{ layer = nullptr; zoomedLayer = nullptr; - + cache = new BiomeCache(this); playerSpawnBiomes.push_back(Biome::forest); @@ -26,7 +26,7 @@ void BiomeSource::_init() playerSpawnBiomes.push_back(Biome::jungleHills); } -void BiomeSource::_init(int64_t seed, LevelType *generator) +void BiomeSource::_init(__int64 seed, LevelType *generator) { _init(); @@ -43,7 +43,7 @@ BiomeSource::BiomeSource() } // 4J added -BiomeSource::BiomeSource(int64_t seed, LevelType *generator) +BiomeSource::BiomeSource(__int64 seed, LevelType *generator) { _init(seed, generator); } @@ -271,7 +271,7 @@ void BiomeSource::getBiomeIndexBlock(byteArray& biomeIndices, int x, int z, int /** * Checks if an area around a block contains only the specified biomes. * Useful for placing elements like towns. -* +* * This is a bit of a rough check, to make it as fast as possible. To ensure * NO other biomes, add a margin of at least four blocks to the radius */ @@ -298,7 +298,7 @@ bool BiomeSource::containsOnly(int x, int z, int r, vector allowed) /** * Checks if an area around a block contains only the specified biome. * Useful for placing elements like towns. -* +* * This is a bit of a rough check, to make it as fast as possible. To ensure * NO other biomes, add a margin of at least four blocks to the radius */ @@ -308,7 +308,7 @@ bool BiomeSource::containsOnly(int x, int z, int r, Biome *allowed) 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; @@ -325,7 +325,7 @@ bool BiomeSource::containsOnly(int x, int z, int r, Biome *allowed) /** * Finds the specified biome within the radius. This will return a random * position if several are found. This test is fairly rough. -* +* * Returns null if the biome wasn't found */ TilePos *BiomeSource::findBiome(int x, int z, int r, Biome *toFind, Random *random) @@ -362,7 +362,7 @@ TilePos *BiomeSource::findBiome(int x, int z, int r, Biome *toFind, Random *rand /** * Finds one of the specified biomes within the radius. This will return a * random position if several are found. This test is fairly rough. -* +* * Returns null if the biome wasn't found */ TilePos *BiomeSource::findBiome(int x, int z, int r, vector allowed, Random *random) @@ -408,13 +408,13 @@ void BiomeSource::update() // 4J added - find a seed for this biomesource that matches certain criteria #ifdef __PSVITA__ -int64_t BiomeSource::findSeed(LevelType *generator, bool* pServerRunning) // MGH - added pRunning, so we can early out of this on Vita as it can take up to 60 secs +__int64 BiomeSource::findSeed(LevelType *generator, bool* pServerRunning) // MGH - added pRunning, so we can early out of this on Vita as it can take up to 60 secs #else -int64_t BiomeSource::findSeed(LevelType *generator) +__int64 BiomeSource::findSeed(LevelType *generator) #endif { - int64_t bestSeed = 0; + __int64 bestSeed = 0; ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; mcprogress->progressStage(IDS_PROGRESS_NEW_WORLD_SEED); @@ -452,7 +452,7 @@ int64_t BiomeSource::findSeed(LevelType *generator) // Just keeping trying to generate seeds until we find one that matches our criteria do { - int64_t seed = pr->nextLong(); + __int64 seed = pr->nextLong(); BiomeSource *biomeSource = new BiomeSource(seed,generator); biomeSource->getRawBiomeIndices(indices, biomeOffset, biomeOffset, biomeWidth, biomeWidth); @@ -484,7 +484,7 @@ int64_t BiomeSource::findSeed(LevelType *generator) unsigned int *pixels = new unsigned int[54 * 16 * 54 * 16]; for(int i = 0; i < 54 * 16 * 54 * 16; i++ ) - { + { int id = biomes[i]->id; // Create following colours: @@ -560,7 +560,7 @@ void BiomeSource::getFracs(intArray indices, float *fracs) bool BiomeSource::getIsMatch(float *frac) { // A true for a particular biome type here marks it as one that *has* to be present - static const bool critical[Biome::BIOME_COUNT] = { + static const bool critical[Biome::BIOME_COUNT] = { true, // ocean true, // plains true, // desert diff --git a/Minecraft.World/BiomeSource.h b/Minecraft.World/BiomeSource.h index a1e8a50b..bef09db0 100644 --- a/Minecraft.World/BiomeSource.h +++ b/Minecraft.World/BiomeSource.h @@ -25,20 +25,20 @@ private: protected: void _init(); - void _init(int64_t seed, LevelType *generator); + void _init(__int64 seed, LevelType *generator); BiomeSource(); public: - BiomeSource(int64_t seed, LevelType *generator); + BiomeSource(__int64 seed, LevelType *generator); BiomeSource(Level *level); private: static bool getIsMatch(float *frac); // 4J added static void getFracs(intArray indices, float *fracs); // 4J added public: #ifdef __PSVITA__ - static int64_t findSeed(LevelType *generator, bool* pServerRunning); // MGH - added pRunning, so we can early out of this on Vita as it can take up to 60 secs // 4J added + static __int64 findSeed(LevelType *generator, bool* pServerRunning); // MGH - added pRunning, so we can early out of this on Vita as it can take up to 60 secs // 4J added #else - static int64_t findSeed(LevelType *generator); // 4J added + static __int64 findSeed(LevelType *generator); // 4J added #endif ~BiomeSource(); @@ -71,7 +71,7 @@ public: /** * Checks if an area around a block contains only the specified biomes. * Useful for placing elements like towns. - * + * * This is a bit of a rough check, to make it as fast as possible. To ensure * NO other biomes, add a margin of at least four blocks to the radius */ @@ -80,7 +80,7 @@ public: /** * Checks if an area around a block contains only the specified biome. * Useful for placing elements like towns. - * + * * This is a bit of a rough check, to make it as fast as possible. To ensure * NO other biomes, add a margin of at least four blocks to the radius */ @@ -89,7 +89,7 @@ public: /** * Finds the specified biome within the radius. This will return a random * position if several are found. This test is fairly rough. - * + * * Returns null if the biome wasn't found */ virtual TilePos *findBiome(int x, int z, int r, Biome *toFind, Random *random); @@ -97,7 +97,7 @@ public: /** * Finds one of the specified biomes within the radius. This will return a * random position if several are found. This test is fairly rough. - * + * * Returns null if the biome wasn't found */ virtual TilePos *findBiome(int x, int z, int r, vector allowed, Random *random); diff --git a/Minecraft.World/ByteArrayInputStream.cpp b/Minecraft.World/ByteArrayInputStream.cpp index b0167300..394bda14 100644 --- a/Minecraft.World/ByteArrayInputStream.cpp +++ b/Minecraft.World/ByteArrayInputStream.cpp @@ -51,7 +51,7 @@ int ByteArrayInputStream::read() // //The read(b) method for class InputStream has the same effect as: // -// read(b, 0, b.length) +// read(b, 0, b.length) //Parameters: //b - the buffer into which the data is read. //Returns: @@ -100,7 +100,7 @@ void ByteArrayInputStream::close() //n - the number of bytes to be skipped. //Returns: //the actual number of bytes skipped. -int64_t ByteArrayInputStream::skip(int64_t n) +__int64 ByteArrayInputStream::skip(__int64 n) { int newPos = pos + n; diff --git a/Minecraft.World/ByteArrayInputStream.h b/Minecraft.World/ByteArrayInputStream.h index 5b2d95cf..e74b1cf7 100644 --- a/Minecraft.World/ByteArrayInputStream.h +++ b/Minecraft.World/ByteArrayInputStream.h @@ -19,7 +19,7 @@ public: virtual int read(byteArray b); virtual int read(byteArray b, unsigned int offset, unsigned int length); virtual void close(); - virtual int64_t skip(int64_t n); + virtual __int64 skip(__int64 n); // 4J Stu Added - Sometimes we don't want to delete the data on destroying this void reset() { buf = byteArray(); count = 0; mark = 0; pos = 0; } diff --git a/Minecraft.World/ByteBuffer.cpp b/Minecraft.World/ByteBuffer.cpp index 57b30dbd..66514737 100644 --- a/Minecraft.World/ByteBuffer.cpp +++ b/Minecraft.World/ByteBuffer.cpp @@ -176,20 +176,20 @@ int ByteBuffer::getInt(unsigned int index) // //Returns: //The long value at the buffer's current position -int64_t ByteBuffer::getLong() +__int64 ByteBuffer::getLong() { assert( m_position+8 < m_limit ); - int64_t value = 0; + __int64 value = 0; - int64_t b1 = buffer[ m_position ]; - int64_t b2 = buffer[ m_position+1 ]; - int64_t b3 = buffer[ m_position+2 ]; - int64_t b4 = buffer[ m_position+3 ]; - int64_t b5 = buffer[ m_position+4 ]; - int64_t b6 = buffer[ m_position+5 ]; - int64_t b7 = buffer[ m_position+6 ]; - int64_t b8 = buffer[ m_position+7 ]; + __int64 b1 = buffer[ m_position ]; + __int64 b2 = buffer[ m_position+1 ]; + __int64 b3 = buffer[ m_position+2 ]; + __int64 b4 = buffer[ m_position+3 ]; + __int64 b5 = buffer[ m_position+4 ]; + __int64 b6 = buffer[ m_position+5 ]; + __int64 b7 = buffer[ m_position+6 ]; + __int64 b8 = buffer[ m_position+7 ]; m_position += 8; @@ -358,7 +358,7 @@ ByteBuffer *ByteBuffer::putShortArray(shortArray &s) // TODO 4J Stu - Should this function be writing from the start of the buffer, or from position? // And should it update position? assert( s.length*2 <= m_limit); - + // 4J Stu - Assumes big endian memcpy( buffer, s.data, s.length*2 ); @@ -373,7 +373,7 @@ ByteBuffer *ByteBuffer::putShortArray(shortArray &s) //value - The long value to be written //Returns: //This buffer -ByteBuffer *ByteBuffer::putLong(int64_t value) +ByteBuffer *ByteBuffer::putLong(__int64 value) { assert( m_position+7 < m_limit ); @@ -407,7 +407,7 @@ ByteBuffer *ByteBuffer::putLong(int64_t value) //This method transfers the entire content of the given source byte array into this buffer. //An invocation of this method of the form dst.put(a) behaves in exactly the same way as the invocation // -// dst.put(a, 0, a.length) +// dst.put(a, 0, a.length) //Returns: //This buffer ByteBuffer *ByteBuffer::put(byteArray inputArray) @@ -436,7 +436,7 @@ byteArray ByteBuffer::array() //it will be read-only if, and only if, this buffer is read-only. // //Returns: -//A new int buffer +//A new int buffer IntBuffer *ByteBuffer::asIntBuffer() { // TODO 4J Stu - Is it safe to just cast our byte array pointer to another type? @@ -463,7 +463,7 @@ FloatBuffer *ByteBuffer::asFloatBuffer() #ifdef __PS3__ // we're using the RSX now to upload textures to vram, so we need th main ram textures allocated from io space -ByteBuffer_IO::ByteBuffer_IO( unsigned int capacity ) +ByteBuffer_IO::ByteBuffer_IO( unsigned int capacity ) : ByteBuffer(capacity, (byte*)RenderManager.allocIOMem(capacity, 64)) { memset( buffer,0,sizeof(byte)*capacity); diff --git a/Minecraft.World/ByteBuffer.h b/Minecraft.World/ByteBuffer.h index 56ac0b96..2d936374 100644 --- a/Minecraft.World/ByteBuffer.h +++ b/Minecraft.World/ByteBuffer.h @@ -28,7 +28,7 @@ public: int getInt(unsigned int index); void get(byteArray) {} // 4J - TODO byte get(int index); - int64_t getLong(); + __int64 getLong(); short getShort(); void getShortArray(shortArray &s); ByteBuffer *put(int index, byte b); @@ -36,7 +36,7 @@ public: ByteBuffer *putInt(unsigned int index, int value); ByteBuffer *putShort(short value); ByteBuffer *putShortArray(shortArray &s); - ByteBuffer *putLong(int64_t value); + ByteBuffer *putLong(__int64 value); ByteBuffer *put(byteArray inputArray); byteArray array(); IntBuffer *asIntBuffer(); diff --git a/Minecraft.World/C4JThread.h b/Minecraft.World/C4JThread.h index 346f123d..9a303c7b 100644 --- a/Minecraft.World/C4JThread.h +++ b/Minecraft.World/C4JThread.h @@ -66,7 +66,7 @@ public: e_modeAutoClear, e_modeManualClear }; - Event(EMode mode = e_modeAutoClear); + Event(EMode mode = e_modeAutoClear); ~Event(); void Set(); void Clear(); @@ -75,7 +75,7 @@ public: private: EMode m_mode; #ifdef __PS3__ - sys_event_flag_t m_event; + sys_event_flag_t m_event; #elif defined __ORBIS__ SceKernelEventFlag m_event; #elif defined __PSVITA__ @@ -111,7 +111,7 @@ public: int m_size; EMode m_mode; #ifdef __PS3__ - sys_event_flag_t m_events; + sys_event_flag_t m_events; #elif defined __ORBIS__ SceKernelEventFlag m_events; #elif defined __PSVITA__ @@ -129,7 +129,7 @@ public: typedef void (ThreadInitFunc)(); C4JThread* m_thread; - std::queue m_queue; + std::queue m_queue; C4JThread::EventArray* m_startEvent; C4JThread::Event* m_finishedEvent; CRITICAL_SECTION m_critSect; @@ -187,7 +187,7 @@ private: bool m_isRunning; bool m_hasStarted; int m_exitCode; - int64_t m_lastSleepTime; + __int64 m_lastSleepTime; static std::vector ms_threadList; static CRITICAL_SECTION ms_threadListCS; diff --git a/Minecraft.World/CanyonFeature.cpp b/Minecraft.World/CanyonFeature.cpp index 4eea3902..b96c97e0 100644 --- a/Minecraft.World/CanyonFeature.cpp +++ b/Minecraft.World/CanyonFeature.cpp @@ -4,7 +4,7 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.biome.h" -void CanyonFeature::addTunnel(int64_t 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) +void CanyonFeature::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) { MemSect(49); Random *random = new Random(seed); diff --git a/Minecraft.World/CanyonFeature.h b/Minecraft.World/CanyonFeature.h index d3edbf1f..cf3f7a61 100644 --- a/Minecraft.World/CanyonFeature.h +++ b/Minecraft.World/CanyonFeature.h @@ -9,6 +9,6 @@ private: float rs[1024]; protected: - void addTunnel(int64_t 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); + 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/CaveFeature.cpp b/Minecraft.World/CaveFeature.cpp index 95e5a5be..aad92805 100644 --- a/Minecraft.World/CaveFeature.cpp +++ b/Minecraft.World/CaveFeature.cpp @@ -20,7 +20,7 @@ using namespace std; double radius = random->nextDouble() * 4 + 2; double fuss = random->nextDouble() * 0.6; - int64_t seed = random->nextLong(); + __int64 seed = random->nextLong(); random->setSeed(seed); vector toRemove; @@ -69,14 +69,14 @@ using namespace std; } } } - + 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); } - + itEnd = toRemove.end(); for (AUTO_VAR(it, toRemove.begin()); it != itEnd; it++) { diff --git a/Minecraft.World/ChunkPos.cpp b/Minecraft.World/ChunkPos.cpp index 1bdf165d..3f9674a7 100644 --- a/Minecraft.World/ChunkPos.cpp +++ b/Minecraft.World/ChunkPos.cpp @@ -6,16 +6,16 @@ ChunkPos::ChunkPos(int x, int z) : x( x ), z( z ) { } -int64_t ChunkPos::hashCode(int x, int z) +__int64 ChunkPos::hashCode(int x, int z) { - int64_t xx = x; - int64_t zz = z; + __int64 xx = x; + __int64 zz = z; return (xx & 0xffffffffl) | ((zz & 0xffffffffl) << 32l); } int ChunkPos::hashCode() { - int64_t hash = hashCode(x, z); + __int64 hash = hashCode(x, z); int h1 = (int) (hash); int h2 = (int) (hash >> 32l); return h1 ^ h2; @@ -53,7 +53,7 @@ int ChunkPos::getMiddleBlockZ() return ( z << 4 ) + 8; } -TilePos ChunkPos::getMiddleBlockPosition(int y) +TilePos ChunkPos::getMiddleBlockPosition(int y) { return TilePos(getMiddleBlockX(), y, getMiddleBlockZ()); } @@ -63,7 +63,7 @@ wstring ChunkPos::toString() return L"[" + _toString(x) + L", " + _toString(z) + L"]"; } -int64_t ChunkPos::hash_fnct(const ChunkPos &k) +__int64 ChunkPos::hash_fnct(const ChunkPos &k) { return k.hashCode(k.x,k.z); } diff --git a/Minecraft.World/ChunkPos.h b/Minecraft.World/ChunkPos.h index 55bd1ebb..2a3fda02 100644 --- a/Minecraft.World/ChunkPos.h +++ b/Minecraft.World/ChunkPos.h @@ -10,7 +10,7 @@ public: ChunkPos(int x, int z); - static int64_t hashCode(int x, int z); + static __int64 hashCode(int x, int z); int hashCode(); double distanceToSqr(shared_ptr e); @@ -22,7 +22,7 @@ public: TilePos getMiddleBlockPosition(int y); wstring toString(); - static int64_t hash_fnct(const ChunkPos &k); + static __int64 hash_fnct(const ChunkPos &k); static bool eq_test(const ChunkPos &x, const ChunkPos &y); bool operator == (const ChunkPos &k) const { return (this->x == k.x) && ( this->z == k.z); } ChunkPos & operator= (const ChunkPos & other) { x = other.x; z = other.z; return *this; } @@ -30,12 +30,12 @@ public: struct ChunkPosKeyHash { - inline int64_t operator()(const ChunkPos &k) const + inline __int64 operator()(const ChunkPos &k) const { return ChunkPos::hash_fnct(k); } }; struct ChunkPosKeyEq { - inline bool operator()(const ChunkPos &x, const ChunkPos &y) const + inline bool operator()(const ChunkPos &x, const ChunkPos &y) const { return ChunkPos::eq_test(x, y); } }; \ No newline at end of file diff --git a/Minecraft.World/ChunkStorageProfileDecorator.cpp b/Minecraft.World/ChunkStorageProfileDecorator.cpp index 5d757811..76ffddbc 100644 --- a/Minecraft.World/ChunkStorageProfileDecorator.cpp +++ b/Minecraft.World/ChunkStorageProfileDecorator.cpp @@ -10,7 +10,7 @@ ChunkStorageProfilerDecorator::ChunkStorageProfilerDecorator(ChunkStorage *capsu LevelChunk *ChunkStorageProfilerDecorator::load(Level *level, int x, int z) { - int64_t nanoTime = System::nanoTime(); + __int64 nanoTime = System::nanoTime(); LevelChunk *chunk = capsulated->load(level, x, z); timeSpentLoading += System::nanoTime() - nanoTime; loadCount++; @@ -20,7 +20,7 @@ LevelChunk *ChunkStorageProfilerDecorator::load(Level *level, int x, int z) void ChunkStorageProfilerDecorator::save(Level *level, LevelChunk *levelChunk) { - int64_t nanoTime = System::nanoTime(); + __int64 nanoTime = System::nanoTime(); capsulated->save(level, levelChunk); timeSpentSaving += System::nanoTime() - nanoTime; saveCount++; @@ -59,7 +59,7 @@ void ChunkStorageProfilerDecorator::tick() sprintf(buf,"Average save time: %f (%I64d)",0.000001 * (double) timeSpentSaving / (double) loadCount, loadCount); #endif app.DebugPrintf(buf); -#endif +#endif } counter = 0; } diff --git a/Minecraft.World/ChunkStorageProfileDecorator.h b/Minecraft.World/ChunkStorageProfileDecorator.h index 02ea4dcb..67c582da 100644 --- a/Minecraft.World/ChunkStorageProfileDecorator.h +++ b/Minecraft.World/ChunkStorageProfileDecorator.h @@ -8,10 +8,10 @@ class ChunkStorageProfilerDecorator : public ChunkStorage private: ChunkStorage *capsulated; - int64_t timeSpentLoading; - int64_t loadCount; - int64_t timeSpentSaving; - int64_t saveCount; + __int64 timeSpentLoading; + __int64 loadCount; + __int64 timeSpentSaving; + __int64 saveCount; int counter; diff --git a/Minecraft.World/CompoundTag.h b/Minecraft.World/CompoundTag.h index aa16f8a1..32c31583 100644 --- a/Minecraft.World/CompoundTag.h +++ b/Minecraft.World/CompoundTag.h @@ -11,7 +11,7 @@ #include "ByteArrayTag.h" #include "IntArrayTag.h" -class CompoundTag : public Tag +class CompoundTag : public Tag { private: unordered_map tags; @@ -46,7 +46,7 @@ public: { // 4J - was return tags.values(); vector *ret = new vector; - + AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) { @@ -80,7 +80,7 @@ public: tags[name] = (new IntTag(name,value)); } - void putLong(wchar_t * name, int64_t value) + void putLong(wchar_t * name, __int64 value) { tags[name] = (new LongTag(name,value)); } @@ -126,7 +126,7 @@ public: if(it != tags.end()) return it->second; return NULL; } - + bool contains(wchar_t * name) { return tags.find(name) != tags.end(); @@ -150,9 +150,9 @@ public: return ((IntTag *) tags[name])->data; } - int64_t getLong(wchar_t * name) + __int64 getLong(wchar_t * name) { - if (tags.find(name) == tags.end()) return (int64_t)0; + if (tags.find(name) == tags.end()) return (__int64)0; return ((LongTag *) tags[name])->data; } @@ -227,7 +227,7 @@ public: 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++ ) { @@ -255,10 +255,10 @@ public: Tag *copy() { CompoundTag *tag = new CompoundTag(getName()); - + AUTO_VAR(itEnd, tags.end()); for( AUTO_VAR(it, tags.begin()); it != itEnd; it++ ) - { + { tag->put((wchar_t *)it->first.c_str(), it->second->copy()); } return tag; diff --git a/Minecraft.World/CompressedTileStorage.cpp b/Minecraft.World/CompressedTileStorage.cpp index 78b37ad8..896bd58d 100644 --- a/Minecraft.World/CompressedTileStorage.cpp +++ b/Minecraft.World/CompressedTileStorage.cpp @@ -142,7 +142,7 @@ CompressedTileStorage::CompressedTileStorage(bool isEmpty) #endif } -bool CompressedTileStorage::isRenderChunkEmpty(int y) // y == 0, 16, 32... 112 (representing a 16 byte range) +bool CompressedTileStorage::isRenderChunkEmpty(int y) // y == 0, 16, 32... 112 (representing a 16 byte range) { int block; unsigned short *blockIndices = (unsigned short *)indicesAndData; @@ -151,7 +151,7 @@ bool CompressedTileStorage::isRenderChunkEmpty(int y) // y == 0, 16, 32... 112 ( for( int z = 0; z < 16; z += 4 ) { getBlock(&block, x, y, z); - uint64_t *comp = (uint64_t *)&blockIndices[block]; + __uint64 *comp = (__uint64 *)&blockIndices[block]; // Are the 4 y regions stored here all zero? (INDEX_TYPE_0_OR_8_BIT | INDEX_TYPE_0_BIT_FLAG ) if( ( *comp ) != 0x0007000700070007L ) return false; } @@ -169,18 +169,18 @@ bool CompressedTileStorage::isSameAs(CompressedTileStorage *other) // Attempt to compare as much as we can in 64-byte chunks (8 groups of 8 bytes) int quickCount = allocatedSize / 64; - int64_t *pOld = (int64_t *)indicesAndData; - int64_t *pNew = (int64_t *)other->indicesAndData; + __int64 *pOld = (__int64 *)indicesAndData; + __int64 *pNew = (__int64 *)other->indicesAndData; for( int i = 0; i < quickCount; i++ ) { - int64_t d0 = pOld[0] ^ pNew[0]; - int64_t d1 = pOld[1] ^ pNew[1]; - int64_t d2 = pOld[2] ^ pNew[2]; - int64_t d3 = pOld[3] ^ pNew[3]; - int64_t d4 = pOld[4] ^ pNew[4]; - int64_t d5 = pOld[5] ^ pNew[5]; - int64_t d6 = pOld[6] ^ pNew[6]; - int64_t d7 = pOld[7] ^ pNew[7]; + __int64 d0 = pOld[0] ^ pNew[0]; + __int64 d1 = pOld[1] ^ pNew[1]; + __int64 d2 = pOld[2] ^ pNew[2]; + __int64 d3 = pOld[3] ^ pNew[3]; + __int64 d4 = pOld[4] ^ pNew[4]; + __int64 d5 = pOld[5] ^ pNew[5]; + __int64 d6 = pOld[6] ^ pNew[6]; + __int64 d7 = pOld[7] ^ pNew[7]; d0 |= d1; d2 |= d3; d4 |= d5; @@ -194,7 +194,7 @@ bool CompressedTileStorage::isSameAs(CompressedTileStorage *other) } pOld += 8; pNew += 8; - } + } // Now test anything remaining just byte at a time unsigned char *pucOld = (unsigned char *)pOld; @@ -261,7 +261,7 @@ inline int CompressedTileStorage::getIndex(int block, int tile) // and z is: ___________zzzz // and maps to this bit of b ________bb_____ // and this bit of t ___________tt__ -// +// inline void CompressedTileStorage::getBlockAndTile(int *block, int *tile, int x, int y, int z) { @@ -302,7 +302,7 @@ void CompressedTileStorage::setData(byteArray dataIn, unsigned int inOffset) int offsets[512]; int memToAlloc = 0; // static int type0 = 0, type1 = 0, type2 = 0, type4 = 0, type8 = 0, chunkTotal = 0; - + // Loop round all blocks for( int i = 0; i < 512; i++ ) { @@ -332,8 +332,8 @@ void CompressedTileStorage::setData(byteArray dataIn, unsigned int inOffset) } } #else - uint64_t usedFlags[4] = {0,0,0,0}; - int64_t i64_1 = 1; // MGH - instead of 1i64, which is MS specific + __uint64 usedFlags[4] = {0,0,0,0}; + __int64 i64_1 = 1; // MGH - instead of 1i64, which is MS specific for( int j = 0; j < 64; j++ ) // This loop of 64 is to go round the 4 x 4 tiles in the block { int tile = data[getIndex(i,j)]; @@ -889,7 +889,7 @@ void CompressedTileStorage::compress(int upgradeBlock/*=-1*/) unsigned char *unpacked_data = NULL; unsigned char *packed_data; - // First task is to find out what type of storage each block needs. Need to unpack each where required. + // First task is to find out what type of storage each block needs. Need to unpack each where required. // Note that we don't need to fully unpack the data at this stage since we are only interested in working out how many unique types of tiles are in each block, not // what those actual tile ids are. if( upgradeBlock == -1 ) @@ -950,8 +950,8 @@ void CompressedTileStorage::compress(int upgradeBlock/*=-1*/) } #else - uint64_t usedFlags[4] = {0,0,0,0}; - int64_t i64_1 = 1; // MGH - instead of 1i64, which is MS specific + __uint64 usedFlags[4] = {0,0,0,0}; + __int64 i64_1 = 1; // MGH - instead of 1i64, which is MS specific for( int j = 0; j < 64; j++ ) // This loop of 64 is to go round the 4x4x4 tiles in the block { int tiletype = unpacked_data[j]; @@ -1025,7 +1025,7 @@ void CompressedTileStorage::compress(int upgradeBlock/*=-1*/) } } switch(_blockIndices[i]) - { + { case INDEX_TYPE_1_BIT: memToAlloc += 10; break; @@ -1096,7 +1096,7 @@ void CompressedTileStorage::compress(int upgradeBlock/*=-1*/) else { packed_data = data + ( ( blockIndices[i] >> INDEX_OFFSET_SHIFT ) & INDEX_OFFSET_MASK); - + int dataSize = 8 << indexTypeOld; // 8, 16 or 32 bytes of per-tile storage dataSize += 1 << ( 1 << indexTypeOld ); // 2, 4 or 16 bytes to store each tile type newIndices[i] |= ( usDataOffset & INDEX_OFFSET_MASK) << INDEX_OFFSET_SHIFT; @@ -1289,7 +1289,7 @@ int CompressedTileStorage::getHighestNonEmptyY() if(found) break; } - + int highestNonEmptyY = -1; if(found) { diff --git a/Minecraft.World/ConsoleSaveFileInputStream.h b/Minecraft.World/ConsoleSaveFileInputStream.h index 7f4a69c4..876a9484 100644 --- a/Minecraft.World/ConsoleSaveFileInputStream.h +++ b/Minecraft.World/ConsoleSaveFileInputStream.h @@ -17,7 +17,7 @@ public: virtual int read(byteArray b); virtual int read(byteArray b, unsigned int offset, unsigned int length); virtual void close(); - virtual int64_t skip(int64_t n) { return n; } + virtual __int64 skip(__int64 n) { return n; } private: ConsoleSaveFile *m_saveFile; diff --git a/Minecraft.World/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleSaveFileOriginal.cpp index 58765a4c..139d99ac 100644 --- a/Minecraft.World/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/ConsoleSaveFileOriginal.cpp @@ -35,7 +35,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID // 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. - // AP - The Vita doesn't have virtual memory so a pretend system has been implemented in PSVitaStubs.cpp. + // AP - The Vita doesn't have virtual memory so a pretend system has been implemented in PSVitaStubs.cpp. // All access to the memory must be done via the access function as the pointer returned from VirtualAlloc // can't be used directly. pvHeap = VirtualAlloc(NULL, MAX_PAGE_COUNT * CSF_PAGE_SIZE, RESERVE_ALLOCATION, PAGE_READWRITE ); @@ -116,7 +116,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID #endif app.DebugPrintf("Filesize - %d, Adjusted size - %d\n",fileSize,storageLength); fileSize = storageLength; - } + } #ifdef __PSVITA__ if(plat == SAVE_FILE_PLATFORM_PSVITA) @@ -202,7 +202,7 @@ ConsoleSaveFileOriginal::ConsoleSaveFileOriginal(const wstring &fileName, LPVOID } else - { + { // Clear the first 8 bytes that reference the header header.WriteHeader( pvSaveMem ); } @@ -213,7 +213,7 @@ ConsoleSaveFileOriginal::~ConsoleSaveFileOriginal() 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 +#if defined _XBOX app.GetSaveThumbnail(NULL,NULL); #elif defined __PS3__ app.GetSaveThumbnail(NULL,NULL, NULL,NULL); @@ -548,7 +548,7 @@ void ConsoleSaveFileOriginal::MoveDataBeyond(FileEntry *file, DWORD nNumberOfByt if ( uiCopyEnd > uiFromEnd ) { // Needs to be clamped to the end of our region - uiCopyEnd = uiFromEnd; + uiCopyEnd = uiFromEnd; } #ifdef __PSVITA__ // AP - use this to access the virtual memory @@ -749,7 +749,7 @@ void ConsoleSaveFileOriginal::Flush(bool autosave, bool updateThumbnail ) BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - int64_t seed = 0; + __int64 seed = 0; bool hasSeed = false; if(MinecraftServer::getInstance()!= NULL && MinecraftServer::getInstance()->levels[0]!=NULL) { @@ -765,7 +765,7 @@ void ConsoleSaveFileOriginal::Flush(bool autosave, bool updateThumbnail ) #ifdef _XBOX StorageManager.SaveSaveData( compLength+8,pbThumbnailData,dwThumbnailDataSize,bTextMetadata,iTextMetadataBytes ); - delete [] pbThumbnailData; + delete [] pbThumbnailData; #ifndef _CONTENT_PACKAGE if( app.DebugSettingsOn()) { diff --git a/Minecraft.World/ConsoleSaveFileSplit.cpp b/Minecraft.World/ConsoleSaveFileSplit.cpp index 9fe7f8c7..2d83f217 100644 --- a/Minecraft.World/ConsoleSaveFileSplit.cpp +++ b/Minecraft.World/ConsoleSaveFileSplit.cpp @@ -41,7 +41,7 @@ ConsoleSaveFileSplit::RegionFileReference::~RegionFileReference() // 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 @@ -375,7 +375,7 @@ FileEntry *ConsoleSaveFileSplit::GetRegionFileEntry(unsigned int regionIndex) int index = StorageManager.AddSubfile(regionIndex); RegionFileReference *newRef = new RegionFileReference(index, regionIndex); regionFiles[regionIndex] = newRef; - + return newRef->fileEntry; } @@ -513,7 +513,7 @@ void ConsoleSaveFileSplit::_init(const wstring &fileName, LPVOID pvSaveData, DWO StorageManager.GetSaveData( pvSaveMem, &storageLength ); app.DebugPrintf("Filesize - %d, Adjusted size - %d\n",fileSize,storageLength); fileSize = storageLength; - } + } int compressed = *(int*)pvSaveMem; if( compressed == 0 ) @@ -532,7 +532,7 @@ void ConsoleSaveFileSplit::_init(const wstring &fileName, LPVOID pvSaveData, DWO else { unsigned char *buf = new unsigned char[decompSize]; - + if( Compression::getCompression()->Decompress(buf, &decompSize, (unsigned char *)pvSaveMem+8, fileSize-8 ) == S_OK) { @@ -575,7 +575,7 @@ void ConsoleSaveFileSplit::_init(const wstring &fileName, LPVOID pvSaveData, DWO } else - { + { // Clear the first 8 bytes that reference the header header.WriteHeader( pvSaveMem ); } @@ -586,7 +586,7 @@ 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 +#if defined _XBOX app.GetSaveThumbnail(NULL,NULL); #elif defined __PS3__ app.GetSaveThumbnail(NULL,NULL, NULL,NULL); @@ -606,7 +606,7 @@ ConsoleSaveFileSplit::~ConsoleSaveFileSplit() 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); @@ -942,7 +942,7 @@ void ConsoleSaveFileSplit::tick() } } - // Compile a vector of dirty regions. + // Compile a vector of dirty regions. vector dirtyRegions; for( AUTO_VAR(it, regionFiles.begin()); it != regionFiles.end(); it++ ) { @@ -999,7 +999,7 @@ void ConsoleSaveFileSplit::tick() { unsigned int totalDirty = 0; unsigned int totalDirtyBytes = 0; - int64_t oldestDirty = currentTime; + __int64 oldestDirty = currentTime; for( AUTO_VAR(it, regionFiles.begin()); it != regionFiles.end(); it++ ) { if( it->second->dirty ) @@ -1051,7 +1051,7 @@ void ConsoleSaveFileSplit::MoveDataBeyond(FileEntry *file, DWORD nNumberOfBytesT // 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 ) @@ -1117,7 +1117,7 @@ void ConsoleSaveFileSplit::MoveDataBeyond(FileEntry *file, DWORD nNumberOfBytesT if ( uiCopyEnd > uiFromEnd ) { // Needs to be clamped to the end of our region - uiCopyEnd = uiFromEnd; + uiCopyEnd = uiFromEnd; } XMemCpy( (void *)(uiCopyStart + nNumberOfBytesToWrite), ( void *)uiCopyStart, uiCopyEnd - uiCopyStart ); } @@ -1381,7 +1381,7 @@ void ConsoleSaveFileSplit::Flush(bool autosave, bool updateThumbnail) // 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 @@ -1421,7 +1421,7 @@ void ConsoleSaveFileSplit::Flush(bool autosave, bool updateThumbnail) BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - int64_t seed = 0; + __int64 seed = 0; bool hasSeed = false; if(MinecraftServer::getInstance()!= NULL && MinecraftServer::getInstance()->levels[0]!=NULL) { @@ -1436,7 +1436,7 @@ void ConsoleSaveFileSplit::Flush(bool autosave, bool updateThumbnail) app.DebugPrintf("Save thumbnail size %d\n",dwThumbnailDataSize); } - + INT saveOrCheckpointId = 0; bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); TelemetryManager->RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId, compLength+8); @@ -1459,7 +1459,7 @@ void ConsoleSaveFileSplit::Flush(bool autosave, bool updateThumbnail) 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) { @@ -1472,7 +1472,7 @@ int ConsoleSaveFileSplit::SaveSaveDataCallback(LPVOID lpParam,bool bRes) 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(); diff --git a/Minecraft.World/CustomLevelSource.cpp b/Minecraft.World/CustomLevelSource.cpp index 0d8ad81c..216e63b9 100644 --- a/Minecraft.World/CustomLevelSource.cpp +++ b/Minecraft.World/CustomLevelSource.cpp @@ -12,7 +12,7 @@ const double CustomLevelSource::SNOW_SCALE = 0.3; const double CustomLevelSource::SNOW_CUTOFF = 0.5; -CustomLevelSource::CustomLevelSource(Level *level, int64_t seed, bool generateStructures) : generateStructures( generateStructures ) +CustomLevelSource::CustomLevelSource(Level *level, __int64 seed, bool generateStructures) : generateStructures( generateStructures ) { #ifdef _OVERRIDE_HEIGHTMAP m_XZSize = level->getLevelData()->getXZSize(); @@ -326,7 +326,7 @@ void CustomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks, Bi run = runDepth; if (y >= waterHeight - 1) blocks[offs] = top; else blocks[offs] = material; - } + } else if (run > 0) { run--; @@ -399,7 +399,7 @@ LevelChunk *CustomLevelSource::getChunk(int xOffs, int zOffs) // 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. @@ -504,8 +504,8 @@ void CustomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) } pprandom->setSeed(level->getSeed()); - int64_t xScale = pprandom->nextLong() / 2 * 2 + 1; - int64_t zScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); bool hasVillage = false; diff --git a/Minecraft.World/CustomLevelSource.h b/Minecraft.World/CustomLevelSource.h index 35b22554..af01a478 100644 --- a/Minecraft.World/CustomLevelSource.h +++ b/Minecraft.World/CustomLevelSource.h @@ -44,7 +44,7 @@ private: const bool generateStructures; public: - CustomLevelSource(Level *level, int64_t seed, bool generateStructures); + CustomLevelSource(Level *level, __int64 seed, bool generateStructures); ~CustomLevelSource(); public: @@ -75,5 +75,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 TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); }; diff --git a/Minecraft.World/DataInput.h b/Minecraft.World/DataInput.h index f61eceb5..258b2717 100644 --- a/Minecraft.World/DataInput.h +++ b/Minecraft.World/DataInput.h @@ -13,7 +13,7 @@ public: virtual double readDouble() = 0; virtual float readFloat() = 0; virtual int readInt() = 0; - virtual int64_t readLong() = 0; + virtual __int64 readLong() = 0; virtual short readShort() = 0; virtual wchar_t readChar() = 0; virtual wstring readUTF() = 0; diff --git a/Minecraft.World/DataInputStream.cpp b/Minecraft.World/DataInputStream.cpp index 3bdd5349..2291bf48 100644 --- a/Minecraft.World/DataInputStream.cpp +++ b/Minecraft.World/DataInputStream.cpp @@ -32,8 +32,8 @@ int DataInputStream::read() // //The read(b) method has the same effect as: // -// read(b, 0, b.length) -// +// read(b, 0, b.length) +// //Overrides: //read in class FilterInputStream //Parameters: @@ -102,7 +102,7 @@ unsigned char DataInputStream::readUnsignedByte() //Reads two input bytes and returns a char value. Let a be the first byte read and b be the second byte. The value returned is: //(char)((a << 8) | (b & 0xff)) -// +// //This method is suitable for reading bytes written by the writeChar method of interface DataOutput. //Returns: //the char value read. @@ -110,7 +110,7 @@ wchar_t DataInputStream::readChar() { int a = stream->read(); int b = stream->read(); - return (wchar_t)((a << 8) | (b & 0xff)); + return (wchar_t)((a << 8) | (b & 0xff)); } //Reads some bytes from an input stream and stores them into the buffer array b. The number of bytes read is equal to the length of b. @@ -170,7 +170,7 @@ bool DataInputStream::readFully(charArray b) //the double value read. double DataInputStream::readDouble() { - int64_t bits = readLong(); + __int64 bits = readLong(); return Double::longBitsToDouble( bits ); } @@ -188,10 +188,10 @@ float DataInputStream::readFloat() } //Reads four input bytes and returns an int value. Let a-d be the first through fourth bytes read. The value returned is: -// +// // (((a & 0xff) << 24) | ((b & 0xff) << 16) | // ((c & 0xff) << 8) | (d & 0xff)) -// +// //This method is suitable for reading bytes written by the writeInt method of interface DataOutput. //Returns: //the int value read. @@ -207,7 +207,7 @@ int DataInputStream::readInt() } //Reads eight input bytes and returns a long value. Let a-h be the first through eighth bytes read. The value returned is: -// +// // (((long)(a & 0xff) << 56) | // ((long)(b & 0xff) << 48) | // ((long)(c & 0xff) << 40) | @@ -216,23 +216,23 @@ int DataInputStream::readInt() // ((long)(f & 0xff) << 16) | // ((long)(g & 0xff) << 8) | // ((long)(h & 0xff))) -// +// //This method is suitable for reading bytes written by the writeLong method of interface DataOutput. // //Returns: //the long value read. -int64_t DataInputStream::readLong() +__int64 DataInputStream::readLong() { - int64_t a = stream->read(); - int64_t b = stream->read(); - int64_t c = stream->read(); - int64_t d = stream->read(); - int64_t e = stream->read(); - int64_t f = stream->read(); - int64_t g = stream->read(); - int64_t h = stream->read(); - - int64_t bits = (((a & 0xff) << 56) | + __int64 a = stream->read(); + __int64 b = stream->read(); + __int64 c = stream->read(); + __int64 d = stream->read(); + __int64 e = stream->read(); + __int64 f = stream->read(); + __int64 g = stream->read(); + __int64 h = stream->read(); + + __int64 bits = (((a & 0xff) << 56) | ((b & 0xff) << 48) | ((c & 0xff) << 40) | ((d & 0xff) << 32) | @@ -246,7 +246,7 @@ int64_t DataInputStream::readLong() //Reads two input bytes and returns a short value. Let a be the first byte read and b be the second byte. The value returned is: //(short)((a << 8) | (b & 0xff)) -// +// //This method is suitable for reading the bytes written by the writeShort method of interface DataOutput. //Returns: //the 16-bit value read. @@ -272,13 +272,13 @@ short DataInputStream::readShort() //then a UTFDataFormatException is thrown. Otherwise, the group is converted to the character: // //(char)(((a& 0x1F) << 6) | (b & 0x3F)) -// +// //If the first byte of a group matches the bit pattern 1110xxxx, then the group consists of that byte a and two more bytes b and c. //If there is no byte c (because byte a was one of the last two of the bytes to be read), or either byte b or byte c does not match the bit //pattern 10xxxxxx, then a UTFDataFormatException is thrown. Otherwise, the group is converted to the character: // // (char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F)) -// +// //If the first byte of a group matches the pattern 1111xxxx or the pattern 10xxxxxx, then a UTFDataFormatException is thrown. //If end of file is encountered at any time during this entire process, then an EOFException is thrown. // @@ -305,7 +305,7 @@ wstring DataInputStream::readUTF() outputString.push_back(theChar); }*/ - + unsigned short currentByteIndex = 0; while( currentByteIndex < UTFLength ) { @@ -390,7 +390,7 @@ wstring DataInputStream::readUTF() { // TODO 4J Stu - EOFException break; - } + } // No more bytes to read if( !(currentByteIndex < UTFLength) ) @@ -420,7 +420,7 @@ wstring DataInputStream::readUTF() continue; } } - + return outputString; } @@ -486,7 +486,7 @@ int DataInputStream::readUTFChar() { // TODO 4J Stu - EOFException return returnValue; - } + } int thirdByte = stream->read(); @@ -535,7 +535,7 @@ void DataInputStream::deleteChildStream() //n - the number of bytes to be skipped. //Returns: //the actual number of bytes skipped. -int64_t DataInputStream::skip(int64_t n) +__int64 DataInputStream::skip(__int64 n) { return stream->skip(n); } diff --git a/Minecraft.World/DataInputStream.h b/Minecraft.World/DataInputStream.h index 043ab745..f69d490a 100644 --- a/Minecraft.World/DataInputStream.h +++ b/Minecraft.World/DataInputStream.h @@ -24,12 +24,12 @@ public: virtual double readDouble(); virtual float readFloat(); virtual int readInt(); - virtual int64_t readLong(); + virtual __int64 readLong(); virtual short readShort(); virtual wstring readUTF(); void deleteChildStream(); virtual int readUTFChar(); virtual PlayerUID readPlayerUID(); // 4J Added - virtual int64_t skip(int64_t n); + virtual __int64 skip(__int64 n); virtual int skipBytes(int n); }; \ No newline at end of file diff --git a/Minecraft.World/DataOutput.h b/Minecraft.World/DataOutput.h index 7ebf96da..648be6df 100644 --- a/Minecraft.World/DataOutput.h +++ b/Minecraft.World/DataOutput.h @@ -10,7 +10,7 @@ public: virtual void writeDouble(double a) = 0; virtual void writeFloat(float a) = 0; virtual void writeInt(int a) = 0; - virtual void writeLong(int64_t a) = 0; + virtual void writeLong(__int64 a) = 0; virtual void writeShort(short a) = 0; virtual void writeBoolean(bool v) = 0; virtual void writeChar(wchar_t v) = 0; diff --git a/Minecraft.World/DataOutputStream.cpp b/Minecraft.World/DataOutputStream.cpp index ede943d2..8e277c23 100644 --- a/Minecraft.World/DataOutputStream.cpp +++ b/Minecraft.World/DataOutputStream.cpp @@ -78,7 +78,7 @@ void DataOutputStream::writeByte(byte a) //v - a double value to be written. void DataOutputStream::writeDouble(double a) { - int64_t bits = Double::doubleToLongBits( a ); + __int64 bits = Double::doubleToLongBits( a ); writeLong( bits ); // TODO 4J Stu - Error handling? @@ -116,7 +116,7 @@ void DataOutputStream::writeInt(int a) //In no exception is thrown, the counter written is incremented by 8. //Parameters: //v - a long to be written. -void DataOutputStream::writeLong(int64_t a) +void DataOutputStream::writeLong(__int64 a) { stream->write( (a >> 56) & 0xff ); stream->write( (a >> 48) & 0xff ); @@ -178,7 +178,7 @@ void DataOutputStream::writeBoolean(bool b) { stream->write( b ? (byte)1 : (byte)0 ); // TODO 4J Stu - Error handling? - written += 1; + written += 1; } //Writes a string to the underlying output stream using modified UTF-8 encoding in a machine-independent manner. @@ -220,7 +220,7 @@ void DataOutputStream::writeUTF(const wstring& str) byteArray bytearr(utflen+2); bytearr[count++] = (byte) ((utflen >> 8) & 0xFF); - bytearr[count++] = (byte) ((utflen >> 0) & 0xFF); + bytearr[count++] = (byte) ((utflen >> 0) & 0xFF); int i=0; for (i=0; i > *players) return wrapped->createTag(players); } -int64_t DerivedLevelData::getSeed() +__int64 DerivedLevelData::getSeed() { return wrapped->getSeed(); } @@ -43,12 +43,12 @@ int DerivedLevelData::getZSpawn() return wrapped->getZSpawn(); } -int64_t DerivedLevelData::getTime() +__int64 DerivedLevelData::getTime() { return wrapped->getTime(); } -int64_t DerivedLevelData::getSizeOnDisk() +__int64 DerivedLevelData::getSizeOnDisk() { return wrapped->getSizeOnDisk(); } @@ -68,7 +68,7 @@ int DerivedLevelData::getVersion() return wrapped->getVersion(); } -int64_t DerivedLevelData::getLastPlayed() +__int64 DerivedLevelData::getLastPlayed() { return wrapped->getLastPlayed(); } @@ -98,7 +98,7 @@ GameType *DerivedLevelData::getGameType() return wrapped->getGameType(); } -void DerivedLevelData::setSeed(int64_t seed) +void DerivedLevelData::setSeed(__int64 seed) { } @@ -114,11 +114,11 @@ void DerivedLevelData::setZSpawn(int zSpawn) { } -void DerivedLevelData::setTime(int64_t time) +void DerivedLevelData::setTime(__int64 time) { } -void DerivedLevelData::setSizeOnDisk(int64_t sizeOnDisk) +void DerivedLevelData::setSizeOnDisk(__int64 sizeOnDisk) { } diff --git a/Minecraft.World/DerivedLevelData.h b/Minecraft.World/DerivedLevelData.h index db5a72d2..a39f7d04 100644 --- a/Minecraft.World/DerivedLevelData.h +++ b/Minecraft.World/DerivedLevelData.h @@ -16,27 +16,27 @@ protected: public: CompoundTag *createTag(); CompoundTag *createTag(vector > *players); - int64_t getSeed(); + __int64 getSeed(); int getXSpawn(); int getYSpawn(); int getZSpawn(); - int64_t getTime(); - int64_t getSizeOnDisk(); + __int64 getTime(); + __int64 getSizeOnDisk(); CompoundTag *getLoadedPlayerTag(); wstring getLevelName(); int getVersion(); - int64_t getLastPlayed(); + __int64 getLastPlayed(); bool isThundering(); int getThunderTime(); bool isRaining(); int getRainTime(); GameType *getGameType(); - void setSeed(int64_t seed); + void setSeed(__int64 seed); void setXSpawn(int xSpawn); void setYSpawn(int ySpawn); void setZSpawn(int zSpawn); - void setTime(int64_t time); - void setSizeOnDisk(int64_t sizeOnDisk); + void setTime(__int64 time); + void setSizeOnDisk(__int64 sizeOnDisk); void setLoadedPlayerTag(CompoundTag *loadedPlayerTag); void setDimension(int dimension); void setSpawn(int xSpawn, int ySpawn, int zSpawn); diff --git a/Minecraft.World/Dimension.cpp b/Minecraft.World/Dimension.cpp index 71e93a63..35e66698 100644 --- a/Minecraft.World/Dimension.cpp +++ b/Minecraft.World/Dimension.cpp @@ -41,11 +41,11 @@ void Dimension::init() } else #endif - if (level->getLevelData()->getGenerator() == LevelType::lvl_flat) + if (level->getLevelData()->getGenerator() == LevelType::lvl_flat) { biomeSource = new FixedBiomeSource(Biome::plains, 0.5f, 0.5f); } - else + else { biomeSource = new BiomeSource(level); } @@ -77,11 +77,11 @@ ChunkSource *Dimension::createRandomLevelSource() const } else #endif - if (levelType == LevelType::lvl_flat) + if (levelType == LevelType::lvl_flat) { return new FlatLevelSource(level, level->getSeed(), level->getLevelData()->isGenerateMapFeatures()); - } - else + } + else { return new RandomLevelSource(level, level->getSeed(), level->getLevelData()->isGenerateMapFeatures()); } @@ -106,7 +106,7 @@ bool Dimension::isValidSpawn(int x, int z) const return true; } -float Dimension::getTimeOfDay(int64_t time, float a) const +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; @@ -118,7 +118,7 @@ float Dimension::getTimeOfDay(int64_t time, float a) const return td; } -int Dimension::getMoonPhase(int64_t time, float a) const +int Dimension::getMoonPhase(__int64 time, float a) const { return ((int) (time / Level::TICKS_PER_DAY)) % 8; } @@ -162,7 +162,7 @@ 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; - + 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; @@ -203,16 +203,16 @@ Pos *Dimension::getSpawnPos() return NULL; } -int Dimension::getSpawnYPosition() +int Dimension::getSpawnYPosition() { - if (levelType == LevelType::lvl_flat) + if (levelType == LevelType::lvl_flat) { return 4; } return Level::genDepth / 2; } -bool Dimension::hasBedrockFog() +bool Dimension::hasBedrockFog() { // 4J-PB - turn off bedrock fog if the host player doesn't want it if(app.GetGameHostOption(eGameHostOption_BedrockFog)==0) @@ -223,9 +223,9 @@ bool Dimension::hasBedrockFog() return (levelType != LevelType::lvl_flat && !hasCeiling); } -double Dimension::getClearColorScale() +double Dimension::getClearColorScale() { - if (levelType == LevelType::lvl_flat) + if (levelType == LevelType::lvl_flat) { return 1.0; } diff --git a/Minecraft.World/Dimension.h b/Minecraft.World/Dimension.h index 5231c237..36df385e 100644 --- a/Minecraft.World/Dimension.h +++ b/Minecraft.World/Dimension.h @@ -35,8 +35,8 @@ public: virtual bool isValidSpawn(int x, int z) const; - virtual float getTimeOfDay(int64_t time, float a) const; - virtual int getMoonPhase(int64_t time, float a) const; + virtual float getTimeOfDay(__int64 time, float a) const; + virtual int getMoonPhase(__int64 time, float a) const; virtual bool isNaturalDimension(); private: static const int fogColor = 0xc0d8ff; @@ -53,7 +53,7 @@ public: virtual Pos *getSpawnPos(); int getSpawnYPosition(); - virtual bool hasBedrockFog(); + virtual bool hasBedrockFog(); double getClearColorScale(); virtual bool isFoggyAt(int x, int z); diff --git a/Minecraft.World/DirectoryLevelStorage.cpp b/Minecraft.World/DirectoryLevelStorage.cpp index 5a1dfc0a..27514c9b 100644 --- a/Minecraft.World/DirectoryLevelStorage.cpp +++ b/Minecraft.World/DirectoryLevelStorage.cpp @@ -108,19 +108,19 @@ void _MapDataMappings_old::setMapping(int id, PlayerUID xuid, int dimension) #ifdef _LARGE_WORLDS void DirectoryLevelStorage::PlayerMappings::addMapping(int id, int centreX, int centreZ, int dimension, int scale) { - int64_t index = ( ((int64_t)(centreZ & 0x1FFFFFFF)) << 34) | ( ((int64_t)(centreX & 0x1FFFFFFF)) << 5) | ( (scale & 0x7) << 2) | (dimension & 0x3); + __int64 index = ( ((__int64)(centreZ & 0x1FFFFFFF)) << 34) | ( ((__int64)(centreX & 0x1FFFFFFF)) << 5) | ( (scale & 0x7) << 2) | (dimension & 0x3); m_mappings[index] = id; //app.DebugPrintf("Adding mapping: %d - (%d,%d)/%d/%d [%I64d - 0x%016llx]\n", id, centreX, centreZ, dimension, scale, index, index); } bool DirectoryLevelStorage::PlayerMappings::getMapping(int &id, int centreX, int centreZ, int dimension, int scale) { - //int64_t zMasked = centreZ & 0x1FFFFFFF; - //int64_t xMasked = centreX & 0x1FFFFFFF; - //int64_t zShifted = zMasked << 34; - //int64_t xShifted = xMasked << 5; + //__int64 zMasked = centreZ & 0x1FFFFFFF; + //__int64 xMasked = centreX & 0x1FFFFFFF; + //__int64 zShifted = zMasked << 34; + //__int64 xShifted = xMasked << 5; //app.DebugPrintf("xShifted = %d (0x%016x), zShifted = %I64d (0x%016llx)\n", xShifted, xShifted, zShifted, zShifted); - int64_t index = ( ((int64_t)(centreZ & 0x1FFFFFFF)) << 34) | ( ((int64_t)(centreX & 0x1FFFFFFF)) << 5) | ( (scale & 0x7) << 2) | (dimension & 0x3); + __int64 index = ( ((__int64)(centreZ & 0x1FFFFFFF)) << 34) | ( ((__int64)(centreX & 0x1FFFFFFF)) << 5) | ( (scale & 0x7) << 2) | (dimension & 0x3); AUTO_VAR(it,m_mappings.find(index)); if(it != m_mappings.end()) { @@ -151,7 +151,7 @@ void DirectoryLevelStorage::PlayerMappings::readMappings(DataInputStream *dis) int count = dis->readInt(); for(unsigned int i = 0; i < count; ++i) { - int64_t index = dis->readLong(); + __int64 index = dis->readLong(); int id = dis->readInt(); m_mappings[index] = id; app.DebugPrintf(" -- %lld (0x%016llx) = %d\n", index, index, id); @@ -233,7 +233,7 @@ ChunkStorage *DirectoryLevelStorage::createChunkStorage(Dimension *dimension) return new OldChunkStorage(dir, true); } -LevelData *DirectoryLevelStorage::prepareLevel() +LevelData *DirectoryLevelStorage::prepareLevel() { // 4J Stu Added #ifdef _LARGE_WORLDS @@ -295,7 +295,7 @@ LevelData *DirectoryLevelStorage::prepareLevel() #else if(getSaveFile()->getSaveVersion() < END_DIMENSION_MAP_MAPPINGS_SAVE_VERSION) - { + { MapDataMappings_old oldMapDataMappings; getSaveFile()->readFile( fileEntry, &oldMapDataMappings, // data buffer @@ -334,7 +334,7 @@ LevelData *DirectoryLevelStorage::prepareLevel() ConsoleSavePath dataFile = ConsoleSavePath( wstring( L"level.dat" ) ); - if ( m_saveFile->doesFileExist( dataFile ) ) + if ( m_saveFile->doesFileExist( dataFile ) ) { ConsoleSaveFileInputStream fis = ConsoleSaveFileInputStream(m_saveFile, dataFile); CompoundTag *root = NbtIo::readCompressed(&fis); @@ -429,7 +429,7 @@ 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) +bool DirectoryLevelStorage::load(shared_ptr player) { bool newPlayer = true; CompoundTag *tag = loadPlayerDataTag( player->getXuid() ); @@ -499,7 +499,7 @@ void DirectoryLevelStorage::clearOldPlayerFiles() m_saveFile->deleteFile( playerFiles->at(i) ); } } - else + else #endif if( playerFiles->size() > MAX_PLAYER_DATA_SAVES ) { @@ -523,12 +523,12 @@ void DirectoryLevelStorage::clearOldPlayerFiles() } } -PlayerIO *DirectoryLevelStorage::getPlayerIO() +PlayerIO *DirectoryLevelStorage::getPlayerIO() { return this; } -void DirectoryLevelStorage::closeAll() +void DirectoryLevelStorage::closeAll() { } @@ -582,7 +582,7 @@ void DirectoryLevelStorage::resetNetherPlayerPositions() // If the player is in the nether, set their y position above the top of the nether // This will force the player to be spawned in a valid position in the overworld when they are loaded if(tag->contains(L"Dimension") && tag->getInt(L"Dimension") == LevelData::DIMENSION_NETHER && tag->contains(L"Pos")) - { + { ListTag *pos = (ListTag *) tag->getList(L"Pos"); pos->get(1)->data = DBL_MAX; diff --git a/Minecraft.World/DirectoryLevelStorage.h b/Minecraft.World/DirectoryLevelStorage.h index e47769d9..820ef31f 100644 --- a/Minecraft.World/DirectoryLevelStorage.h +++ b/Minecraft.World/DirectoryLevelStorage.h @@ -54,7 +54,7 @@ typedef struct _MapDataMappings_old void setMapping(int id, PlayerUID xuid, int dimension); } MapDataMappings_old; -class DirectoryLevelStorage : public LevelStorage, public PlayerIO +class DirectoryLevelStorage : public LevelStorage, public PlayerIO { private: /* 4J Jev, Probably no need for this as theres no exceptions being thrown. @@ -65,7 +65,7 @@ private: const ConsoleSavePath playerDir; //const File dataDir; const ConsoleSavePath dataDir; - const int64_t sessionId; + const __int64 sessionId; const wstring levelId; static const wstring sc_szPlayerDir; @@ -75,7 +75,7 @@ private: { friend class DirectoryLevelStorage; private: - unordered_map m_mappings; + unordered_map<__int64, short> m_mappings; public: void addMapping(int id, int centreX, int centreZ, int dimension, int scale); @@ -92,7 +92,7 @@ private: #else MapDataMappings m_mapDataMappings; MapDataMappings m_saveableMapDataMappings; -#endif +#endif bool m_bHasLoadedMapDataMappings; unordered_map m_cachedSaveData; diff --git a/Minecraft.World/EmptyLevelChunk.cpp b/Minecraft.World/EmptyLevelChunk.cpp index 4934ac96..80460b10 100644 --- a/Minecraft.World/EmptyLevelChunk.cpp +++ b/Minecraft.World/EmptyLevelChunk.cpp @@ -210,7 +210,7 @@ bool EmptyLevelChunk::testSetBlocksAndData(byteArray data, int x0, int y0, int z return false; } -Random *EmptyLevelChunk::getRandom(int64_t l) +Random *EmptyLevelChunk::getRandom(__int64 l) { return new Random((level->getSeed() + x * x * 4987142 + x * 5947611 + z * z * 4392871l + z * 389711) ^ l); } diff --git a/Minecraft.World/EmptyLevelChunk.h b/Minecraft.World/EmptyLevelChunk.h index a8ff27f9..02ffc176 100644 --- a/Minecraft.World/EmptyLevelChunk.h +++ b/Minecraft.World/EmptyLevelChunk.h @@ -48,7 +48,7 @@ public: 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 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 bool testSetBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p); // 4J added - Random *getRandom(int64_t l); + Random *getRandom(__int64 l); bool isEmpty(); virtual void reSyncLighting() {}; // 4J added }; diff --git a/Minecraft.World/EnchantmentMenu.h b/Minecraft.World/EnchantmentMenu.h index 62408f1d..e09b94c6 100644 --- a/Minecraft.World/EnchantmentMenu.h +++ b/Minecraft.World/EnchantmentMenu.h @@ -23,7 +23,7 @@ private: bool m_costsChanged; // 4J Added public: - int64_t nameSeed; + __int64 nameSeed; public: int costs[3]; diff --git a/Minecraft.World/FileHeader.h b/Minecraft.World/FileHeader.h index 9205e5b4..203ec322 100644 --- a/Minecraft.World/FileHeader.h +++ b/Minecraft.World/FileHeader.h @@ -96,7 +96,7 @@ public: }; - int64_t lastModifiedTime; // 8B + __int64 lastModifiedTime; // 8B }; typedef FileEntrySaveDataV2 FileEntrySaveData; @@ -122,7 +122,7 @@ public: currentFilePointer = data.startOffset; } - unsigned int getFileSize() { return data.length; } + unsigned int getFileSize() { return data.length; } bool isRegionFile() { return data.filename[0] == 0; } // When using ConsoleSaveFileSplit only unsigned int getRegionFileIndex() { return data.regionIndex; } // When using ConsoleSaveFileSplit only @@ -185,7 +185,7 @@ protected: vector *getDatFilesWithMacAndUserID(const PlayerUID& pUID); vector *getDatFilesWithPrimaryUser(); #endif - + void setSaveVersion(int version) { m_saveVersion = version; } int getSaveVersion() { return m_saveVersion; } void setOriginalSaveVersion(int version) { m_originalSaveVersion = version; } @@ -199,5 +199,5 @@ protected: void setEndian(ByteOrder endian) { m_saveEndian = endian; } static ByteOrder getEndian(ESavePlatform plat); bool isLocalEndianDifferent(ESavePlatform plat){return m_localEndian != getEndian(plat); } - + }; diff --git a/Minecraft.World/FileInputStream.cpp b/Minecraft.World/FileInputStream.cpp index 5e0f6ca5..7c0e844f 100644 --- a/Minecraft.World/FileInputStream.cpp +++ b/Minecraft.World/FileInputStream.cpp @@ -164,8 +164,8 @@ void FileInputStream::close() { //printf("\n\nFileInputStream::close - TRYING TO CLOSE AN INVALID FILE HANDLE\n\n"); return; - } - + } + BOOL result = CloseHandle( m_fileHandle ); if( result == 0 ) @@ -185,7 +185,7 @@ void FileInputStream::close() //n - the number of bytes to be skipped. //Returns: //the actual number of bytes skipped. -int64_t FileInputStream::skip(int64_t n) +__int64 FileInputStream::skip(__int64 n) { #ifdef _XBOX LARGE_INTEGER li; diff --git a/Minecraft.World/FileInputStream.h b/Minecraft.World/FileInputStream.h index 99ce776f..e855a2d7 100644 --- a/Minecraft.World/FileInputStream.h +++ b/Minecraft.World/FileInputStream.h @@ -12,7 +12,7 @@ public: virtual int read(byteArray b); virtual int read(byteArray b, unsigned int offset, unsigned int length); virtual void close(); - virtual int64_t skip(int64_t n); + virtual __int64 skip(__int64 n); private: HANDLE m_fileHandle; diff --git a/Minecraft.World/FlatLevelSource.cpp b/Minecraft.World/FlatLevelSource.cpp index 96b53312..6435bfb4 100644 --- a/Minecraft.World/FlatLevelSource.cpp +++ b/Minecraft.World/FlatLevelSource.cpp @@ -11,7 +11,7 @@ //FlatLevelSource::villageFeature = new VillageFeature(1); -FlatLevelSource::FlatLevelSource(Level *level, int64_t seed, bool generateStructures) +FlatLevelSource::FlatLevelSource(Level *level, __int64 seed, bool generateStructures) { m_XZSize = level->getLevelData()->getXZSize(); @@ -32,26 +32,26 @@ FlatLevelSource::~FlatLevelSource() delete villageFeature; } -void FlatLevelSource::prepareHeights(byteArray blocks) +void FlatLevelSource::prepareHeights(byteArray blocks) { int height = blocks.length / (16 * 16); - for (int xc = 0; xc < 16; xc++) + for (int xc = 0; xc < 16; xc++) { - for (int zc = 0; zc < 16; zc++) + for (int zc = 0; zc < 16; zc++) { - for (int yc = 0; yc < height; yc++) + for (int yc = 0; yc < height; yc++) { int block = 0; - if (yc == 0) + if (yc == 0) { block = Tile::unbreakable_Id; - } - else if (yc <= 2) + } + else if (yc <= 2) { block = Tile::dirt_Id; - } - else if (yc == 3) + } + else if (yc == 3) { block = Tile::grass_Id; } @@ -61,12 +61,12 @@ void FlatLevelSource::prepareHeights(byteArray blocks) } } -LevelChunk *FlatLevelSource::create(int x, int z) +LevelChunk *FlatLevelSource::create(int x, int z) { return getChunk(x, z); } -LevelChunk *FlatLevelSource::getChunk(int xOffs, int zOffs) +LevelChunk *FlatLevelSource::getChunk(int xOffs, int zOffs) { // 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; @@ -80,7 +80,7 @@ LevelChunk *FlatLevelSource::getChunk(int xOffs, int zOffs) // double[] temperatures = level.getBiomeSource().temperatures; - if (generateStructures) + if (generateStructures) { villageFeature->apply(this, level, xOffs, zOffs, blocks); } @@ -96,43 +96,43 @@ LevelChunk *FlatLevelSource::getChunk(int xOffs, int zOffs) } -bool FlatLevelSource::hasChunk(int x, int y) +bool FlatLevelSource::hasChunk(int x, int y) { return true; } -void FlatLevelSource::postProcess(ChunkSource *parent, int xt, int zt) +void FlatLevelSource::postProcess(ChunkSource *parent, int xt, int zt) { // 4J - changed from random to pprandom so we can run in parallel with getChunk etc. pprandom->setSeed(level->getSeed()); - int64_t xScale = pprandom->nextLong() / 2 * 2 + 1; - int64_t zScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); - if (generateStructures) + if (generateStructures) { villageFeature->postProcess(level, pprandom, xt, zt); } - + app.processSchematics(parent->getChunk(xt,zt)); } -bool FlatLevelSource::save(bool force, ProgressListener *progressListener) +bool FlatLevelSource::save(bool force, ProgressListener *progressListener) { return true; } -bool FlatLevelSource::tick() +bool FlatLevelSource::tick() { return false; } -bool FlatLevelSource::shouldSave() +bool FlatLevelSource::shouldSave() { return true; } -wstring FlatLevelSource::gatherStats() +wstring FlatLevelSource::gatherStats() { return L"FlatLevelSource"; } @@ -140,7 +140,7 @@ wstring FlatLevelSource::gatherStats() vector *FlatLevelSource::getMobsAt(MobCategory *mobCategory, int x, int y, int z) { Biome *biome = level->getBiome(x, z); - if (biome == NULL) + if (biome == NULL) { return NULL; } diff --git a/Minecraft.World/FlatLevelSource.h b/Minecraft.World/FlatLevelSource.h index 0c15c9d9..804a7b5a 100644 --- a/Minecraft.World/FlatLevelSource.h +++ b/Minecraft.World/FlatLevelSource.h @@ -24,13 +24,13 @@ private: boolean generateStructures; VillageFeature *villageFeature;// = new VillageFeature(1); -public: - FlatLevelSource(Level *level, int64_t seed, bool generateStructures); +public: + FlatLevelSource(Level *level, __int64 seed, bool generateStructures); ~FlatLevelSource(); -private: void prepareHeights(byteArray blocks); +private: void prepareHeights(byteArray blocks); -public: +public: virtual LevelChunk *create(int x, int z); virtual LevelChunk *getChunk(int xOffs, int zOffs); virtual bool hasChunk(int x, int y); diff --git a/Minecraft.World/FuzzyZoomLayer.cpp b/Minecraft.World/FuzzyZoomLayer.cpp index 54155ff5..65c6709e 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, shared_ptrparent) : Layer(seedMixup) +FuzzyZoomLayer::FuzzyZoomLayer(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } @@ -61,7 +61,7 @@ int FuzzyZoomLayer::random(int a, int b, int c, int d) return d; } -shared_ptrFuzzyZoomLayer::zoom(int64_t seed, shared_ptrsup, int count) +shared_ptrFuzzyZoomLayer::zoom(__int64 seed, shared_ptrsup, int count) { shared_ptr result = sup; for (int i = 0; i < count; i++) diff --git a/Minecraft.World/FuzzyZoomLayer.h b/Minecraft.World/FuzzyZoomLayer.h index 19526931..bc8f5e48 100644 --- a/Minecraft.World/FuzzyZoomLayer.h +++ b/Minecraft.World/FuzzyZoomLayer.h @@ -5,7 +5,7 @@ class FuzzyZoomLayer : public Layer { public: - FuzzyZoomLayer(int64_t seedMixup, shared_ptrparent); + FuzzyZoomLayer(__int64 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 shared_ptrzoom(int64_t seed, shared_ptrsup, int count); + static shared_ptrzoom(__int64 seed, shared_ptrsup, int count); }; \ No newline at end of file diff --git a/Minecraft.World/GZIPInputStream.h b/Minecraft.World/GZIPInputStream.h index b9242576..f852518b 100644 --- a/Minecraft.World/GZIPInputStream.h +++ b/Minecraft.World/GZIPInputStream.h @@ -13,5 +13,5 @@ public: virtual int read(byteArray b) { return stream->read( b ); }; virtual int read(byteArray b, unsigned int offset, unsigned int length) { return stream->read(b, offset, length); }; virtual void close() { return stream->close(); }; - virtual int64_t skip(int64_t n) { return 0; }; + virtual __int64 skip(__int64 n) { return 0; }; }; \ No newline at end of file diff --git a/Minecraft.World/GrowMushroomIslandLayer.cpp b/Minecraft.World/GrowMushroomIslandLayer.cpp index d204502d..14857366 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, shared_ptr parent) : Layer(seedMixup) +GrowMushroomIslandLayer::GrowMushroomIslandLayer(__int64 seedMixup, shared_ptr parent) : Layer(seedMixup) { this->parent = parent; } @@ -25,10 +25,10 @@ intArray GrowMushroomIslandLayer::getArea(int xo, int yo, int w, int h) int n2 = p[(x + 2) + (y + 0) * pw]; int n3 = p[(x + 0) + (y + 2) * pw]; int n4 = p[(x + 2) + (y + 2) * pw]; - + int c = p[(x + 1) + (y + 1) * pw]; - if( ( n1 == Biome::mushroomIsland->id ) || ( n2 == Biome::mushroomIsland->id ) || ( n3 == Biome::mushroomIsland->id ) || ( n4 == Biome::mushroomIsland->id ) ) + if( ( n1 == Biome::mushroomIsland->id ) || ( n2 == Biome::mushroomIsland->id ) || ( n3 == Biome::mushroomIsland->id ) || ( n4 == Biome::mushroomIsland->id ) ) { result[x + y * w] = Biome::mushroomIsland->id; } diff --git a/Minecraft.World/GrowMushroomIslandLayer.h b/Minecraft.World/GrowMushroomIslandLayer.h index 6b0860f7..3bca4d5c 100644 --- a/Minecraft.World/GrowMushroomIslandLayer.h +++ b/Minecraft.World/GrowMushroomIslandLayer.h @@ -4,6 +4,6 @@ class GrowMushroomIslandLayer : public Layer { public: - GrowMushroomIslandLayer(int64_t seedMixup, shared_ptr parent); + GrowMushroomIslandLayer(__int64 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/HellDimension.cpp b/Minecraft.World/HellDimension.cpp index 63cb0df7..85e2a25a 100644 --- a/Minecraft.World/HellDimension.cpp +++ b/Minecraft.World/HellDimension.cpp @@ -48,7 +48,7 @@ ChunkSource *HellDimension::createRandomLevelSource() const } else #endif - if (levelType == LevelType::lvl_flat) + if (levelType == LevelType::lvl_flat) { return new HellFlatLevelSource(level, level->getSeed()); } @@ -68,7 +68,7 @@ bool HellDimension::isValidSpawn(int x, int z) const return false; } -float HellDimension::getTimeOfDay(int64_t time, float a) const +float HellDimension::getTimeOfDay(__int64 time, float a) const { return 0.5f; } diff --git a/Minecraft.World/HellDimension.h b/Minecraft.World/HellDimension.h index fa95d9b2..b37f2b53 100644 --- a/Minecraft.World/HellDimension.h +++ b/Minecraft.World/HellDimension.h @@ -14,7 +14,7 @@ public: virtual ChunkSource *createRandomLevelSource() const; virtual bool isNaturalDimension(); virtual bool isValidSpawn(int x, int y) const; - virtual float getTimeOfDay(int64_t time, float a) const; + virtual float getTimeOfDay(__int64 time, float a) const; virtual bool mayRespawn() const; virtual bool isFoggyAt(int x, int z); diff --git a/Minecraft.World/HellFlatLevelSource.cpp b/Minecraft.World/HellFlatLevelSource.cpp index 14b29f8c..0b1c4359 100644 --- a/Minecraft.World/HellFlatLevelSource.cpp +++ b/Minecraft.World/HellFlatLevelSource.cpp @@ -4,7 +4,7 @@ #include "net.minecraft.world.level.storage.h" #include "HellFlatLevelSource.h" -HellFlatLevelSource::HellFlatLevelSource(Level *level, int64_t seed) +HellFlatLevelSource::HellFlatLevelSource(Level *level, __int64 seed) { int xzSize = level->getLevelData()->getXZSize(); int hellScale = level->getLevelData()->getHellScale(); @@ -26,17 +26,17 @@ void HellFlatLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) { int height = blocks.length / (16 * 16); - for (int xc = 0; xc < 16; xc++) + for (int xc = 0; xc < 16; xc++) { - for (int zc = 0; zc < 16; zc++) + for (int zc = 0; zc < 16; zc++) { - for (int yc = 0; yc < height; yc++) + for (int yc = 0; yc < height; yc++) { int block = 0; if ( (yc <= 6) || ( yc >= 121 ) ) { block = Tile::hellRock_Id; - } + } blocks[xc << 11 | zc << 7 | yc] = (byte) block; } @@ -159,8 +159,8 @@ void HellFlatLevelSource::postProcess(ChunkSource *parent, int xt, int zt) // we need to use a separate random - have used the same initialisation code as used in RandomLevelSource::postProcess to make sure this random value // is consistent for each world generation. Also changed all uses of random here to pprandom. pprandom->setSeed(level->getSeed()); - int64_t xScale = pprandom->nextLong() / 2 * 2 + 1; - int64_t zScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); int count = pprandom->nextInt(pprandom->nextInt(10) + 1) + 1; @@ -211,7 +211,7 @@ wstring HellFlatLevelSource::gatherStats() vector *HellFlatLevelSource::getMobsAt(MobCategory *mobCategory, int x, int y, int z) { Biome *biome = level->getBiome(x, z); - if (biome == NULL) + if (biome == NULL) { return NULL; } diff --git a/Minecraft.World/HellFlatLevelSource.h b/Minecraft.World/HellFlatLevelSource.h index c1bd5868..b756d9a6 100644 --- a/Minecraft.World/HellFlatLevelSource.h +++ b/Minecraft.World/HellFlatLevelSource.h @@ -26,7 +26,7 @@ private: Level *level; public: - HellFlatLevelSource(Level *level, int64_t seed); + HellFlatLevelSource(Level *level, __int64 seed); ~HellFlatLevelSource(); private: diff --git a/Minecraft.World/HellRandomLevelSource.cpp b/Minecraft.World/HellRandomLevelSource.cpp index 3d67d0f8..10194f7d 100644 --- a/Minecraft.World/HellRandomLevelSource.cpp +++ b/Minecraft.World/HellRandomLevelSource.cpp @@ -7,7 +7,7 @@ #include "BiomeSource.h" #include "HellRandomLevelSource.h" -HellRandomLevelSource::HellRandomLevelSource(Level *level, int64_t seed) +HellRandomLevelSource::HellRandomLevelSource(Level *level, __int64 seed) { int xzSize = level->getLevelData()->getXZSize(); int hellScale = level->getLevelData()->getHellScale(); @@ -224,7 +224,7 @@ void HellRandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks 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 @@ -430,8 +430,8 @@ void HellRandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) // we need to use a separate random - have used the same initialisation code as used in RandomLevelSource::postProcess to make sure this random value // is consistent for each world generation. Also changed all uses of random here to pprandom. pprandom->setSeed(level->getSeed()); - int64_t xScale = pprandom->nextLong() / 2 * 2 + 1; - int64_t zScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); netherBridgeFeature->postProcess(level, pprandom, xt, zt); @@ -497,7 +497,7 @@ void HellRandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) } HeavyTile::instaFall = false; - + app.processSchematics(parent->getChunk(xt,zt)); } diff --git a/Minecraft.World/HellRandomLevelSource.h b/Minecraft.World/HellRandomLevelSource.h index 634d1828..0587e86a 100644 --- a/Minecraft.World/HellRandomLevelSource.h +++ b/Minecraft.World/HellRandomLevelSource.h @@ -37,7 +37,7 @@ private: Level *level; public: - HellRandomLevelSource(Level *level, int64_t seed); + HellRandomLevelSource(Level *level, __int64 seed); ~HellRandomLevelSource(); NetherBridgeFeature *netherBridgeFeature; @@ -68,5 +68,5 @@ public: 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); }; diff --git a/Minecraft.World/InputStream.h b/Minecraft.World/InputStream.h index 234e85b5..af0ff593 100644 --- a/Minecraft.World/InputStream.h +++ b/Minecraft.World/InputStream.h @@ -11,7 +11,7 @@ public: virtual int read(byteArray b) = 0; virtual int read(byteArray b, unsigned int offset, unsigned int length) = 0; virtual void close() = 0; - virtual int64_t skip(int64_t n) = 0; + virtual __int64 skip(__int64 n) = 0; static InputStream *getResourceAsStream(const wstring &fileName); }; \ No newline at end of file diff --git a/Minecraft.World/IslandLayer.cpp b/Minecraft.World/IslandLayer.cpp index 0a6cc3fa..b502f384 100644 --- a/Minecraft.World/IslandLayer.cpp +++ b/Minecraft.World/IslandLayer.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.level.newbiome.layer.h" -IslandLayer::IslandLayer(int64_t seedMixup) : Layer(seedMixup) +IslandLayer::IslandLayer(__int64 seedMixup) : Layer(seedMixup) { } diff --git a/Minecraft.World/IslandLayer.h b/Minecraft.World/IslandLayer.h index 90995636..09e90eb3 100644 --- a/Minecraft.World/IslandLayer.h +++ b/Minecraft.World/IslandLayer.h @@ -5,7 +5,7 @@ class IslandLayer : public Layer { public: - IslandLayer(int64_t seedMixup); + IslandLayer(__int64 seedMixup); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/JavaMath.cpp b/Minecraft.World/JavaMath.cpp index 87778c56..92843695 100644 --- a/Minecraft.World/JavaMath.cpp +++ b/Minecraft.World/JavaMath.cpp @@ -34,9 +34,9 @@ double Math::random() //a - a floating-point value to be rounded to a long. //Returns: //the value of the argument rounded to the nearest long value. -int64_t Math::round( double d ) +__int64 Math::round( double d ) { - return (int64_t)floor( d + 0.5 ); + return (__int64)floor( d + 0.5 ); } int Math::_max(int a, int b) @@ -59,7 +59,7 @@ float Math::_min(float a, float b) return a < b ? a : b; } -float Math::wrapDegrees(float input) +float Math::wrapDegrees(float input) { while(input>=360.0f)input-=360.0f; if (input >= 180.0f) input -= 360.0f; @@ -67,7 +67,7 @@ float Math::wrapDegrees(float input) return input; } -double Math::wrapDegrees(double input) +double Math::wrapDegrees(double input) { while(input>=360.0)input-=360.0; if (input >= 180.0) input -= 360.0; diff --git a/Minecraft.World/JavaMath.h b/Minecraft.World/JavaMath.h index b64832e9..fcd095c8 100644 --- a/Minecraft.World/JavaMath.h +++ b/Minecraft.World/JavaMath.h @@ -8,7 +8,7 @@ private: public: static double random(); - static int64_t round( double d ); + static __int64 round( double d ); static int _max(int a, int b); static float _max(float a, float b); static int _min(int a, int b); diff --git a/Minecraft.World/LargeCaveFeature.cpp b/Minecraft.World/LargeCaveFeature.cpp index 4db3ca3a..20b83a30 100644 --- a/Minecraft.World/LargeCaveFeature.cpp +++ b/Minecraft.World/LargeCaveFeature.cpp @@ -4,12 +4,12 @@ #include "net.minecraft.world.level.biome.h" #include "LargeCaveFeature.h" -void LargeCaveFeature::addRoom(int64_t seed, int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom) +void LargeCaveFeature::addRoom(__int64 seed, int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom) { addTunnel(seed, xOffs, zOffs, blocks, xRoom, yRoom, zRoom, 1 + random->nextFloat() * 6, 0, 0, -1, -1, 0.5); } -void LargeCaveFeature::addTunnel(int64_t 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) +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; @@ -123,7 +123,7 @@ void LargeCaveFeature::addTunnel(int64_t seed, int xOffs, int zOffs, byteArray b } if (detectedWater) continue; - for (int xx = x0; xx < x1; xx++) + for (int xx = x0; xx < x1; xx++) { double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; for (int zz = z0; zz < z1; zz++) @@ -142,7 +142,7 @@ void LargeCaveFeature::addTunnel(int64_t seed, int xOffs, int zOffs, byteArray b if (block == Tile::grass_Id) hasGrass = true; if (block == Tile::rock_Id || block == Tile::dirt_Id || block == Tile::grass_Id) { - if (yy < 10) + if (yy < 10) { blocks[p] = (byte) Tile::lava_Id; } diff --git a/Minecraft.World/LargeCaveFeature.h b/Minecraft.World/LargeCaveFeature.h index 66eadde9..5188aca7 100644 --- a/Minecraft.World/LargeCaveFeature.h +++ b/Minecraft.World/LargeCaveFeature.h @@ -5,7 +5,7 @@ class LargeCaveFeature : public LargeFeature { protected: - void addRoom(int64_t seed, int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom); - void addTunnel(int64_t 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); + 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/LargeFeature.cpp b/Minecraft.World/LargeFeature.cpp index 23dc532f..2e43fac7 100644 --- a/Minecraft.World/LargeFeature.cpp +++ b/Minecraft.World/LargeFeature.cpp @@ -21,15 +21,15 @@ void LargeFeature::apply(ChunkSource *ChunkSource, Level *level, int xOffs, int this->level = level; random->setSeed(level->getSeed()); - int64_t xScale = random->nextLong(); - int64_t zScale = random->nextLong(); + __int64 xScale = random->nextLong(); + __int64 zScale = random->nextLong(); for (int x = xOffs - r; x <= xOffs + r; x++) { for (int z = zOffs - r; z <= zOffs + r; z++) { - int64_t xx = x * xScale; - int64_t zz = z * zScale; + __int64 xx = x * xScale; + __int64 zz = z * zScale; random->setSeed(xx ^ zz ^ level->getSeed()); addFeature(level, x, z, xOffs, zOffs, blocks); } diff --git a/Minecraft.World/Layer.cpp b/Minecraft.World/Layer.cpp index ca805912..1d010e72 100644 --- a/Minecraft.World/Layer.cpp +++ b/Minecraft.World/Layer.cpp @@ -16,7 +16,7 @@ libdivide::divider fast_d7(7); libdivide::divider fast_d10(10); #endif -LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) +LayerArray Layer::getDefaultLayers(__int64 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 @@ -58,7 +58,7 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) biomeLayer = shared_ptr(new ZoomLayer(1000 + i, 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 @@ -68,13 +68,13 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) } if (i == 1 ) - { + { // 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 = 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 = shared_ptr(new ShoreLayer(1000, biomeLayer)); + biomeLayer = shared_ptr(new ShoreLayer(1000, biomeLayer)); biomeLayer = shared_ptr(new SwampRiversLayer(1000, biomeLayer)); } @@ -107,7 +107,7 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) return result; } -Layer::Layer(int64_t seedMixup) +Layer::Layer(__int64 seedMixup) { parent = nullptr; @@ -120,7 +120,7 @@ Layer::Layer(int64_t seedMixup) this->seedMixup += seedMixup; } -void Layer::init(int64_t seed) +void Layer::init(__int64 seed) { this->seed = seed; if (parent != NULL) parent->init(seed); @@ -132,7 +132,7 @@ void Layer::init(int64_t seed) this->seed += seedMixup; } -void Layer::initRandom(int64_t x, int64_t y) +void Layer::initRandom(__int64 x, __int64 y) { rval = seed; rval *= rval * 6364136223846793005l + 1442695040888963407l; diff --git a/Minecraft.World/Layer.h b/Minecraft.World/Layer.h index 6f31e94a..a444a629 100644 --- a/Minecraft.World/Layer.h +++ b/Minecraft.World/Layer.h @@ -11,22 +11,22 @@ class LevelType; class Layer { private: - int64_t seed; + __int64 seed; protected: shared_ptrparent; private: - int64_t rval; - int64_t seedMixup; + __int64 rval; + __int64 seedMixup; public: - static LayerArray getDefaultLayers(int64_t seed, LevelType *levelType); + static LayerArray getDefaultLayers(__int64 seed, LevelType *levelType); - Layer(int64_t seedMixup); + Layer(__int64 seedMixup); - virtual void init(int64_t seed); - virtual void initRandom(int64_t x, int64_t y); + virtual void init(__int64 seed); + virtual void initRandom(__int64 x, __int64 y); protected: int nextRandom(int max); diff --git a/Minecraft.World/Level.cpp b/Minecraft.World/Level.cpp index c159ecb8..4b6a64f5 100644 --- a/Minecraft.World/Level.cpp +++ b/Minecraft.World/Level.cpp @@ -112,7 +112,7 @@ void Level::initCache(lightCache_t *cache) } // Set a brightness value, going through the cache if enabled for this thread -void inline Level::setBrightnessCached(lightCache_t *cache, uint64_t *cacheUse, LightLayer::variety layer, int x, int y, int z, int brightness) +void inline Level::setBrightnessCached(lightCache_t *cache, __uint64 *cacheUse, LightLayer::variety layer, int x, int y, int z, int brightness) { if( cache == NULL ) { @@ -129,8 +129,8 @@ void inline Level::setBrightnessCached(lightCache_t *cache, uint64_t *cacheUse, ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z - posbits |= ( ( ((uint64_t)x) & 0x3FFFC00L) << 38) | - ( ( ((uint64_t)z) & 0x3FFFC00L) << 22); + posbits |= ( ( ((__uint64)x) & 0x3FFFC00L) << 38) | + ( ( ((__uint64)z) & 0x3FFFC00L) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -188,8 +188,8 @@ inline int Level::getBrightnessCached(lightCache_t *cache, LightLayer::variety l ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z - posbits |= ( ( ((uint64_t)x) & 0x3FFFC00L) << 38) | - ( ( ((uint64_t)z) & 0x3FFFC00L) << 22); + posbits |= ( ( ((__uint64)x) & 0x3FFFC00L) << 38) | + ( ( ((__uint64)z) & 0x3FFFC00L) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -255,8 +255,8 @@ inline int Level::getEmissionCached(lightCache_t *cache, int ct, int x, int y, i ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z - posbits |= ( ( ((uint64_t)x) & 0x3FFFC00) << 38) | - ( ( ((uint64_t)z) & 0x3FFFC00) << 22); + posbits |= ( ( ((__uint64)x) & 0x3FFFC00) << 38) | + ( ( ((__uint64)z) & 0x3FFFC00) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -285,7 +285,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); @@ -331,8 +331,8 @@ inline int Level::getBlockingCached(lightCache_t *cache, LightLayer::variety lay ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z - posbits |= ( ( ((uint64_t)x) & 0x3FFFC00L) << 38) | - ( ( ((uint64_t)z) & 0x3FFFC00L) << 22); + posbits |= ( ( ((__uint64)x) & 0x3FFFC00L) << 38) | + ( ( ((__uint64)z) & 0x3FFFC00L) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -361,7 +361,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); @@ -394,7 +394,7 @@ inline int Level::getBlockingCached(lightCache_t *cache, LightLayer::variety lay // this hasn't been updated (for client threads) for each individual lighting update as would have been the case with the non-cached lighting. There's two reasons for this // (1) it's more efficient, since we aren't doing so many individual calls to the level listener to let the renderer know what has been updated // (2) it lets the lighting actually complete before we get any visual representation of the update, otherwise we end up seeing some strange partial updates -void Level::flushCache(lightCache_t *cache, uint64_t cacheUse, LightLayer::variety layer) +void Level::flushCache(lightCache_t *cache, __uint64 cacheUse, LightLayer::variety layer) { // cacheUse has a single bit for each x, y and z to say whether anything with that x, y or z has been written to if( cacheUse == 0 ) return; @@ -596,7 +596,7 @@ Level::Level(Level *level, Dimension *dimension) 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) { @@ -660,7 +660,7 @@ void Level::_init(shared_ptrlevelStorage, const wstring& levelName //{ // dimension = Dimension::getNew(levelData->getDimension()); //} - else + else { dimension = Dimension::getNew(0); } @@ -676,7 +676,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 @@ -707,7 +707,7 @@ Level::~Level() DeleteCriticalSection(&m_checkLightCS); // 4J-PB - savedDataStorage is shared between overworld and nether levels in the server, so it will already have been deleted on the first level delete - if(savedDataStorage!=NULL) delete savedDataStorage; + if(savedDataStorage!=NULL) delete savedDataStorage; DeleteCriticalSection(&m_entitiesCS); DeleteCriticalSection(&m_tileEntityListCS); @@ -1298,7 +1298,7 @@ int Level::getBrightness(LightLayer::variety layer, int x, int y, int z) // the level chunk once void Level::getNeighbourBrightnesses(int *brightnesses, LightLayer::variety layer, int x, int y, int z) { - if( ( ( ( x & 15 ) == 0 ) || ( ( x & 15 ) == 15 ) ) || + if( ( ( ( x & 15 ) == 0 ) || ( ( x & 15 ) == 15 ) ) || ( ( ( z & 15 ) == 0 ) || ( ( z & 15 ) == 15 ) ) || ( ( y <= 0 ) || ( y >= 127 ) ) ) { @@ -1591,7 +1591,7 @@ 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); } else @@ -1630,7 +1630,7 @@ void Level::playMusic(double x, double y, double z, const wstring& string, float { } -// 4J removed - +// 4J removed - /* void Level::addParticle(const wstring& id, double x, double y, double z, double xd, double yd, double zd) { @@ -2255,7 +2255,7 @@ void Level::tickEntities() { entityRemoved(*it); } - // + // entitiesToRemove.clear(); //for (int i = 0; i < entities.size(); i++) @@ -2268,7 +2268,7 @@ void Level::tickEntities() 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) @@ -2287,7 +2287,7 @@ void Level::tickEntities() { #ifndef _FINAL_BUILD if(!( app.DebugSettingsOn() && app.GetMobsDontTickEnabled() && (dynamic_pointer_cast(e) != NULL) && (dynamic_pointer_cast(e) == NULL))) -#endif +#endif { tick(e); } @@ -2360,7 +2360,7 @@ void Level::tickEntities() // 4J-PB - Stuart - check this is correct here if (!tileEntitiesToUnload.empty()) - { + { //tileEntityList.removeAll(tileEntitiesToUnload); for( AUTO_VAR(it, tileEntityList.begin()); it != tileEntityList.end(); ) @@ -2767,7 +2767,7 @@ shared_ptr Level::explode(shared_ptr source, double x, double shared_ptr Level::explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks) { shared_ptr explosion = shared_ptr( new Explosion(this, source, x, y, z, r) ); - explosion->fire = fire; + explosion->fire = fire; explosion->destroyBlocks = destroyBlocks; explosion->explode(); explosion->finalizeExplosion(true); @@ -2945,7 +2945,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 @@ -3008,7 +3008,7 @@ bool Level::isTopSolidBlocking(int x, int y, int z) if (tile == NULL) return false; if (tile->material->isSolidBlocking() && tile->isCubeShaped()) return true; - if (dynamic_cast(tile) != NULL) + if (dynamic_cast(tile) != NULL) { return (getData(x, y, z) & StairTile::UPSIDEDOWN_BIT) == StairTile::UPSIDEDOWN_BIT; } @@ -3159,7 +3159,7 @@ void Level::toggleDownfall() void Level::buildAndPrepareChunksToPoll() { -#if 0 +#if 0 AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { @@ -3205,7 +3205,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 @@ -3387,7 +3387,7 @@ inline int GetIndex(int x, int y, int z) void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool force, bool rootOnlyEmissive) { lightCache_t *cache = (lightCache_t *)TlsGetValue(tlsIdxLightCache); - uint64_t cacheUse = 0; + __uint64 cacheUse = 0; if( force ) { @@ -3416,7 +3416,7 @@ 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 + // AP - only clear the one array element required to check if something has changed cachewritten = false; if( cache != NULL ) { @@ -3450,7 +3450,7 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f #endif // 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 ) { @@ -3477,7 +3477,7 @@ 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; @@ -3713,7 +3713,7 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f ///////////////////////////////////////////////////////////////// #endif LeaveCriticalSection(&m_checkLightCS); - + } @@ -3905,7 +3905,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) { @@ -4149,7 +4149,7 @@ 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; AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) @@ -4179,7 +4179,7 @@ shared_ptr Level::getNearestAttackablePlayer(double x, double y, double } 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()) { @@ -4318,16 +4318,16 @@ void Level::checkSession() } -void Level::setTime(int64_t time) +void Level::setTime(__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_t timeDiff = time - levelData->getTime(); - + __int64 timeDiff = time - levelData->getTime(); + // debug setting added to keep it at day time -#ifndef _FINAL_BUILD +#ifndef _FINAL_BUILD if(app.DebugSettingsOn()) { if(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<levelData->setTime(time); } -void Level::setOverrideTimeOfDay(int64_t time) +void Level::setOverrideTimeOfDay(__int64 time) { m_timeOfDayOverride = time; } -int64_t Level::getSeed() +__int64 Level::getSeed() { return levelData->getSeed(); } -int64_t Level::getTime() +__int64 Level::getTime() { return levelData->getTime(); } @@ -4529,7 +4529,7 @@ 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) +// 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++) @@ -4565,7 +4565,7 @@ int Level::getHeight() Random *Level::getRandomFor(int x, int z, int blend) { - int64_t seed = (x * 341873128712l + z * 132897987541l) + getLevelData()->getSeed() + blend; + __int64 seed = (x * 341873128712l + z * 132897987541l) + getLevelData()->getSeed() + blend; random->setSeed(seed); return random; } @@ -4585,9 +4585,9 @@ bool Level::isAllEmpty() return false; } -double Level::getHorizonHeight() +double Level::getHorizonHeight() { - if (levelData->getGenerator() == LevelType::lvl_flat) + if (levelData->getGenerator() == LevelType::lvl_flat) { return 0.0; } diff --git a/Minecraft.World/Level.h b/Minecraft.World/Level.h index ecafc02b..361a40e8 100644 --- a/Minecraft.World/Level.h +++ b/Minecraft.World/Level.h @@ -133,7 +133,7 @@ public: Random *random; bool isNew; Dimension *dimension; - + protected: vector listeners; @@ -239,26 +239,26 @@ public: void setBrightnessNoUpdateOnClient(LightLayer::variety layer, int x, int y, int z, int brightness); // 4J added #ifdef _LARGE_WORLDS - typedef uint64_t lightCache_t; + typedef __uint64 lightCache_t; #else typedef unsigned int lightCache_t; #endif - inline void setBrightnessCached(lightCache_t *cache, uint64_t *cacheUse, LightLayer::variety layer, int x, int y, int z, int brightness); + inline void setBrightnessCached(lightCache_t *cache, __uint64 *cacheUse, LightLayer::variety layer, int x, int y, int z, int brightness); 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 flushCache(lightCache_t *cache, uint64_t cacheUse, LightLayer::variety layer); + void flushCache(lightCache_t *cache, __uint64 cacheUse, LightLayer::variety layer); bool cachewritten; static const int LIGHTING_SHIFT = 24; static const int BLOCKING_SHIFT = 20; static const int EMISSION_SHIFT = 16; #ifdef _LARGE_WORLDS - static const int64_t LIGHTING_WRITEBACK = 0x80000000LL; - static const int64_t EMISSION_VALID = 0x40000000LL; - static const int64_t BLOCKING_VALID = 0x20000000LL; - static const int64_t LIGHTING_VALID = 0x10000000LL; + static const __int64 LIGHTING_WRITEBACK = 0x80000000LL; + static const __int64 EMISSION_VALID = 0x40000000LL; + static const __int64 BLOCKING_VALID = 0x20000000LL; + static const __int64 LIGHTING_VALID = 0x10000000LL; static const lightCache_t POSITION_MASK = 0xffffffff0000ffffLL; #else static const int LIGHTING_WRITEBACK = 0x80000000; @@ -402,7 +402,7 @@ 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 *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 public: @@ -449,10 +449,10 @@ 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_t time); - void setOverrideTimeOfDay(int64_t time); // 4J Added so we can override timeOfDay without changing tick time - int64_t getSeed(); - int64_t getTime(); + void setTime(__int64 time); + void setOverrideTimeOfDay(__int64 time); // 4J Added so we can override timeOfDay without changing tick time + __int64 getSeed(); + __int64 getTime(); Pos *getSharedSpawnPos(); void setSpawnPos(int x, int y, int z); void setSpawnPos(Pos *spawnPos); @@ -496,7 +496,7 @@ public: // 4J added - int64_t m_timeOfDayOverride; + __int64 m_timeOfDayOverride; // 4J - optimisation - keep direct reference of underlying cache here LevelChunk **chunkSourceCache; diff --git a/Minecraft.World/LevelChunk.cpp b/Minecraft.World/LevelChunk.cpp index 332f12f5..823c7c4c 100644 --- a/Minecraft.World/LevelChunk.cpp +++ b/Minecraft.World/LevelChunk.cpp @@ -51,7 +51,7 @@ void LevelChunk::init(Level *level, int x, int z) biomes = byteArray(16 * 16); for(int i = 0; i < 16 * 16; i++ ) { - biomes[i] = 0xff; + biomes[i] = 0xff; } #ifdef _ENTITIES_RW_SECTION EnterCriticalRWSection(&m_csEntities, true); @@ -103,12 +103,12 @@ void LevelChunk::init(Level *level, int x, int z) // 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++ ) { - rainHeights[i] = 255; + rainHeights[i] = 255; } // 4J - lighting change brought forward from 1.8.2, introduced an array of bools called gapsToRecheck, which are now a single bit in array of nybble flags in this version for(int i = 0; i < 8 * 16; i++ ) { - columnFlags[i] = 0; + columnFlags[i] = 0; } // 4J added - to flag if any emissive tile has been added to this chunk (will be cleared when lighting has been successfully completed for this chunk). Defaulting to true @@ -183,7 +183,7 @@ LevelChunk::LevelChunk(Level *level, byteArray blocks, int x, int z) : ENTITY_BL // skyLight = new DataLayer(blocks.length, level->depthBits); // blockLight = new DataLayer(blocks.length, level->depthBits); - if(Level::maxBuildHeight > Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + if(Level::maxBuildHeight > Level::COMPRESSED_CHUNK_SECTION_HEIGHT) { if(blocks.length > Level::COMPRESSED_CHUNK_SECTION_TILES) upperBlocks = new CompressedTileStorage(blocks,Level::COMPRESSED_CHUNK_SECTION_TILES); else upperBlocks = new CompressedTileStorage(true); @@ -388,7 +388,7 @@ void LevelChunk::startSharingTilesAndData(int forceMs) else { // Only force if it has been more than forceMs milliseconds since we last wanted to unshare this chunk - int64_t timenow = System::currentTimeMillis(); + __int64 timenow = System::currentTimeMillis(); if( ( timenow - lastUnsharedTime ) < forceMs ) { LeaveCriticalSection(&m_csSharing); @@ -551,7 +551,7 @@ void LevelChunk::recalcHeightmap() { 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; @@ -656,7 +656,7 @@ void LevelChunk::recalcHeightmap() void LevelChunk::lightLava() { if( !emissiveAdded ) return; - + for (int x = 0; x < 16; x++) for (int z = 0; z < 16; z++) { @@ -697,7 +697,7 @@ void LevelChunk::recheckGaps(bool bForce) // 4J added - otherwise we can end up doing a very broken kind of lighting since for an empty chunk, the heightmap is all zero, but it // still has an x and z of 0 which means that the level->getHeightmap references in here find a real chunk near the origin, and then attempt // to light massive gaps between the height of 0 and whatever heights are in those. - if( isEmpty() ) return; + if( isEmpty() ) return; // 4J added int minXZ = - (level->dimension->getXZSize() * 16 ) / 2; @@ -765,7 +765,7 @@ void LevelChunk::lightGap(int x, int z, int source) { lightGap(x, z, source, height + 1); } - else if (height < source) + else if (height < source) { lightGap(x, z, height, source + 1); } @@ -793,7 +793,7 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) if (yStart > yOld) y = yStart; // 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] { @@ -845,7 +845,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) { @@ -891,7 +891,7 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) /** * The purpose of this method is to allow the EmptyLevelChunk to be all air * but still block light. See EmptyLevelChunk.java -* +* * @param x * @param y * @param z @@ -921,7 +921,7 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) } 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); @@ -1116,12 +1116,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); @@ -1227,7 +1227,7 @@ void LevelChunk::removeEntity(shared_ptr e, int yc) // MGH - have to sort this C++11 code static bool bShowMsg = true; if(bShowMsg) - { + { app.DebugPrintf("Need to add C++11 shrink_to_fit for PS3\n"); bShowMsg = false; } @@ -1282,7 +1282,7 @@ shared_ptr LevelChunk::getTileEntity(int x, int y, int z) 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); @@ -1316,7 +1316,7 @@ shared_ptr LevelChunk::getTileEntity(int x, int y, int z) LeaveCriticalSection(&m_csTileEntities); return nullptr; } - + return tileEntity; } @@ -1631,7 +1631,7 @@ void LevelChunk::getEntitiesOfClass(const type_info& ec, AABB *bb, vector > *entities = entityBlocks[yc]; - + AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { @@ -1879,7 +1879,7 @@ void LevelChunk::setCheckAllLight() checkLightPosition = 0; } -Random *LevelChunk::getRandom(int64_t l) +Random *LevelChunk::getRandom(__int64 l) { return new Random((level->getSeed() + x * x * 4987142 + x * 5947611 + z * z * 4392871l + z * 389711) ^ l); } @@ -2130,7 +2130,7 @@ void LevelChunk::setSkyLightDataAllBright() void LevelChunk::compressLighting() { // The lighting data is now generally not shared between host & local client, but is for a while at the start of level creation (until the point where the chunk data would be transferred by network - // data for remote clients). We'll therefore either be compressing a shared copy here or one of the server or client copies depending on + // data for remote clients). We'll therefore either be compressing a shared copy here or one of the server or client copies depending on lowerSkyLight->compress(); upperSkyLight->compress(); lowerBlockLight->compress(); @@ -2400,7 +2400,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; @@ -2439,7 +2439,7 @@ void LevelChunk::reorderBlocksAndDataToXZY(int y0, int xs, int ys, int zs, byteA //setBlocksAndData(*data, x0, y0, z0, x1, y1, z1, p); //// If it is a full chunk, we'll need to rearrange into the order the rest of the game expects - //if( xs == 16 && ys == 128 && zs == 16 && ( ( x & 15 ) == 0 ) && ( y == 0 ) && ( ( z & 15 ) == 0 ) ) + //if( xs == 16 && ys == 128 && zs == 16 && ( ( x & 15 ) == 0 ) && ( y == 0 ) && ( ( z & 15 ) == 0 ) ) //{ // byteArray newBuffer = byteArray(81920); // for( int x = 0; x < 16; x++ ) diff --git a/Minecraft.World/LevelChunk.h b/Minecraft.World/LevelChunk.h index 820835c3..e9510ad5 100644 --- a/Minecraft.World/LevelChunk.h +++ b/Minecraft.World/LevelChunk.h @@ -102,13 +102,13 @@ public: unordered_map, TilePosKeyHash, TilePosKeyEq> tileEntities; vector > **entityBlocks; - + static const int sTerrainPopulatedFromHere = 2; static const int sTerrainPopulatedFromW = 4; static const int sTerrainPopulatedFromS = 8; static const int sTerrainPopulatedFromSW = 16; static const int sTerrainPopulatedAllAffecting = 30; // All the post-processing that can actually place tiles in this chunk are complete - static const int sTerrainPopulatedFromNW = 32; + static const int sTerrainPopulatedFromNW = 32; static const int sTerrainPopulatedFromN = 64; static const int sTerrainPopulatedFromNE = 128; static const int sTerrainPopulatedFromE = 256; @@ -134,8 +134,8 @@ public: void stopSharingTilesAndData(); // 4J added virtual void reSyncLighting(); // 4J added void startSharingTilesAndData(int forceMs = 0); // 4J added - int64_t lastUnsharedTime; // 4J added - int64_t lastSaveTime; + __int64 lastUnsharedTime; // 4J added + __int64 lastSaveTime; bool seenByPlayer; #ifdef _LARGE_WORLDS @@ -213,7 +213,7 @@ public: 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_t l); + virtual Random *getRandom(__int64 l); virtual bool isEmpty(); virtual void attemptCompression(); @@ -238,9 +238,9 @@ public: byteArray getBiomes(); void setBiomes(byteArray biomes); bool biomeHasRain(int x, int z); // 4J added - bool biomeHasSnow(int x, int z); // 4J added + bool biomeHasSnow(int x, int z); // 4J added private: - void updateBiomeFlags(int x, int z); // 4J added + void updateBiomeFlags(int x, int z); // 4J added public: void compressLighting(); // 4J added void compressBlocks(); // 4J added diff --git a/Minecraft.World/LevelData.cpp b/Minecraft.World/LevelData.cpp index 486fbe98..026dca70 100644 --- a/Minecraft.World/LevelData.cpp +++ b/Minecraft.World/LevelData.cpp @@ -14,18 +14,18 @@ LevelData::LevelData(CompoundTag *tag) { seed = tag->getLong(L"RandomSeed"); m_pGenerator = LevelType::lvl_normal; - if (tag->contains(L"generatorName")) + if (tag->contains(L"generatorName")) { wstring generatorName = tag->getString(L"generatorName"); m_pGenerator = LevelType::getLevelType(generatorName); - if (m_pGenerator == NULL) + if (m_pGenerator == NULL) { m_pGenerator = LevelType::lvl_normal; - } - else if (m_pGenerator->hasReplacement()) + } + else if (m_pGenerator->hasReplacement()) { int generatorVersion = 0; - if (tag->contains(L"generatorVersion")) + if (tag->contains(L"generatorVersion")) { generatorVersion = tag->getInt(L"generatorVersion"); } @@ -80,7 +80,7 @@ LevelData::LevelData(CompoundTag *tag) hasBeenInCreative = tag->getBoolean(L"hasBeenInCreative"); // 4J added so we can not award achievements to levels modified in creative // 4J added - for stronghold position - bStronghold = tag->getBoolean(L"hasStronghold"); + bStronghold = tag->getBoolean(L"hasStronghold"); if(bStronghold==false) { @@ -95,7 +95,7 @@ LevelData::LevelData(CompoundTag *tag) } // 4J added - for stronghold end portal position - bStrongholdEndPortal = tag->getBoolean(L"hasStrongholdEndPortal"); + bStrongholdEndPortal = tag->getBoolean(L"hasStrongholdEndPortal"); if(bStrongholdEndPortal==false) { @@ -111,7 +111,7 @@ LevelData::LevelData(CompoundTag *tag) // 4J Added m_xzSize = tag->getInt(L"XZSize"); m_hellScale = tag->getInt(L"HellScale"); - + m_xzSize = min(m_xzSize,LEVEL_MAX_WIDTH); m_xzSize = max(m_xzSize,LEVEL_MIN_WIDTH); @@ -126,20 +126,20 @@ LevelData::LevelData(CompoundTag *tag) } /* 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"); } else - { + { this->loadedPlayerTag = NULL; } */ dimension = 0; } -LevelData::LevelData(LevelSettings *levelSettings, const wstring& levelName) +LevelData::LevelData(LevelSettings *levelSettings, const wstring& levelName) { this->seed = levelSettings->getSeed(); this->gameType = levelSettings->getGameType(); @@ -149,7 +149,7 @@ LevelData::LevelData(LevelSettings *levelSettings, const wstring& levelName) this->m_pGenerator = levelSettings->getLevelType(); this->hardcore = levelSettings->isHardcore(); - // 4J Stu - Default initers + // 4J Stu - Default initers this->xSpawn = 0; this->ySpawn = 0; this->zSpawn = 0; @@ -179,7 +179,7 @@ LevelData::LevelData(LevelSettings *levelSettings, const wstring& levelName) this->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); @@ -243,13 +243,13 @@ 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(); } -void LevelData::setTagData(CompoundTag *tag) +void LevelData::setTagData(CompoundTag *tag) { tag->putLong(L"RandomSeed", seed); tag->putString(L"generatorName", m_pGenerator->getGeneratorName()); @@ -287,17 +287,17 @@ void LevelData::setTagData(CompoundTag *tag) tag->putInt(L"HellScale", m_hellScale); } -int64_t LevelData::getSeed() +__int64 LevelData::getSeed() { return seed; } -int LevelData::getXSpawn() +int LevelData::getXSpawn() { return xSpawn; } -int LevelData::getYSpawn() +int LevelData::getYSpawn() { return ySpawn; } @@ -307,7 +307,7 @@ int LevelData::getZSpawn() return zSpawn; } -int LevelData::getXStronghold() +int LevelData::getXStronghold() { return xStronghold; } @@ -318,7 +318,7 @@ int LevelData::getZStronghold() return zStronghold; } -int LevelData::getXStrongholdEndPortal() +int LevelData::getXStrongholdEndPortal() { return xStrongholdEndPortal; } @@ -329,12 +329,12 @@ int LevelData::getZStrongholdEndPortal() return zStrongholdEndPortal; } -int64_t LevelData::getTime() +__int64 LevelData::getTime() { return time; } -int64_t LevelData::getSizeOnDisk() +__int64 LevelData::getSizeOnDisk() { return sizeOnDisk; } @@ -350,7 +350,7 @@ CompoundTag *LevelData::getLoadedPlayerTag() // return dimension; //} -void LevelData::setSeed(int64_t seed) +void LevelData::setSeed(__int64 seed) { this->seed = seed; } @@ -360,7 +360,7 @@ void LevelData::setXSpawn(int xSpawn) this->xSpawn = xSpawn; } -void LevelData::setYSpawn(int ySpawn) +void LevelData::setYSpawn(int ySpawn) { this->ySpawn = ySpawn; } @@ -411,12 +411,12 @@ void LevelData::setZStrongholdEndPortal(int zStrongholdEndPortal) this->zStrongholdEndPortal = zStrongholdEndPortal; } -void LevelData::setTime(int64_t time) +void LevelData::setTime(__int64 time) { this->time = time; } -void LevelData::setSizeOnDisk(int64_t sizeOnDisk) +void LevelData::setSizeOnDisk(__int64 sizeOnDisk) { this->sizeOnDisk = sizeOnDisk; } @@ -428,7 +428,7 @@ void LevelData::setLoadedPlayerTag(CompoundTag *loadedPlayerTag) } // 4J Remove TU9 as it's never used -//void LevelData::setDimension(int dimension) +//void LevelData::setDimension(int dimension) //{ // this->dimension = dimension; //} @@ -440,7 +440,7 @@ void LevelData::setSpawn(int xSpawn, int ySpawn, int zSpawn) this->zSpawn = zSpawn; } -wstring LevelData::getLevelName() +wstring LevelData::getLevelName() { return levelName; } @@ -450,7 +450,7 @@ void LevelData::setLevelName(const wstring& levelName) this->levelName = levelName; } -int LevelData::getVersion() +int LevelData::getVersion() { return version; } @@ -460,7 +460,7 @@ void LevelData::setVersion(int version) this->version = version; } -int64_t LevelData::getLastPlayed() +__int64 LevelData::getLastPlayed() { return lastPlayed; } @@ -485,7 +485,7 @@ void LevelData::setThunderTime(int thunderTime) this->thunderTime = thunderTime; } -bool LevelData::isRaining() +bool LevelData::isRaining() { return raining; } @@ -543,12 +543,12 @@ void LevelData::setHasBeenInCreative(bool value) hasBeenInCreative = value; } -LevelType *LevelData::getGenerator() +LevelType *LevelData::getGenerator() { return m_pGenerator; } -void LevelData::setGenerator(LevelType *generator) +void LevelData::setGenerator(LevelType *generator) { m_pGenerator = generator; } diff --git a/Minecraft.World/LevelData.h b/Minecraft.World/LevelData.h index 405ba1b8..0afe9be2 100644 --- a/Minecraft.World/LevelData.h +++ b/Minecraft.World/LevelData.h @@ -11,14 +11,14 @@ class LevelData { friend class DerivedLevelData; private: - int64_t seed; + __int64 seed; LevelType *m_pGenerator;// = LevelType.normal; int xSpawn; int ySpawn; int zSpawn; - int64_t time; - int64_t lastPlayed; - int64_t sizeOnDisk; + __int64 time; + __int64 lastPlayed; + __int64 sizeOnDisk; // CompoundTag *loadedPlayerTag; // 4J removed int dimension; wstring levelName; @@ -71,7 +71,7 @@ protected: virtual void setTagData(CompoundTag *tag); // 4J - removed CompoundTag *playerTag public: - virtual int64_t getSeed(); + virtual __int64 getSeed(); virtual int getXSpawn(); virtual int getYSpawn(); virtual int getZSpawn(); @@ -79,11 +79,11 @@ public: virtual int getZStronghold(); virtual int getXStrongholdEndPortal(); virtual int getZStrongholdEndPortal(); - virtual int64_t getTime(); - virtual int64_t getSizeOnDisk(); + virtual __int64 getTime(); + virtual __int64 getSizeOnDisk(); virtual CompoundTag *getLoadedPlayerTag(); //int getDimension(); // 4J Removed TU 9 as it's never accurate - virtual void setSeed(int64_t seed); + virtual void setSeed(__int64 seed); virtual void setXSpawn(int xSpawn); virtual void setYSpawn(int ySpawn); virtual void setZSpawn(int zSpawn); @@ -96,8 +96,8 @@ public: virtual void setXStrongholdEndPortal(int xStrongholdEndPortal); virtual void setZStrongholdEndPortal(int zStrongholdEndPortal); - virtual void setTime(int64_t time); - virtual void setSizeOnDisk(int64_t sizeOnDisk); + 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); @@ -105,7 +105,7 @@ public: virtual void setLevelName(const wstring& levelName); virtual int getVersion(); virtual void setVersion(int version); - virtual int64_t getLastPlayed(); + virtual __int64 getLastPlayed(); virtual bool isThundering(); virtual void setThundering(bool thundering); virtual int getThunderTime(); diff --git a/Minecraft.World/LevelSettings.cpp b/Minecraft.World/LevelSettings.cpp index 1af62626..59faa1ca 100644 --- a/Minecraft.World/LevelSettings.cpp +++ b/Minecraft.World/LevelSettings.cpp @@ -85,7 +85,7 @@ GameType *GameType::byName(const wstring &name) return SURVIVAL; } -void LevelSettings::_init(int64_t seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale) +void LevelSettings::_init(__int64 seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale) { this->seed = seed; this->gameType = gameType; @@ -99,11 +99,11 @@ void LevelSettings::_init(int64_t seed, GameType *gameType, bool generateMapFeat m_hellScale = hellScale; } -LevelSettings::LevelSettings(int64_t seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale) : - seed(seed), - gameType(gameType), +LevelSettings::LevelSettings(__int64 seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale) : + seed(seed), + gameType(gameType), hardcore(hardcore), - generateMapFeatures(generateMapFeatures), + generateMapFeatures(generateMapFeatures), newSeaLevel(newSeaLevel), levelType(levelType), startingBonusItems(false) @@ -133,7 +133,7 @@ bool LevelSettings::hasStartingBonusItems() return startingBonusItems; } -int64_t LevelSettings::getSeed() +__int64 LevelSettings::getSeed() { return seed; } @@ -148,7 +148,7 @@ bool LevelSettings::isHardcore() return hardcore; } -LevelType *LevelSettings::getLevelType() +LevelType *LevelSettings::getLevelType() { return levelType; } diff --git a/Minecraft.World/LevelSettings.h b/Minecraft.World/LevelSettings.h index 2de2330a..c183df8c 100644 --- a/Minecraft.World/LevelSettings.h +++ b/Minecraft.World/LevelSettings.h @@ -35,7 +35,7 @@ public: class LevelSettings { private: - int64_t seed; + __int64 seed; GameType *gameType; bool generateMapFeatures; bool hardcore; @@ -46,15 +46,15 @@ private: int m_xzSize; // 4J Added int m_hellScale; - void _init(int64_t seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale); // 4J Added xzSize and hellScale param + void _init(__int64 seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale); // 4J Added xzSize and hellScale param public: - LevelSettings(int64_t seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale); // 4J Added xzSize and hellScale param + LevelSettings(__int64 seed, GameType *gameType, bool generateMapFeatures, bool hardcore, bool newSeaLevel, LevelType *levelType, int xzSize, int hellScale); // 4J Added xzSize and hellScale param LevelSettings(LevelData *levelData); LevelSettings *enableStartingBonusItems(); // 4J - brought forward from 1.3.2 LevelSettings *enableSinglePlayerCommands(); bool hasStartingBonusItems(); // 4J - brought forward from 1.3.2 - int64_t getSeed(); + __int64 getSeed(); GameType *getGameType(); bool isHardcore(); LevelType *getLevelType(); diff --git a/Minecraft.World/LevelSummary.cpp b/Minecraft.World/LevelSummary.cpp index 915abaf6..d8e7ddee 100644 --- a/Minecraft.World/LevelSummary.cpp +++ b/Minecraft.World/LevelSummary.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "LevelSummary.h" -LevelSummary::LevelSummary(const wstring& levelId, const wstring& levelName, int64_t lastPlayed, int64_t sizeOnDisk, GameType *gameMode, bool requiresConversion, bool hardcore, bool hasCheats) : +LevelSummary::LevelSummary(const wstring& levelId, const wstring& levelName, __int64 lastPlayed, __int64 sizeOnDisk, GameType *gameMode, bool requiresConversion, bool hardcore, bool hasCheats) : levelId( levelId ), levelName( levelName ), lastPlayed( lastPlayed ), @@ -13,7 +13,7 @@ LevelSummary::LevelSummary(const wstring& levelId, const wstring& levelName, int { } -wstring LevelSummary::getLevelId() +wstring LevelSummary::getLevelId() { return levelId; } @@ -23,28 +23,28 @@ wstring LevelSummary::getLevelName() return levelName; } -int64_t LevelSummary::getSizeOnDisk() +__int64 LevelSummary::getSizeOnDisk() { return sizeOnDisk; } -bool LevelSummary::isRequiresConversion() +bool LevelSummary::isRequiresConversion() { return requiresConversion; } -int64_t LevelSummary::getLastPlayed() +__int64 LevelSummary::getLastPlayed() { return lastPlayed; } -int LevelSummary::compareTo(LevelSummary *rhs) +int LevelSummary::compareTo(LevelSummary *rhs) { if (lastPlayed < rhs->lastPlayed) { return 1; } - if (lastPlayed > rhs->lastPlayed) + if (lastPlayed > rhs->lastPlayed) { return -1; } diff --git a/Minecraft.World/LevelSummary.h b/Minecraft.World/LevelSummary.h index ce5699a2..bbf391ff 100644 --- a/Minecraft.World/LevelSummary.h +++ b/Minecraft.World/LevelSummary.h @@ -7,20 +7,20 @@ class LevelSummary { const wstring levelId; const wstring levelName; - const int64_t lastPlayed; - const int64_t sizeOnDisk; + const __int64 lastPlayed; + const __int64 sizeOnDisk; const bool requiresConversion; GameType *gameMode; const bool hardcore; const bool _hasCheats; public: - LevelSummary(const wstring& levelId, const wstring& levelName, int64_t lastPlayed, int64_t sizeOnDisk, GameType *gameMode, bool requiresConversion, bool hardcore, bool hasCheats); + LevelSummary(const wstring& levelId, const wstring& levelName, __int64 lastPlayed, __int64 sizeOnDisk, GameType *gameMode, bool requiresConversion, bool hardcore, bool hasCheats); wstring getLevelId(); wstring getLevelName(); - int64_t getSizeOnDisk(); + __int64 getSizeOnDisk(); bool isRequiresConversion(); - int64_t getLastPlayed(); + __int64 getLastPlayed(); int compareTo(LevelSummary *rhs); GameType *getGameMode(); bool isHardcore(); diff --git a/Minecraft.World/LightningBolt.h b/Minecraft.World/LightningBolt.h index 2a14e88a..28d5e004 100644 --- a/Minecraft.World/LightningBolt.h +++ b/Minecraft.World/LightningBolt.h @@ -16,7 +16,7 @@ private: int life; public: - int64_t seed; + __int64 seed; private: int flashes; diff --git a/Minecraft.World/LoginPacket.cpp b/Minecraft.World/LoginPacket.cpp index 44ed62b3..bfe69226 100644 --- a/Minecraft.World/LoginPacket.cpp +++ b/Minecraft.World/LoginPacket.cpp @@ -66,7 +66,7 @@ LoginPacket::LoginPacket(const wstring& userName, int clientVersion, PlayerUID o } // Server -> Client -LoginPacket::LoginPacket(const wstring& userName, int clientVersion, LevelType *pLevelType, int64_t seed, int gameType, char dimension, BYTE mapHeight, BYTE maxPlayers, char difficulty, INT multiplayerInstanceId, BYTE playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale) +LoginPacket::LoginPacket(const wstring& userName, int clientVersion, LevelType *pLevelType, __int64 seed, int gameType, char dimension, BYTE mapHeight, BYTE maxPlayers, char difficulty, INT multiplayerInstanceId, BYTE playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale) { this->userName = userName; this->clientVersion = clientVersion; @@ -94,13 +94,13 @@ LoginPacket::LoginPacket(const wstring& userName, int clientVersion, LevelType * m_hellScale = hellScale; } -void LoginPacket::read(DataInputStream *dis) //throws IOException +void LoginPacket::read(DataInputStream *dis) //throws IOException { clientVersion = dis->readInt(); userName = readUtf(dis, Player::MAX_NAME_LENGTH); wstring typeName = readUtf(dis, 16); m_pLevelType = LevelType::getLevelType(typeName); - if (m_pLevelType == NULL) + if (m_pLevelType == NULL) { m_pLevelType = LevelType::lvl_normal; } @@ -131,15 +131,15 @@ void LoginPacket::read(DataInputStream *dis) //throws IOException } -void LoginPacket::write(DataOutputStream *dos) //throws IOException +void LoginPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(clientVersion); writeUtf(userName, dos); - if (m_pLevelType == NULL) + if (m_pLevelType == NULL) { writeUtf(L"", dos); - } - else + } + else { writeUtf(m_pLevelType->getGeneratorName(), dos); } @@ -171,13 +171,13 @@ void LoginPacket::handle(PacketListener *listener) listener->handleLogin(shared_from_this()); } -int LoginPacket::getEstimatedSize() +int LoginPacket::getEstimatedSize() { int length=0; - if (m_pLevelType != NULL) + if (m_pLevelType != NULL) { length = (int)m_pLevelType->getGeneratorName().length(); } - return (int)(sizeof(int) + userName.length() + 4 + 6 + sizeof(int64_t) + sizeof(char) + sizeof(int) + (2*sizeof(PlayerUID)) +1 + sizeof(char) + sizeof(BYTE) + sizeof(bool) + sizeof(bool) + length + sizeof(unsigned int)); + return (int)(sizeof(int) + userName.length() + 4 + 6 + sizeof(__int64) + sizeof(char) + sizeof(int) + (2*sizeof(PlayerUID)) +1 + sizeof(char) + sizeof(BYTE) + sizeof(bool) + sizeof(bool) + length + sizeof(unsigned int)); } diff --git a/Minecraft.World/LoginPacket.h b/Minecraft.World/LoginPacket.h index bf7164fa..09041135 100644 --- a/Minecraft.World/LoginPacket.h +++ b/Minecraft.World/LoginPacket.h @@ -9,10 +9,10 @@ class LoginPacket : public Packet, public enable_shared_from_this public: int clientVersion; wstring userName; - int64_t seed; + __int64 seed; char dimension; PlayerUID m_offlineXuid, m_onlineXuid; // 4J Added - char difficulty; // 4J Added + char difficulty; // 4J Added bool m_friendsOnlyUGC; // 4J Added DWORD m_ugcPlayersVersion; // 4J Added INT m_multiplayerInstanceId; //4J Added for sentient @@ -31,7 +31,7 @@ public: BYTE maxPlayers; LoginPacket(); - LoginPacket(const wstring& userName, int clientVersion, LevelType *pLevelType, int64_t seed, int gameType, char dimension, BYTE mapHeight, BYTE maxPlayers, char difficulty, INT m_multiplayerInstanceId, BYTE playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale); // Server -> Client + LoginPacket(const wstring& userName, int clientVersion, LevelType *pLevelType, __int64 seed, int gameType, char dimension, BYTE mapHeight, BYTE maxPlayers, char difficulty, INT m_multiplayerInstanceId, BYTE playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale); // Server -> Client LoginPacket(const wstring& userName, int clientVersion, PlayerUID offlineXuid, PlayerUID onlineXuid, bool friendsOnlyUGC, DWORD ugcPlayersVersion, DWORD skinId, DWORD capeId, bool isGuest); // Client -> Server virtual void read(DataInputStream *dis); diff --git a/Minecraft.World/LongTag.h b/Minecraft.World/LongTag.h index b957ec6d..2dcd3819 100644 --- a/Minecraft.World/LongTag.h +++ b/Minecraft.World/LongTag.h @@ -4,10 +4,10 @@ class LongTag : public Tag { public: - int64_t data; + __int64 data; LongTag(const wstring &name) : Tag(name) {} - LongTag(const wstring &name, int64_t data) : Tag(name) {this->data = data; } - + 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(); } diff --git a/Minecraft.World/McRegionChunkStorage.cpp b/Minecraft.World/McRegionChunkStorage.cpp index 8075bc80..a11cb1c1 100644 --- a/Minecraft.World/McRegionChunkStorage.cpp +++ b/Minecraft.World/McRegionChunkStorage.cpp @@ -32,7 +32,7 @@ McRegionChunkStorage::McRegionChunkStorage(ConsoleSaveFile *saveFile, const wstr m_saveFile->createFile(ConsoleSavePath(L"r.-1.0.mcr")); } - + #ifdef SPLIT_SAVES ConsoleSavePath currentFile = ConsoleSavePath( m_prefix + wstring( L"entities.dat" ) ); @@ -45,7 +45,7 @@ McRegionChunkStorage::McRegionChunkStorage(ConsoleSaveFile *saveFile, const wstr for(int i = 0; i < count; ++i) { - int64_t index = dis.readLong(); + __int64 index = dis.readLong(); CompoundTag *tag = NbtIo::read(&dis); ByteArrayOutputStream bos; @@ -78,7 +78,7 @@ LevelChunk *McRegionChunkStorage::load(Level *level, int x, int z) // If we can't find the chunk in the save file, then we should remove any entities we might have for that chunk if(regionChunkInputStream == NULL) { - int64_t index = ((int64_t)(x) << 32) | (((int64_t)(z))&0x00000000FFFFFFFF); + __int64 index = ((__int64)(x) << 32) | (((__int64)(z))&0x00000000FFFFFFFF); AUTO_VAR(it, m_entityData.find(index)); if(it != m_entityData.end()) @@ -235,7 +235,7 @@ void McRegionChunkStorage::saveEntities(Level *level, LevelChunk *levelChunk) { #ifdef SPLIT_SAVES PIXBeginNamedEvent(0,"Saving entities"); - int64_t index = ((int64_t)(levelChunk->x) << 32) | (((int64_t)(levelChunk->z))&0x00000000FFFFFFFF); + __int64 index = ((__int64)(levelChunk->x) << 32) | (((__int64)(levelChunk->z))&0x00000000FFFFFFFF); delete m_entityData[index].data; @@ -269,8 +269,8 @@ void McRegionChunkStorage::saveEntities(Level *level, LevelChunk *levelChunk) void McRegionChunkStorage::loadEntities(Level *level, LevelChunk *levelChunk) { #ifdef SPLIT_SAVES - int64_t index = ((int64_t)(levelChunk->x) << 32) | (((int64_t)(levelChunk->z))&0x00000000FFFFFFFF); - + __int64 index = ((__int64)(levelChunk->x) << 32) | (((__int64)(levelChunk->z))&0x00000000FFFFFFFF); + AUTO_VAR(it, m_entityData.find(index)); if(it != m_entityData.end()) { diff --git a/Minecraft.World/McRegionChunkStorage.h b/Minecraft.World/McRegionChunkStorage.h index 47ae1c99..50dabd52 100644 --- a/Minecraft.World/McRegionChunkStorage.h +++ b/Minecraft.World/McRegionChunkStorage.h @@ -16,7 +16,7 @@ private: ConsoleSaveFile *m_saveFile; static CRITICAL_SECTION cs_memory; - unordered_map m_entityData; + unordered_map<__int64, byteArray> m_entityData; static std::deque s_chunkDataQueue; static int s_runningThreadCount; diff --git a/Minecraft.World/Mth.cpp b/Minecraft.World/Mth.cpp index 3b5412ad..eccd828e 100644 --- a/Minecraft.World/Mth.cpp +++ b/Minecraft.World/Mth.cpp @@ -50,9 +50,9 @@ int Mth::floor(float v) return v < i ? i - 1 : i; } -int64_t Mth::lfloor(double v) +__int64 Mth::lfloor(double v) { - int64_t i = (int64_t) v; + __int64 i = (__int64) v; return v < i ? i - 1 : i; } diff --git a/Minecraft.World/Mth.h b/Minecraft.World/Mth.h index 78c3ef10..17119fb1 100644 --- a/Minecraft.World/Mth.h +++ b/Minecraft.World/Mth.h @@ -22,7 +22,7 @@ public : static float sqrt(float x); static float sqrt(double x); static int floor(float v); - static int64_t lfloor(double v); + static __int64 lfloor(double v); static int fastFloor(double x); static int floor(double v); static int absFloor(double v); diff --git a/Minecraft.World/NbtSlotFile.cpp b/Minecraft.World/NbtSlotFile.cpp index 0d679897..81880cfb 100644 --- a/Minecraft.World/NbtSlotFile.cpp +++ b/Minecraft.World/NbtSlotFile.cpp @@ -4,7 +4,7 @@ byteArray NbtSlotFile::READ_BUFFER(1024*1024); -int64_t NbtSlotFile::largest = 0; +__int64 NbtSlotFile::largest = 0; NbtSlotFile::NbtSlotFile(File file) { @@ -144,12 +144,12 @@ int NbtSlotFile::getFreeSlot() // fileSlot = toReplace->back(); // toReplace->pop_back(); // } else - + if (freeFileSlots.size() > 0) { fileSlot = freeFileSlots.back(); freeFileSlots.pop_back(); - } + } else { fileSlot = totalFileSlots++; @@ -164,7 +164,7 @@ void NbtSlotFile::replaceSlot(int slot, vector *tags) DWORD numberOfBytesWritten; toReplace = fileSlotMap[slot]; fileSlotMap[slot] = new vector(); - + AUTO_VAR(itEndTags, tags->end()); for (AUTO_VAR(it, tags->begin()); it != itEndTags; it++) { @@ -227,7 +227,7 @@ void NbtSlotFile::replaceSlot(int slot, vector *tags) } delete[] compressed.data; } - + AUTO_VAR(itEndToRep, toReplace->end()); for (AUTO_VAR(it, toReplace->begin()); it != itEndToRep; it++) { diff --git a/Minecraft.World/NbtSlotFile.h b/Minecraft.World/NbtSlotFile.h index c717c657..93b4fe57 100644 --- a/Minecraft.World/NbtSlotFile.h +++ b/Minecraft.World/NbtSlotFile.h @@ -19,7 +19,7 @@ private: int fileSlotMapLength; vector freeFileSlots; int totalFileSlots; - static int64_t largest; + static __int64 largest; public: NbtSlotFile(File file); diff --git a/Minecraft.World/NotGateTile.cpp b/Minecraft.World/NotGateTile.cpp index d9fc35a7..a3971284 100644 --- a/Minecraft.World/NotGateTile.cpp +++ b/Minecraft.World/NotGateTile.cpp @@ -121,7 +121,7 @@ void NotGateTile::tick(Level *level, int x, int y, int z, Random *random) } } - if (on) + if (on) { if (neighborSignal) { @@ -152,7 +152,7 @@ void NotGateTile::tick(Level *level, int x, int y, int z, Random *random) level->setTileAndData(x, y, z, Tile::notGate_on_Id, level->getData(x, y, z)); } else - { + { app.DebugPrintf("Torch at (%d,%d,%d) has toggled too many times\n",x,y,z); } } @@ -221,7 +221,7 @@ int NotGateTile::cloneTileId(Level *level, int x, int y, int z) return Tile::notGate_on_Id; } -void NotGateTile::levelTimeChanged(Level *level, int64_t delta, int64_t newTime) +void NotGateTile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime) { deque *toggles = recentToggles[level]; diff --git a/Minecraft.World/NotGateTile.h b/Minecraft.World/NotGateTile.h index ea0aac1e..52dd4a2e 100644 --- a/Minecraft.World/NotGateTile.h +++ b/Minecraft.World/NotGateTile.h @@ -19,9 +19,9 @@ public: { public: int x, y, z; - int64_t when; + __int64 when; - Toggle(int x, int y, int z, int64_t when) + Toggle(int x, int y, int z, __int64 when) { this->x = x; this->y = y; @@ -61,7 +61,7 @@ public: 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_t delta, int64_t newTime); + void levelTimeChanged(Level *level, __int64 delta, __int64 newTime); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/OldChunkStorage.cpp b/Minecraft.World/OldChunkStorage.cpp index c1515c12..50c29a96 100644 --- a/Minecraft.World/OldChunkStorage.cpp +++ b/Minecraft.World/OldChunkStorage.cpp @@ -103,7 +103,7 @@ File OldChunkStorage::getFile(int x, int z) file = File( file, wstring( name ) ); if ( !file.exists() ) { - if (!create) + if (!create) { return File(L""); } @@ -163,7 +163,7 @@ void OldChunkStorage::save(Level *level, LevelChunk *levelChunk) { LevelData *levelData = level->getLevelData(); levelData->setSizeOnDisk( levelData->getSizeOnDisk() - file.length() ); - } + } // 4J - removed try/catch // try { @@ -202,7 +202,7 @@ bool OldChunkStorage::saveEntities(LevelChunk *lc, Level *level, CompoundTag *ta lc->lastSaveHadEntities = false; ListTag *entityTags = new ListTag(); - + #ifdef _ENTITIES_RW_SECTION EnterCriticalRWSection(&lc->m_csEntities, true); #else @@ -263,7 +263,7 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, DataOutputStream *dos) #ifndef SPLIT_SAVES saveEntities(lc, level, tag); #endif - + PIXBeginNamedEvent(0,"Saving tile entities"); ListTag *tileEntityTags = new ListTag(); @@ -283,7 +283,7 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, DataOutputStream *dos) vector *ticksInChunk = level->fetchTicksInChunk(lc, false); if (ticksInChunk != NULL) { - int64_t levelTime = level->getTime(); + __int64 levelTime = level->getTime(); ListTag *tickTags = new ListTag(); for( int i = 0; i < ticksInChunk->size(); i++ ) @@ -372,7 +372,7 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, CompoundTag *tag) vector *ticksInChunk = level->fetchTicksInChunk(lc, false); if (ticksInChunk != NULL) { - int64_t levelTime = level->getTime(); + __int64 levelTime = level->getTime(); ListTag *tickTags = new ListTag(); for( int i = 0; i < ticksInChunk->size(); i++ ) @@ -442,7 +442,7 @@ LevelChunk *OldChunkStorage::load(Level *level, DataInputStream *dis) dis->readFully(levelChunk->heightmap); - levelChunk->terrainPopulated = dis->readShort(); + levelChunk->terrainPopulated = dis->readShort(); // If all neighbours have been post-processed, then we should have done the post-post-processing now. Check that this is set as if it isn't then we won't be able // to send network data for chunks, and we won't ever try and set it again as all the directional flags are now already set - should only be an issue for old maps // before this flag was added. @@ -512,13 +512,13 @@ LevelChunk *OldChunkStorage::load(Level *level, CompoundTag *tag) if( tag->get(L"TerrainPopulated") ) { // Java bool type or byte bitfield - levelChunk->terrainPopulated = tag->getByte(L"TerrainPopulated"); + levelChunk->terrainPopulated = tag->getByte(L"TerrainPopulated"); if( levelChunk->terrainPopulated >= 1 ) levelChunk->terrainPopulated = LevelChunk::sTerrainPopulatedAllNeighbours | LevelChunk::sTerrainPostPostProcessed; // Convert from old bool type to new bitfield } else { // New style short - levelChunk->terrainPopulated = tag->getShort(L"TerrainPopulatedFlags"); + levelChunk->terrainPopulated = tag->getShort(L"TerrainPopulatedFlags"); // If all neighbours have been post-processed, then we should have done the post-post-processing now. Check that this is set as if it isn't then we won't be able // to send network data for chunks, and we won't ever try and set it again as all the directional flags are now already set - should only be an issue for old maps // before this flag was added. diff --git a/Minecraft.World/Packet.cpp b/Minecraft.World/Packet.cpp index 8bac8629..0a59204c 100644 --- a/Minecraft.World/Packet.cpp +++ b/Minecraft.World/Packet.cpp @@ -30,7 +30,7 @@ void Packet::staticCtor() map(8, true, false, true, true, typeid(SetHealthPacket), SetHealthPacket::create); map(9, true, true, true, false, typeid(RespawnPacket), RespawnPacket::create); - map(10, true, true, true, false, typeid(MovePlayerPacket), MovePlayerPacket::create); + map(10, true, true, true, false, typeid(MovePlayerPacket), MovePlayerPacket::create); map(11, true, true, true, true, typeid(MovePlayerPacket::Pos), MovePlayerPacket::Pos::create); map(12, true, true, true, true, typeid(MovePlayerPacket::Rot), MovePlayerPacket::Rot::create); map(13, true, true, true, true, typeid(MovePlayerPacket::PosRot), MovePlayerPacket::PosRot::create); @@ -254,7 +254,7 @@ void Packet::renderAllPacketStats() void Packet::renderAllPacketStatsKey() { -#ifndef _CONTENT_PACKAGE +#ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING Minecraft *pMinecraft = Minecraft::GetInstance(); int total = Packet::renderableStats.size(); @@ -271,9 +271,9 @@ void Packet::renderAllPacketStatsKey() #endif } -int64_t Packet::getIndexedStatValue(unsigned int samplePos, unsigned int renderableId) +__int64 Packet::getIndexedStatValue(unsigned int samplePos, unsigned int renderableId) { - int64_t val = 0; + __int64 val = 0; #ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING @@ -285,13 +285,13 @@ int64_t Packet::getIndexedStatValue(unsigned int samplePos, unsigned int rendera } -shared_ptr Packet::getPacket(int id) +shared_ptr Packet::getPacket(int id) { // 4J - removed try/catch // try // { return idToCreateMap[id](); - // } + // } // catch (exception e) // { // // TODO 4J JEV print stack trace, newInstance doesnt throw an exception in c++ yet. @@ -366,11 +366,11 @@ shared_ptr Packet::readPacket(DataInputStream *dis, bool isServer) // th packet = getPacket(id); if (packet == NULL) assert(false);//throw new IOException(wstring(L"Bad packet id ") + _toString(id)); - + //app.DebugPrintf("%s reading packet %d\n", isServer ? "Server" : "Client", packet->getId()); packet->read(dis); // } - // catch (EOFException e) + // catch (EOFException e) // { // // reached end of stream // OutputDebugString("Reached end of stream"); @@ -409,7 +409,7 @@ void Packet::writePacket(shared_ptr packet, DataOutputStream *dos) // th void Packet::writeUtf(const wstring& value, DataOutputStream *dos) // throws IOException TODO 4J JEV, should this declare a throws? { #if 0 - if (value.length() > Short::MAX_VALUE) + if (value.length() > Short::MAX_VALUE) { throw new IOException(L"String too big"); } @@ -437,7 +437,7 @@ wstring Packet::readUtf(DataInputStream *dis, int maxLength) // throws IOExcepti } wstring builder = L""; - for (int i = 0; i < stringLength; i++) + for (int i = 0; i < stringLength; i++) { wchar_t rc = dis->readChar(); builder.push_back( rc ); @@ -455,12 +455,12 @@ void Packet::PacketStatistics::addPacket(int bytes) count++; totalSize += bytes; - // 4J Added + // 4J Added countSamples[samplesPos & (512 - 1)]++; sizeSamples[samplesPos & (512 - 1)] += (unsigned int) bytes; } -int Packet::PacketStatistics::getCount() +int Packet::PacketStatistics::getCount() { return count; } @@ -489,7 +489,7 @@ void Packet::PacketStatistics::renderStats( ) #endif } -int64_t Packet::PacketStatistics::getCountSample(int samplePos) +__int64 Packet::PacketStatistics::getCountSample(int samplePos) { if(samplePos == 511) { diff --git a/Minecraft.World/Packet.h b/Minecraft.World/Packet.h index 0bafe443..60410df3 100644 --- a/Minecraft.World/Packet.h +++ b/Minecraft.World/Packet.h @@ -15,17 +15,17 @@ typedef shared_ptr (*packetCreateFn)(); class Packet { public: - class PacketStatistics + class PacketStatistics { private: int count; int totalSize; // 4J Added - int64_t countSamples[512]; - int64_t sizeSamples[512]; + __int64 countSamples[512]; + __int64 sizeSamples[512]; int samplesPos; - int64_t firstSampleTime; + __int64 firstSampleTime; public: @@ -39,7 +39,7 @@ public: // 4J Added void renderStats(); - int64_t getCountSample(int samplePos); + __int64 getCountSample(int samplePos); wstring getLegendString(); }; @@ -58,7 +58,7 @@ public: static void map(int id, bool receiveOnClient, bool receiveOnServer, bool sendToAnyClient, bool renderStats, const type_info& clazz, packetCreateFn ); public: - const int64_t createTime; + const __int64 createTime; Packet(); @@ -84,7 +84,7 @@ public: static void renderPacketStats(int id); static void renderAllPacketStats(); static void renderAllPacketStatsKey(); - static int64_t getIndexedStatValue(unsigned int samplePos, unsigned int renderableId); + static __int64 getIndexedStatValue(unsigned int samplePos, unsigned int renderableId); private : static unordered_map statistics; diff --git a/Minecraft.World/PerlinNoise.cpp b/Minecraft.World/PerlinNoise.cpp index b4c65e55..b4fd8004 100644 --- a/Minecraft.World/PerlinNoise.cpp +++ b/Minecraft.World/PerlinNoise.cpp @@ -77,8 +77,8 @@ doubleArray PerlinNoise::getRegion(doubleArray buffer, int x, int y, int z, int double xx = x * pow * xScale; double yy = y * pow * yScale; double zz = z * pow * zScale; - int64_t xb = Mth::lfloor(xx); - int64_t zb = Mth::lfloor(zz); + __int64 xb = Mth::lfloor(xx); + __int64 zb = Mth::lfloor(zz); xx -= xb; zz -= zb; xb %= 16777216; diff --git a/Minecraft.World/Random.cpp b/Minecraft.World/Random.cpp index d4e3a545..9176bf38 100644 --- a/Minecraft.World/Random.cpp +++ b/Minecraft.World/Random.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "Random.h" #include "System.h" @@ -6,19 +6,19 @@ Random::Random() { // 4J - jave now uses the system nanosecond counter added to a "seedUniquifier" to get an initial seed. Our nanosecond timer is actually only millisecond accuate, so // use QueryPerformanceCounter here instead - int64_t seed; + __int64 seed; QueryPerformanceCounter((LARGE_INTEGER *)&seed); seed += 8682522807148012LL; setSeed(seed); } -Random::Random(int64_t seed) +Random::Random(__int64 seed) { setSeed(seed); } -void Random::setSeed(int64_t s) +void Random::setSeed(__int64 s) { this->seed = (s ^ 0x5DEECE66DLL) & ((1LL << 48) - 1); haveNextNextGaussian = false; @@ -41,7 +41,7 @@ void Random::nextBytes(byte *bytes, unsigned int count) double Random::nextDouble() { - return (((int64_t)next(26) << 27) + next(27)) + return (((__int64)next(26) << 27) + next(27)) / (double)(1LL << 53); } @@ -56,7 +56,7 @@ double Random::nextGaussian() { double v1, v2, s; do - { + { v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0 v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0 s = v1 * v1 + v2 * v2; @@ -79,7 +79,7 @@ int Random::nextInt(int n) if ((n & -n) == n) // i.e., n is a power of 2 - return (int)(((int64_t)next(31) * n) >> 31); // 4J Stu - Made int64_t instead of long + return (int)(((__int64)next(31) * n) >> 31); // 4J Stu - Made __int64 instead of long int bits, val; do @@ -95,9 +95,9 @@ float Random::nextFloat() return next(24) / ((float)(1 << 24)); } -int64_t Random::nextLong() +__int64 Random::nextLong() { - return ((int64_t)next(32) << 32) + next(32); + return ((__int64)next(32) << 32) + next(32); } bool Random::nextBoolean() diff --git a/Minecraft.World/Random.h b/Minecraft.World/Random.h index cfb6af26..9af3a3c2 100644 --- a/Minecraft.World/Random.h +++ b/Minecraft.World/Random.h @@ -3,21 +3,21 @@ class Random { private: - int64_t seed; + __int64 seed; bool haveNextNextGaussian; double nextNextGaussian; protected: int next(int bits); public: Random(); - Random(int64_t seed); - void setSeed(int64_t s); + Random(__int64 seed); + void setSeed(__int64 s); void nextBytes(byte *bytes, unsigned int count); double nextDouble(); double nextGaussian(); int nextInt(); int nextInt(int to); float nextFloat(); - int64_t nextLong(); + __int64 nextLong(); bool nextBoolean(); }; \ No newline at end of file diff --git a/Minecraft.World/RandomLevelSource.cpp b/Minecraft.World/RandomLevelSource.cpp index 277ff1f7..4e26134a 100644 --- a/Minecraft.World/RandomLevelSource.cpp +++ b/Minecraft.World/RandomLevelSource.cpp @@ -23,7 +23,7 @@ static PerlinNoise_DataIn g_depthNoise_SPU __attribute__((__aligned__(16))); const double RandomLevelSource::SNOW_SCALE = 0.3; const double RandomLevelSource::SNOW_CUTOFF = 0.5; -RandomLevelSource::RandomLevelSource(Level *level, int64_t seed, bool generateStructures) : generateStructures( generateStructures ) +RandomLevelSource::RandomLevelSource(Level *level, __int64 seed, bool generateStructures) : generateStructures( generateStructures ) { m_XZSize = level->getLevelData()->getXZSize(); @@ -160,7 +160,7 @@ void RandomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) 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 - + int xxx = ( ( xOffs * 16 ) + x + ( xc * CHUNK_WIDTH ) ); int zzz = ( ( zOffs * 16 ) + z + ( zc * CHUNK_WIDTH ) ); @@ -320,7 +320,7 @@ void RandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks, Bi run = runDepth; if (y >= waterHeight - 1) blocks[offs] = top; else blocks[offs] = material; - } + } else if (run > 0) { run--; @@ -389,7 +389,7 @@ LevelChunk *RandomLevelSource::getChunk(int xOffs, int zOffs) // 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. @@ -504,7 +504,7 @@ 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; @@ -515,7 +515,7 @@ doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int if (rdepth < -1) rdepth = -1; rdepth = rdepth / 1.4; rdepth /= 2; - } + } else { if (rdepth > 1) rdepth = 1; @@ -652,8 +652,8 @@ void RandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) } pprandom->setSeed(level->getSeed()); - int64_t xScale = pprandom->nextLong() / 2 * 2 + 1; - int64_t zScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); bool hasVillage = false; @@ -712,7 +712,7 @@ void RandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) PIXBeginNamedEvent(0,"Biome decorate"); biome->decorate(level, pprandom, xo, zo); PIXEndNamedEvent(); - + app.processSchematics(parent->getChunk(xt,zt)); MobSpawner::postProcessSpawnMobs(level, biome, xo + 8, zo + 8, 16, 16, pprandom); diff --git a/Minecraft.World/RandomLevelSource.h b/Minecraft.World/RandomLevelSource.h index b80ac6c6..d71028b1 100644 --- a/Minecraft.World/RandomLevelSource.h +++ b/Minecraft.World/RandomLevelSource.h @@ -47,7 +47,7 @@ private: floatArray pows; public: - RandomLevelSource(Level *level, int64_t seed, bool generateStructures); + RandomLevelSource(Level *level, __int64 seed, bool generateStructures); ~RandomLevelSource(); public: @@ -88,5 +88,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 TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); }; diff --git a/Minecraft.World/RegionFile.cpp b/Minecraft.World/RegionFile.cpp index 5c29f94e..2cfd9078 100644 --- a/Minecraft.World/RegionFile.cpp +++ b/Minecraft.World/RegionFile.cpp @@ -19,7 +19,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) chunkTimestamps = new int[SECTOR_INTS]; memset(chunkTimestamps,0,SECTOR_BYTES); - /* 4J Jev, using files instead of strings: + /* 4J Jev, using files instead of strings: strncpy(fileName,path,MAX_PATH_SIZE); */ fileName = path; @@ -30,7 +30,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) // 4J - removed try/catch // try { - + /* 4J - Removed as _lastModifed not used and this is always failing as checking wrong thing if( path->exists() ) { @@ -45,7 +45,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) { // 4J altered - the original code used to write out 2 empty sectors here, which we don't want to do as we might be at a point where we shouldn't be touching the save file. // This now happens in insertInitialSectors when we do a first write to the region - m_bIsEmpty = true; + m_bIsEmpty = true; sizeDelta += SECTOR_BYTES * 2; } @@ -70,7 +70,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) } /* set up the available sector map */ - + int nSectors; if( m_bIsEmpty ) // 4J - added this case for our empty files that we now don't create { @@ -133,7 +133,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) void RegionFile::writeAllOffsets() // used for the file ConsoleSaveFile conversion between platforms { - if(m_bIsEmpty == false) + if(m_bIsEmpty == false) { // save all the offsets and timestamps m_saveFile->LockSaveAccess(); @@ -158,7 +158,7 @@ RegionFile::~RegionFile() m_saveFile->closeHandle( fileEntry ); } -int64_t RegionFile::lastModified() +__int64 RegionFile::lastModified() { return _lastModified; } @@ -198,9 +198,9 @@ DataInputStream *RegionFile::getChunkDataInputStream(int x, int z) // TODO - was m_saveFile->LockSaveAccess(); - //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); + //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, NULL, FILE_BEGIN); - + unsigned int length; unsigned int decompLength; unsigned int readDecompLength; @@ -227,7 +227,7 @@ DataInputStream *RegionFile::getChunkDataInputStream(int x, int z) // TODO - was if (length > SECTOR_BYTES * numSectors) { // debugln("READ", x, z, "invalid length: " + length + " > 4096 * " + numSectors); - + m_saveFile->ReleaseSaveAccess(); return NULL; } @@ -257,7 +257,7 @@ DataInputStream *RegionFile::getChunkDataInputStream(int x, int z) // TODO - was delete [] data; // 4J - was InflaterInputStream in here too, but we've already decompressed - DataInputStream *ret = new DataInputStream(new ByteArrayInputStream( byteArray( decomp, readDecompLength) )); + DataInputStream *ret = new DataInputStream(new ByteArrayInputStream( byteArray( decomp, readDecompLength) )); return ret; // } catch (IOException e) { @@ -269,7 +269,7 @@ DataInputStream *RegionFile::getChunkDataInputStream(int x, int z) // TODO - was DataOutputStream *RegionFile::getChunkDataOutputStream(int x, int z) { // 4J - was DeflatorOutputStream in here too, but we've already compressed - return new DataOutputStream( new ChunkBuffer(this, x, z)); + return new DataOutputStream( new ChunkBuffer(this, x, z)); } /* write a chunk at (x,z) with length bytes of data to disk */ @@ -372,7 +372,7 @@ void RegionFile::write(int x, int z, byte *data, int length) // TODO - was sync * file */ // debug("SAVE", x, z, length, "grow"); - //SetFilePointer(file,0,0,FILE_END); + //SetFilePointer(file,0,0,FILE_END); m_saveFile->setFilePointer( fileEntry, 0, NULL, FILE_END ); sectorNumber = (int)sectorFree->size(); @@ -406,12 +406,12 @@ void RegionFile::write(int x, int z, byte *data, int length) // TODO - was sync void RegionFile::write(int sectorNumber, byte *data, int length, unsigned int compLength) { DWORD numberOfBytesWritten = 0; - //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); + //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, NULL, FILE_BEGIN ); // 4J - this differs a bit from the java file format. Java has length stored as an int, then a type as a byte, then length-1 bytes of data // We store length and decompression length as ints, then length bytes of xbox LZX compressed data - + // 4J Stu - We need to do the compression at a level above this, where it is checking for free space compLength |= 0x80000000; // 4J - signify that this has been encoded with RLE method ( see code in getChunkDataInputStream() for matching detection of this) @@ -425,7 +425,7 @@ void RegionFile::write(int sectorNumber, byte *data, int length, unsigned int co void RegionFile::zero(int sectorNumber, int length) { DWORD numberOfBytesWritten = 0; - //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); + //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, NULL, FILE_BEGIN ); m_saveFile->zeroFile( fileEntry, length, &numberOfBytesWritten ); } @@ -473,7 +473,7 @@ void RegionFile::setOffset(int x, int z, int offset) DWORD numberOfBytesWritten = 0; offsets[x + z * 32] = offset; m_saveFile->setFilePointer( fileEntry, (x + z * 32) * 4, NULL, FILE_BEGIN ); - + m_saveFile->writeFile(fileEntry,&offset,4,&numberOfBytesWritten); } @@ -487,7 +487,7 @@ void RegionFile::setTimestamp(int x, int z, int value) DWORD numberOfBytesWritten = 0; chunkTimestamps[x + z * 32] = value; m_saveFile->setFilePointer( fileEntry, SECTOR_BYTES + (x + z * 32) * 4, NULL, FILE_BEGIN ); - + m_saveFile->writeFile(fileEntry,&value,4,&numberOfBytesWritten); } diff --git a/Minecraft.World/RegionFile.h b/Minecraft.World/RegionFile.h index 520ca6a1..0717c8c2 100644 --- a/Minecraft.World/RegionFile.h +++ b/Minecraft.World/RegionFile.h @@ -16,7 +16,7 @@ private: static const int VERSION_GZIP = 1; static const int VERSION_DEFLATE = 2; static const int VERSION_XBOX = 3; - + static const int SECTOR_BYTES = 4096; static const int SECTOR_INTS = SECTOR_BYTES / 4; @@ -31,7 +31,7 @@ private: int *chunkTimestamps; vector *sectorFree; int sizeDelta; - int64_t _lastModified; + __int64 _lastModified; bool m_bIsEmpty; // 4J added public: @@ -39,7 +39,7 @@ public: ~RegionFile(); /* the modification date of the region file when it was first opened */ - int64_t lastModified(); + __int64 lastModified(); /* gets how much the region file has grown since it was last checked */ int getSizeDelta(); diff --git a/Minecraft.World/RegionHillsLayer.cpp b/Minecraft.World/RegionHillsLayer.cpp index a1e17524..dad114b0 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, shared_ptr parent) : Layer(seed) +RegionHillsLayer::RegionHillsLayer(__int64 seed, shared_ptr parent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/RegionHillsLayer.h b/Minecraft.World/RegionHillsLayer.h index 5ad0bb75..30d7eced 100644 --- a/Minecraft.World/RegionHillsLayer.h +++ b/Minecraft.World/RegionHillsLayer.h @@ -5,7 +5,7 @@ class RegionHillsLayer : public Layer { public: - RegionHillsLayer(int64_t seed, shared_ptr parent); + RegionHillsLayer(__int64 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/RespawnPacket.cpp b/Minecraft.World/RespawnPacket.cpp index ecc0b7f0..5c04bbeb 100644 --- a/Minecraft.World/RespawnPacket.cpp +++ b/Minecraft.World/RespawnPacket.cpp @@ -5,7 +5,7 @@ #include "RespawnPacket.h" #include "LevelType.h" -RespawnPacket::RespawnPacket() +RespawnPacket::RespawnPacket() { this->dimension = 0; this->difficulty = 1; @@ -19,7 +19,7 @@ RespawnPacket::RespawnPacket() m_hellScale = HELL_LEVEL_MAX_SCALE; } -RespawnPacket::RespawnPacket(char dimension, int64_t mapSeed, int mapHeight, GameType *playerGameType, char difficulty, LevelType *pLevelType, bool newSeaLevel, int newEntityId, int xzSize, int hellScale) +RespawnPacket::RespawnPacket(char dimension, __int64 mapSeed, int mapHeight, GameType *playerGameType, char difficulty, LevelType *pLevelType, bool newSeaLevel, int newEntityId, int xzSize, int hellScale) { this->dimension = dimension; this->mapSeed = mapSeed; @@ -35,7 +35,7 @@ RespawnPacket::RespawnPacket(char dimension, int64_t mapSeed, int mapHeight, Gam } -void RespawnPacket::handle(PacketListener *listener) +void RespawnPacket::handle(PacketListener *listener) { listener->handleRespawn(shared_from_this()); } @@ -47,7 +47,7 @@ void RespawnPacket::read(DataInputStream *dis) //throws IOException mapHeight = dis->readShort(); wstring typeName = readUtf(dis, 16); m_pLevelType = LevelType::getLevelType(typeName); - if (m_pLevelType == NULL) + if (m_pLevelType == NULL) { m_pLevelType = LevelType::lvl_normal; } @@ -63,16 +63,16 @@ void RespawnPacket::read(DataInputStream *dis) //throws IOException } -void RespawnPacket::write(DataOutputStream *dos) //throws IOException +void RespawnPacket::write(DataOutputStream *dos) //throws IOException { dos->writeByte(dimension); dos->writeByte(playerGameType->getId()); dos->writeShort(mapHeight); - if (m_pLevelType == NULL) + if (m_pLevelType == NULL) { writeUtf(L"", dos); - } - else + } + else { writeUtf(m_pLevelType->getGeneratorName(), dos); } @@ -86,10 +86,10 @@ void RespawnPacket::write(DataOutputStream *dos) //throws IOException #endif } -int RespawnPacket::getEstimatedSize() +int RespawnPacket::getEstimatedSize() { int length=0; - if (m_pLevelType != NULL) + if (m_pLevelType != NULL) { length = (int)m_pLevelType->getGeneratorName().length(); } diff --git a/Minecraft.World/RespawnPacket.h b/Minecraft.World/RespawnPacket.h index 3caf1ee3..dc341ea1 100644 --- a/Minecraft.World/RespawnPacket.h +++ b/Minecraft.World/RespawnPacket.h @@ -11,7 +11,7 @@ class RespawnPacket : public Packet, public enable_shared_from_thisparent) : Layer(seed) +RiverInitLayer::RiverInitLayer(__int64 seed, shared_ptrparent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/RiverInitLayer.h b/Minecraft.World/RiverInitLayer.h index bc8dca1b..6deb50e9 100644 --- a/Minecraft.World/RiverInitLayer.h +++ b/Minecraft.World/RiverInitLayer.h @@ -5,7 +5,7 @@ class RiverInitLayer : public Layer { public: - RiverInitLayer(int64_t seed, shared_ptrparent); + RiverInitLayer(__int64 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 14cf3142..8f805bab 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, shared_ptrparent) : Layer(seedMixup) +RiverLayer::RiverLayer(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/RiverLayer.h b/Minecraft.World/RiverLayer.h index a76d3fab..657ac07c 100644 --- a/Minecraft.World/RiverLayer.h +++ b/Minecraft.World/RiverLayer.h @@ -5,6 +5,6 @@ class RiverLayer : public Layer { public: - RiverLayer(int64_t seedMixup, shared_ptrparent); + RiverLayer(__int64 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 4de49245..62dfdd6c 100644 --- a/Minecraft.World/RiverMixerLayer.cpp +++ b/Minecraft.World/RiverMixerLayer.cpp @@ -2,13 +2,13 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -RiverMixerLayer::RiverMixerLayer(int64_t seed, shared_ptrbiomes, shared_ptrrivers) : Layer(seed) +RiverMixerLayer::RiverMixerLayer(__int64 seed, shared_ptrbiomes, shared_ptrrivers) : Layer(seed) { this->biomes = biomes; this->rivers = rivers; } -void RiverMixerLayer::init(int64_t seed) +void RiverMixerLayer::init(__int64 seed) { biomes->init(seed); rivers->init(seed); diff --git a/Minecraft.World/RiverMixerLayer.h b/Minecraft.World/RiverMixerLayer.h index 3a069c41..eec51610 100644 --- a/Minecraft.World/RiverMixerLayer.h +++ b/Minecraft.World/RiverMixerLayer.h @@ -9,8 +9,8 @@ private: shared_ptrrivers; public: - RiverMixerLayer(int64_t seed, shared_ptrbiomes, shared_ptrrivers); + RiverMixerLayer(__int64 seed, shared_ptrbiomes, shared_ptrrivers); - virtual void init(int64_t seed); + virtual void init(__int64 seed); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/SetTimePacket.cpp b/Minecraft.World/SetTimePacket.cpp index 1f0701eb..2f707970 100644 --- a/Minecraft.World/SetTimePacket.cpp +++ b/Minecraft.World/SetTimePacket.cpp @@ -6,12 +6,12 @@ -SetTimePacket::SetTimePacket() +SetTimePacket::SetTimePacket() { time = 0; } -SetTimePacket::SetTimePacket(int64_t time) +SetTimePacket::SetTimePacket(__int64 time) { this->time = time; } @@ -21,7 +21,7 @@ void SetTimePacket::read(DataInputStream *dis) //throws IOException time = dis->readLong(); } -void SetTimePacket::write(DataOutputStream *dos) //throws IOException +void SetTimePacket::write(DataOutputStream *dos) //throws IOException { dos->writeLong(time); } diff --git a/Minecraft.World/SetTimePacket.h b/Minecraft.World/SetTimePacket.h index b7d3e645..5b658a0b 100644 --- a/Minecraft.World/SetTimePacket.h +++ b/Minecraft.World/SetTimePacket.h @@ -6,10 +6,10 @@ using namespace std; class SetTimePacket : public Packet, public enable_shared_from_this { public: - int64_t time; + __int64 time; SetTimePacket(); - SetTimePacket(int64_t time); + SetTimePacket(__int64 time); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/ShoreLayer.cpp b/Minecraft.World/ShoreLayer.cpp index 7ae52557..297571f5 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, shared_ptr parent) : Layer(seed) +ShoreLayer::ShoreLayer(__int64 seed, shared_ptr parent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/ShoreLayer.h b/Minecraft.World/ShoreLayer.h index a7053004..96aea152 100644 --- a/Minecraft.World/ShoreLayer.h +++ b/Minecraft.World/ShoreLayer.h @@ -4,6 +4,6 @@ class ShoreLayer : public Layer { public: - ShoreLayer(int64_t seed, shared_ptr parent); + ShoreLayer(__int64 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/SkyIslandDimension.cpp b/Minecraft.World/SkyIslandDimension.cpp index aa68bd5e..0746c92c 100644 --- a/Minecraft.World/SkyIslandDimension.cpp +++ b/Minecraft.World/SkyIslandDimension.cpp @@ -16,7 +16,7 @@ ChunkSource *SkyIslandDimension::createRandomLevelSource() const return new SkyIslandRandomLevelSource(level, level->getSeed()); } -float SkyIslandDimension::getTimeOfDay(int64_t time, float a) const +float SkyIslandDimension::getTimeOfDay(__int64 time, float a) const { return 0.0f; } diff --git a/Minecraft.World/SmoothLayer.cpp b/Minecraft.World/SmoothLayer.cpp index e94ae36d..a5545cc5 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, shared_ptrparent) : Layer(seedMixup) +SmoothLayer::SmoothLayer(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/SmoothLayer.h b/Minecraft.World/SmoothLayer.h index 14e3d152..eec3f19e 100644 --- a/Minecraft.World/SmoothLayer.h +++ b/Minecraft.World/SmoothLayer.h @@ -5,7 +5,7 @@ class SmoothLayer : public Layer { public: - SmoothLayer(int64_t seedMixup, shared_ptrparent); + SmoothLayer(__int64 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/SmoothZoomLayer.cpp b/Minecraft.World/SmoothZoomLayer.cpp index 2df34a3b..3e1c55a1 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, shared_ptrparent) : Layer(seedMixup) +SmoothZoomLayer::SmoothZoomLayer(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } @@ -50,7 +50,7 @@ intArray SmoothZoomLayer::getArea(int xo, int yo, int w, int h) return result; } -shared_ptrSmoothZoomLayer::zoom(int64_t seed, shared_ptrsup, int count) +shared_ptrSmoothZoomLayer::zoom(__int64 seed, shared_ptrsup, int count) { shared_ptrresult = sup; for (int i = 0; i < count; i++) diff --git a/Minecraft.World/SmoothZoomLayer.h b/Minecraft.World/SmoothZoomLayer.h index 90cc292e..b2ac4e78 100644 --- a/Minecraft.World/SmoothZoomLayer.h +++ b/Minecraft.World/SmoothZoomLayer.h @@ -5,8 +5,8 @@ class SmoothZoomLayer : public Layer { public: - SmoothZoomLayer(int64_t seedMixup, shared_ptrparent); + SmoothZoomLayer(__int64 seedMixup, shared_ptrparent); virtual intArray getArea(int xo, int yo, int w, int h); - static shared_ptrzoom(int64_t seed, shared_ptrsup, int count); + static shared_ptrzoom(__int64 seed, shared_ptrsup, int count); }; \ No newline at end of file diff --git a/Minecraft.World/Socket.h b/Minecraft.World/Socket.h index c4ec9fc8..0019f984 100644 --- a/Minecraft.World/Socket.h +++ b/Minecraft.World/Socket.h @@ -36,7 +36,7 @@ private: virtual int read(byteArray b); virtual int read(byteArray b, unsigned int offset, unsigned int length); virtual void close(); - virtual int64_t skip(int64_t n) { return n; } // 4J Stu - Not implemented + virtual __int64 skip(__int64 n) { return n; } // 4J Stu - Not implemented virtual void flush() {} }; @@ -68,7 +68,7 @@ private: virtual int read(byteArray b); virtual int read(byteArray b, unsigned int offset, unsigned int length); virtual void close(); - virtual int64_t skip(int64_t n) { return n; } // 4J Stu - Not implemented + virtual __int64 skip(__int64 n) { return n; } // 4J Stu - Not implemented virtual void flush() {} }; class SocketOutputStreamNetwork : public SocketOutputStream @@ -86,13 +86,13 @@ private: virtual void close(); virtual void flush() {} }; - + bool m_hostServerConnection; // true if this is the connection between the host player and server bool m_hostLocal; // true if this player on the same machine as the host int m_end; // 0 for client side or 1 for host side // For local connections between the host player and the server - static CRITICAL_SECTION s_hostQueueLock[2]; + static CRITICAL_SECTION s_hostQueueLock[2]; static std::queue s_hostQueue[2]; static SocketOutputStreamLocal *s_hostOutStream[2]; static SocketInputStreamLocal *s_hostInStream[2]; @@ -108,7 +108,7 @@ private: static ServerConnection *s_serverConnection; BYTE networkPlayerSmallId; -public: +public: C4JThread::Event* m_socketClosedEvent; INetworkPlayer *getPlayer(); diff --git a/Minecraft.World/SparseDataStorage.cpp b/Minecraft.World/SparseDataStorage.cpp index 780c9819..6db131e7 100644 --- a/Minecraft.World/SparseDataStorage.cpp +++ b/Minecraft.World/SparseDataStorage.cpp @@ -40,7 +40,7 @@ SparseDataStorage::SparseDataStorage() // Data and count packs together the pointer to our data and the count of planes allocated - 127 planes allocated in this case #pragma warning ( disable : 4826 ) - dataAndCount = 0x007F000000000000L | (( (int64_t) planeIndices ) & 0x0000ffffffffffffL); + dataAndCount = 0x007F000000000000L | (( (__int64) planeIndices ) & 0x0000ffffffffffffL); #pragma warning ( default : 4826 ) #ifdef DATA_COMPRESSION_STATS count = 128; @@ -59,7 +59,7 @@ SparseDataStorage::SparseDataStorage(bool isUpper) // Data and count packs together the pointer to our data and the count of planes allocated - 127 planes allocated in this case #pragma warning ( disable : 4826 ) - dataAndCount = 0x0000000000000000L | (( (int64_t) planeIndices ) & 0x0000ffffffffffffL); + dataAndCount = 0x0000000000000000L | (( (__int64) planeIndices ) & 0x0000ffffffffffffL); #pragma warning ( default : 4826 ) #ifdef DATA_COMPRESSION_STATS count = 128; @@ -70,7 +70,7 @@ SparseDataStorage::~SparseDataStorage() { unsigned char *indicesAndData = (unsigned char *)(dataAndCount & 0x0000ffffffffffff); // Determine correct means to free this data - could have been allocated either with XPhysicalAlloc or malloc - + #ifdef _XBOX if( (unsigned int)indicesAndData >= MM_PHYSICAL_4KB_BASE ) { @@ -87,7 +87,7 @@ SparseDataStorage::~SparseDataStorage() SparseDataStorage::SparseDataStorage(SparseDataStorage *copyFrom) { // Extra details of source storage - int64_t sourceDataAndCount = copyFrom->dataAndCount; + __int64 sourceDataAndCount = copyFrom->dataAndCount; unsigned char *sourceIndicesAndData = (unsigned char *)(sourceDataAndCount & 0x0000ffffffffffff); int sourceCount = (sourceDataAndCount >> 48 ) & 0xffff; @@ -97,7 +97,7 @@ SparseDataStorage::SparseDataStorage(SparseDataStorage *copyFrom) // AP - I've moved this to be before the memcpy because of a very strange bug on vita. Sometimes dataAndCount wasn't valid in time when ::get was called. // This should never happen and this isn't a proper solution but fixes it for now. #pragma warning ( disable : 4826 ) - dataAndCount = ( sourceDataAndCount & 0xffff000000000000L ) | ( ((int64_t) destIndicesAndData ) & 0x0000ffffffffffffL ); + dataAndCount = ( sourceDataAndCount & 0xffff000000000000L ) | ( ((__int64) destIndicesAndData ) & 0x0000ffffffffffffL ); #pragma warning ( default : 4826 ) XMemCpy( destIndicesAndData, sourceIndicesAndData, sourceCount * 128 + 128 ); @@ -126,7 +126,7 @@ void SparseDataStorage::setData(byteArray dataIn, unsigned int inOffset) for( int y = 0; y < 128; y++ ) { bool all0 = true; - + for( int xz = 0; xz < 256; xz++ ) // 256 in loop as 16 x 16 separate bytes need checked { int pos = ( xz << 7 ) | y; @@ -176,9 +176,9 @@ void SparseDataStorage::setData(byteArray dataIn, unsigned int inOffset) // Get new data and count packed info #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) planeIndices) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) planeIndices) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)allocatedPlaneCount) << 48; + newDataAndCount |= ((__int64)allocatedPlaneCount) << 48; updateDataAndCount( newDataAndCount ); } @@ -230,7 +230,7 @@ int SparseDataStorage::get(int x, int y, int z) { unsigned char *planeIndices, *data; getPlaneIndicesAndData(&planeIndices, &data); - + if( planeIndices[y] == ALL_0_INDEX ) { return 0; @@ -370,7 +370,7 @@ int SparseDataStorage::getDataRegion(byteArray dataInOut, int x0, int y0, int z0 } } ptrdiff_t count = pucOut - &dataInOut.data[offset]; - + return (int)count; } @@ -380,7 +380,7 @@ void SparseDataStorage::addNewPlane(int y) do { // Get last packed data pointer & count - int64_t lastDataAndCount = dataAndCount; + __int64 lastDataAndCount = dataAndCount; // Unpack count & data pointer int lastLinesUsed = (int)(( lastDataAndCount >> 48 ) & 0xffff); @@ -388,9 +388,9 @@ void SparseDataStorage::addNewPlane(int y) // Find out what to prefill the newly allocated line with unsigned char planeIndex = lastDataPointer[y]; - + if( planeIndex < ALL_0_INDEX ) return; // Something has already allocated this line - we're done - + int linesUsed = lastLinesUsed + 1; // Allocate new memory storage, copy over anything from old storage, and initialise remainder @@ -401,14 +401,14 @@ void SparseDataStorage::addNewPlane(int y) // Get new data and count packed info #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) dataPointer) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) dataPointer) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)linesUsed) << 48; + newDataAndCount |= ((__int64)linesUsed) << 48; // Attempt to update the data & count atomically. This command will Only succeed if the data stored at // dataAndCount is equal to lastDataAndCount, and will return the value present just before the write took place - int64_t lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); - + __int64 lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); + if( lastDataAndCount2 == lastDataAndCount ) { success = true; @@ -473,20 +473,20 @@ void SparseDataStorage::tick() } // Update storage with a new values for dataAndCount, repeating as necessary if other simultaneous writes happen. -void SparseDataStorage::updateDataAndCount(int64_t newDataAndCount) +void SparseDataStorage::updateDataAndCount(__int64 newDataAndCount) { // Now actually assign this data to the storage. Just repeat until successful, there isn't any useful really that we can merge the results of this // with any other simultaneous writes that might be happening. bool success = false; do { - int64_t lastDataAndCount = dataAndCount; + __int64 lastDataAndCount = dataAndCount; unsigned char *lastDataPointer = (unsigned char *)(lastDataAndCount & 0x0000ffffffffffff); // Attempt to update the data & count atomically. This command will Only succeed if the data stored at // dataAndCount is equal to lastDataAndCount, and will return the value present just before the write took place - int64_t lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); - + __int64 lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); + if( lastDataAndCount2 == lastDataAndCount ) { success = true; @@ -508,7 +508,7 @@ int SparseDataStorage::compress() unsigned char _planeIndices[128]; bool needsCompressed = false; - int64_t lastDataAndCount = dataAndCount; + __int64 lastDataAndCount = dataAndCount; unsigned char *planeIndices = (unsigned char *)(lastDataAndCount & 0x0000ffffffffffff); unsigned char *data = planeIndices + 128; @@ -558,13 +558,13 @@ int SparseDataStorage::compress() // Get new data and count packed info #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) newIndicesAndData) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) newIndicesAndData) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)planesToAlloc) << 48; + newDataAndCount |= ((__int64)planesToAlloc) << 48; // Attempt to update the data & count atomically. This command will Only succeed if the data stored at // dataAndCount is equal to lastDataAndCount, and will return the value present just before the write took place - int64_t lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); + __int64 lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); if( lastDataAndCount2 != lastDataAndCount ) { @@ -576,7 +576,7 @@ int SparseDataStorage::compress() { // Success queueForDelete( planeIndices ); -// printf("Successfully compressed to %d planes, to delete 0x%x\n", planesToAlloc, planeIndices); +// printf("Successfully compressed to %d planes, to delete 0x%x\n", planesToAlloc, planeIndices); #ifdef DATA_COMPRESSION_STATS count = planesToAlloc; #endif @@ -617,9 +617,9 @@ void SparseDataStorage::read(DataInputStream *dis) dis->readFully(wrapper); #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) dataPointer) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) dataPointer) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)count) << 48; + newDataAndCount |= ((__int64)count) << 48; updateDataAndCount(newDataAndCount); } diff --git a/Minecraft.World/SparseDataStorage.h b/Minecraft.World/SparseDataStorage.h index 16289cda..93d5c424 100644 --- a/Minecraft.World/SparseDataStorage.h +++ b/Minecraft.World/SparseDataStorage.h @@ -18,9 +18,9 @@ // To meet these requirements, this class is now implemented using a lock-free system, implemented using a read-copy-update (RCU) type algorithm. Some details... -// (1) The storage details for the class are now packed into a single int64_t, which contains both a pointer to the data that is required and a count of how many planes worth +// (1) The storage details for the class are now packed into a single __int64, which contains both a pointer to the data that is required and a count of how many planes worth // of storage are allocated. This allows the full storage to be updated atomically using compare and exchange operations (implemented with InterlockedCompareExchangeRelease64). -// (2) The data pointer referenced in this int64_t points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and +// (2) The data pointer referenced in this __int64 points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and // the rest of the data is variable in size to accomodate however many planes are required to be stored // (3) The RCU bit of the algorithm means that any read operations don't need to do any checks or locks at all. When the data needs to be updated, a copy of it is made and updated, // then an attempt is made to swap the new data in - if this succeeds then the old data pointer is deleted later at some point where we know nothing will be reading from it anymore. @@ -36,7 +36,7 @@ class SparseDataStorage friend class TileCompressData_SPU; private: // unsigned char planeIndices[128]; - int64_t dataAndCount; // Contains packed-together data pointer (lower 48-bits), and count of lines used (upper 16-bits) + __int64 dataAndCount; // Contains packed-together data pointer (lower 48-bits), and count of lines used (upper 16-bits) // unsigned char *data; // unsigned int allocatedPlaneCount; @@ -64,7 +64,7 @@ public: void addNewPlane(int y); void getPlaneIndicesAndData(unsigned char **planeIndices, unsigned char **data); - void updateDataAndCount(int64_t newDataAndCount); + void updateDataAndCount(__int64 newDataAndCount); int compress(); bool isCompressed(); diff --git a/Minecraft.World/SparseLightStorage.cpp b/Minecraft.World/SparseLightStorage.cpp index a0ba41b1..f9a2f0cb 100644 --- a/Minecraft.World/SparseLightStorage.cpp +++ b/Minecraft.World/SparseLightStorage.cpp @@ -40,7 +40,7 @@ SparseLightStorage::SparseLightStorage(bool sky) // Data and count packs together the pointer to our data and the count of planes allocated - 127 planes allocated in this case #pragma warning ( disable : 4826 ) - dataAndCount = 0x007F000000000000L | (( (int64_t) planeIndices ) & 0x0000ffffffffffffL); + dataAndCount = 0x007F000000000000L | (( (__int64) planeIndices ) & 0x0000ffffffffffffL); #pragma warning ( default : 4826 ) #ifdef LIGHT_COMPRESSION_STATS count = 127; @@ -59,7 +59,7 @@ SparseLightStorage::SparseLightStorage(bool sky, bool isUpper) // Data and count packs together the pointer to our data and the count of planes allocated - 0 planes allocated in this case #pragma warning ( disable : 4826 ) - dataAndCount = 0x0000000000000000L | (( (int64_t) planeIndices ) & 0x0000ffffffffffffL); + dataAndCount = 0x0000000000000000L | (( (__int64) planeIndices ) & 0x0000ffffffffffffL); #pragma warning ( default : 4826 ) #ifdef LIGHT_COMPRESSION_STATS count = 0; @@ -70,7 +70,7 @@ SparseLightStorage::~SparseLightStorage() { unsigned char *indicesAndData = (unsigned char *)(dataAndCount & 0x0000ffffffffffff); // Determine correct means to free this data - could have been allocated either with XPhysicalAlloc or malloc - + #ifdef _XBOX if( (unsigned int)indicesAndData >= MM_PHYSICAL_4KB_BASE ) { @@ -87,7 +87,7 @@ SparseLightStorage::~SparseLightStorage() SparseLightStorage::SparseLightStorage(SparseLightStorage *copyFrom) { // Extra details of source storage - int64_t sourceDataAndCount = copyFrom->dataAndCount; + __int64 sourceDataAndCount = copyFrom->dataAndCount; unsigned char *sourceIndicesAndData = (unsigned char *)(sourceDataAndCount & 0x0000ffffffffffff); int sourceCount = (sourceDataAndCount >> 48 ) & 0xffff; @@ -97,7 +97,7 @@ SparseLightStorage::SparseLightStorage(SparseLightStorage *copyFrom) // AP - I've moved this to be before the memcpy because of a very strange bug on vita. Sometimes dataAndCount wasn't valid in time when ::get was called. // This should never happen and this isn't a proper solution but fixes it for now. #pragma warning ( disable : 4826 ) - dataAndCount = ( sourceDataAndCount & 0xffff000000000000L ) | ( ((int64_t) destIndicesAndData ) & 0x0000ffffffffffffL ); + dataAndCount = ( sourceDataAndCount & 0xffff000000000000L ) | ( ((__int64) destIndicesAndData ) & 0x0000ffffffffffffL ); #pragma warning ( default : 4826 ) XMemCpy( destIndicesAndData, sourceIndicesAndData, sourceCount * 128 + 128 ); @@ -125,7 +125,7 @@ void SparseLightStorage::setData(byteArray dataIn, unsigned int inOffset) { bool all0 = true; bool all15 = true; - + for( int xz = 0; xz < 256; xz++ ) // 256 in loop as 16 x 16 separate bytes need checked { int pos = ( xz << 7 ) | y; @@ -180,9 +180,9 @@ void SparseLightStorage::setData(byteArray dataIn, unsigned int inOffset) // Get new data and count packed info #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) planeIndices) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) planeIndices) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)allocatedPlaneCount) << 48; + newDataAndCount |= ((__int64)allocatedPlaneCount) << 48; updateDataAndCount( newDataAndCount ); } @@ -245,7 +245,7 @@ int SparseLightStorage::get(int x, int y, int z) { unsigned char *planeIndices, *data; getPlaneIndicesAndData(&planeIndices, &data); - + if( planeIndices[y] == ALL_0_INDEX ) { return 0; @@ -312,7 +312,7 @@ void SparseLightStorage::setAllBright() } // Data and count packs together the pointer to our data and the count of planes allocated, which is currently zero #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ( (int64_t) planeIndices ) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ( (__int64) planeIndices ) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) updateDataAndCount( newDataAndCount ); @@ -375,7 +375,7 @@ int SparseLightStorage::getDataRegion(byteArray dataInOut, int x0, int y0, int z } } ptrdiff_t count = pucOut - &dataInOut.data[offset]; - + return (int)count; } @@ -385,7 +385,7 @@ void SparseLightStorage::addNewPlane(int y) do { // Get last packed data pointer & count - int64_t lastDataAndCount = dataAndCount; + __int64 lastDataAndCount = dataAndCount; // Unpack count & data pointer int lastLinesUsed = (int)(( lastDataAndCount >> 48 ) & 0xffff); @@ -407,14 +407,14 @@ void SparseLightStorage::addNewPlane(int y) // Get new data and count packed info #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) dataPointer) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) dataPointer) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)linesUsed) << 48; + newDataAndCount |= ((__int64)linesUsed) << 48; // Attempt to update the data & count atomically. This command will Only succeed if the data stored at // dataAndCount is equal to lastDataAndCount, and will return the value present just before the write took place - int64_t lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); - + __int64 lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); + if( lastDataAndCount2 == lastDataAndCount ) { success = true; @@ -479,20 +479,20 @@ void SparseLightStorage::tick() } // Update storage with a new values for dataAndCount, repeating as necessary if other simultaneous writes happen. -void SparseLightStorage::updateDataAndCount(int64_t newDataAndCount) +void SparseLightStorage::updateDataAndCount(__int64 newDataAndCount) { // Now actually assign this data to the storage. Just repeat until successful, there isn't any useful really that we can merge the results of this // with any other simultaneous writes that might be happening. bool success = false; do { - int64_t lastDataAndCount = dataAndCount; + __int64 lastDataAndCount = dataAndCount; unsigned char *lastDataPointer = (unsigned char *)(lastDataAndCount & 0x0000ffffffffffff); // Attempt to update the data & count atomically. This command will Only succeed if the data stored at // dataAndCount is equal to lastDataAndCount, and will return the value present just before the write took place - int64_t lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); - + __int64 lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); + if( lastDataAndCount2 == lastDataAndCount ) { success = true; @@ -514,7 +514,7 @@ int SparseLightStorage::compress() unsigned char _planeIndices[128]; bool needsCompressed = false; - int64_t lastDataAndCount = dataAndCount; + __int64 lastDataAndCount = dataAndCount; unsigned char *planeIndices = (unsigned char *)(lastDataAndCount & 0x0000ffffffffffff); unsigned char *data = planeIndices + 128; @@ -575,13 +575,13 @@ int SparseLightStorage::compress() // Get new data and count packed info #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) newIndicesAndData) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) newIndicesAndData) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)planesToAlloc) << 48; + newDataAndCount |= ((__int64)planesToAlloc) << 48; // Attempt to update the data & count atomically. This command will Only succeed if the data stored at // dataAndCount is equal to lastDataAndCount, and will return the value present just before the write took place - int64_t lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); + __int64 lastDataAndCount2 = InterlockedCompareExchangeRelease64( &dataAndCount, newDataAndCount, lastDataAndCount ); if( lastDataAndCount2 != lastDataAndCount ) { @@ -593,7 +593,7 @@ int SparseLightStorage::compress() { // Success queueForDelete( planeIndices ); -// printf("Successfully compressed to %d planes, to delete 0x%x\n", planesToAlloc, planeIndices); +// printf("Successfully compressed to %d planes, to delete 0x%x\n", planesToAlloc, planeIndices); #ifdef LIGHT_COMPRESSION_STATS count = planesToAlloc; #endif @@ -634,9 +634,9 @@ void SparseLightStorage::read(DataInputStream *dis) dis->readFully(wrapper); #pragma warning ( disable : 4826 ) - int64_t newDataAndCount = ((int64_t) dataPointer) & 0x0000ffffffffffffL; + __int64 newDataAndCount = ((__int64) dataPointer) & 0x0000ffffffffffffL; #pragma warning ( default : 4826 ) - newDataAndCount |= ((int64_t)count) << 48; + newDataAndCount |= ((__int64)count) << 48; updateDataAndCount( newDataAndCount ); } diff --git a/Minecraft.World/SparseLightStorage.h b/Minecraft.World/SparseLightStorage.h index c4cfbd04..d05d7645 100644 --- a/Minecraft.World/SparseLightStorage.h +++ b/Minecraft.World/SparseLightStorage.h @@ -20,9 +20,9 @@ // To meet these requirements, this class is now implemented using a lock-free system, implemented using a read-copy-update (RCU) type algorithm. Some details... -// (1) The storage details for the class are now packed into a single int64_t, which contains both a pointer to the data that is required and a count of how many planes worth +// (1) The storage details for the class are now packed into a single __int64, which contains both a pointer to the data that is required and a count of how many planes worth // of storage are allocated. This allows the full storage to be updated atomically using compare and exchange operations (implemented with InterlockedCompareExchangeRelease64). -// (2) The data pointer referenced in this int64_t points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and +// (2) The data pointer referenced in this __int64 points to an area of memory which is 128 + 128 * plane_count bytes long, where the first 128 bytes stoere the plane indices, and // the rest of the data is variable in size to accomodate however many planes are required to be stored // (3) The RCU bit of the algorithm means that any read operations don't need to do any checks or locks at all. When the data needs to be updated, a copy of it is made and updated, // then an attempt is made to swap the new data in - if this succeeds then the old data pointer is deleted later at some point where we know nothing will be reading from it anymore. @@ -38,7 +38,7 @@ class SparseLightStorage friend class TileCompressData_SPU; private: // unsigned char planeIndices[128]; - int64_t dataAndCount; // Contains packed-together data pointer (lower 48-bits), and count of lines used (upper 16-bits) + __int64 dataAndCount; // Contains packed-together data pointer (lower 48-bits), and count of lines used (upper 16-bits) // unsigned char *data; // unsigned int allocatedPlaneCount; @@ -66,7 +66,7 @@ public: void addNewPlane(int y); void getPlaneIndicesAndData(unsigned char **planeIndices, unsigned char **data); - void updateDataAndCount(int64_t newDataAndCount); + void updateDataAndCount(__int64 newDataAndCount); int compress(); bool isCompressed(); diff --git a/Minecraft.World/StructureFeature.cpp b/Minecraft.World/StructureFeature.cpp index 9a204d00..5e8489f0 100644 --- a/Minecraft.World/StructureFeature.cpp +++ b/Minecraft.World/StructureFeature.cpp @@ -92,16 +92,16 @@ bool StructureFeature::isIntersection(int cellX, int cellZ) /////////////////////////////////////////// // 4J-PB - Below functions added from 1.2.3 /////////////////////////////////////////// -bool StructureFeature::isInsideFeature(int cellX, int cellY, int cellZ) +bool StructureFeature::isInsideFeature(int cellX, int cellY, int cellZ) { - //for (StructureStart structureStart : cachedStructures.values()) + //for (StructureStart structureStart : cachedStructures.values()) for(AUTO_VAR(it, cachedStructures.begin()); it != cachedStructures.end(); ++it) { StructureStart *pStructureStart = it->second; - if (pStructureStart->isValid()) + if (pStructureStart->isValid()) { - if (pStructureStart->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)) + if (pStructureStart->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)) { /* Iterator it = structureStart.getPieces().iterator(); @@ -127,7 +127,7 @@ bool StructureFeature::isInsideFeature(int cellX, int cellY, int cellZ) return false; } -TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, int cellY, int cellZ) +TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, int cellY, int cellZ) { // this is a hack that will "force" the feature to generate positions @@ -135,10 +135,10 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i this->level = level; random->setSeed(level->getSeed()); - int64_t xScale = random->nextLong(); - int64_t zScale = random->nextLong(); - int64_t xx = (cellX >> 4) * xScale; - int64_t zz = (cellZ >> 4) * zScale; + __int64 xScale = random->nextLong(); + __int64 zScale = random->nextLong(); + __int64 xx = (cellX >> 4) * xScale; + __int64 zz = (cellZ >> 4) * zScale; random->setSeed(xx ^ zz ^ level->getSeed()); addFeature(level, cellX >> 4, cellZ >> 4, 0, 0, byteArray()); @@ -150,7 +150,7 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i { StructureStart *pStructureStart = it->second; - if (pStructureStart->isValid()) + if (pStructureStart->isValid()) { //StructurePiece *pStructurePiece = pStructureStart->getPieces().get(0); @@ -162,21 +162,21 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i int dz = locatorPosition->z - cellZ; double dist = dx + dx * dy * dy + dz * dz; - if (dist < minDistance) + if (dist < minDistance) { minDistance = dist; selected = locatorPosition; } } } - if (selected != NULL) + if (selected != NULL) { return selected; - } - else + } + else { vector *guesstimatedFeaturePositions = getGuesstimatedFeaturePositions(); - if (guesstimatedFeaturePositions != NULL) + if (guesstimatedFeaturePositions != NULL) { TilePos *pSelectedPos = new TilePos(0,0,0); @@ -187,7 +187,7 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i int dz = (*it).z - cellZ; double dist = dx + dx * dy * dy + dz * dz; - if (dist < minDistance) + if (dist < minDistance) { minDistance = dist; pSelectedPos->x = (*it).x; @@ -202,7 +202,7 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i return NULL; } -vector *StructureFeature::getGuesstimatedFeaturePositions() +vector *StructureFeature::getGuesstimatedFeaturePositions() { return NULL; } diff --git a/Minecraft.World/StructureFeature.h b/Minecraft.World/StructureFeature.h index 22f4cd66..642e6aad 100644 --- a/Minecraft.World/StructureFeature.h +++ b/Minecraft.World/StructureFeature.h @@ -16,7 +16,7 @@ public: }; protected: - unordered_map cachedStructures; + unordered_map<__int64, StructureStart *> cachedStructures; public: ~StructureFeature(); @@ -29,12 +29,12 @@ public: bool isInsideFeature(int cellX, int cellY, int cellZ); TilePos *getNearestGeneratedFeature(Level *level, int cellX, int cellY, int cellZ); protected: - vector *getGuesstimatedFeaturePositions(); + vector *getGuesstimatedFeaturePositions(); /** * Returns true if the given chunk coordinates should hold a structure * source. - * + * * @param x * chunk x * @param z @@ -47,7 +47,7 @@ protected: /** * Creates a new instance of a structure source at the given chunk * coordinates. - * + * * @param x * chunk x * @param z diff --git a/Minecraft.World/SwampRiversLayer.cpp b/Minecraft.World/SwampRiversLayer.cpp index cd22cae8..68cef8a8 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, shared_ptr parent) : Layer(seed) +SwampRiversLayer::SwampRiversLayer(__int64 seed, shared_ptr parent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/SwampRiversLayer.h b/Minecraft.World/SwampRiversLayer.h index 97bab0f4..f724ad82 100644 --- a/Minecraft.World/SwampRiversLayer.h +++ b/Minecraft.World/SwampRiversLayer.h @@ -5,7 +5,7 @@ class SwampRiversLayer : public Layer { public: - SwampRiversLayer(int64_t seed, shared_ptr parent); + SwampRiversLayer(__int64 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/System.h b/Minecraft.World/System.h index 1d48b408..06e265cc 100644 --- a/Minecraft.World/System.h +++ b/Minecraft.World/System.h @@ -20,16 +20,16 @@ public: ArrayCopyFunctionDeclaration(Biome *) ArrayCopyFunctionDeclaration(int) - static int64_t nanoTime(); - static int64_t currentTimeMillis(); - static int64_t currentRealTimeMillis(); // 4J Added to get real-world time for timestamps in saves + static __int64 nanoTime(); + static __int64 currentTimeMillis(); + static __int64 currentRealTimeMillis(); // 4J Added to get real-world time for timestamps in saves static void ReverseUSHORT(unsigned short *pusVal); static void ReverseSHORT(short *psVal); static void ReverseULONG(unsigned long *pulVal); static void ReverseULONG(unsigned int *pulVal); static void ReverseINT(int *piVal); - static void ReverseULONGLONG(int64_t *pullVal); + static void ReverseULONGLONG(__int64 *pullVal); static void ReverseWCHARA(WCHAR *pwch,int iLen); }; diff --git a/Minecraft.World/TheEndDimension.cpp b/Minecraft.World/TheEndDimension.cpp index 031d6de4..ccc8641b 100644 --- a/Minecraft.World/TheEndDimension.cpp +++ b/Minecraft.World/TheEndDimension.cpp @@ -19,7 +19,7 @@ ChunkSource *TheEndDimension::createRandomLevelSource() const return new TheEndLevelRandomLevelSource(level, level->getSeed()); } -float TheEndDimension::getTimeOfDay(int64_t time, float a) const +float TheEndDimension::getTimeOfDay(__int64 time, float a) const { return 0.0f; } diff --git a/Minecraft.World/TheEndDimension.h b/Minecraft.World/TheEndDimension.h index 268be6f6..95bd6980 100644 --- a/Minecraft.World/TheEndDimension.h +++ b/Minecraft.World/TheEndDimension.h @@ -6,7 +6,7 @@ class TheEndDimension : public Dimension public: virtual void init(); virtual ChunkSource *createRandomLevelSource() const; - virtual float getTimeOfDay(int64_t time, float a) const; + virtual float getTimeOfDay(__int64 time, float a) const; virtual float *getSunriseColor(float td, float a); virtual Vec3 *getFogColor(float td, float a) const; virtual bool hasGround(); diff --git a/Minecraft.World/TheEndLevelRandomLevelSource.cpp b/Minecraft.World/TheEndLevelRandomLevelSource.cpp index 755f0d2f..46f3dbab 100644 --- a/Minecraft.World/TheEndLevelRandomLevelSource.cpp +++ b/Minecraft.World/TheEndLevelRandomLevelSource.cpp @@ -9,7 +9,7 @@ #include "net.minecraft.world.level.storage.h" #include "TheEndLevelRandomLevelSource.h" -TheEndLevelRandomLevelSource::TheEndLevelRandomLevelSource(Level *level, int64_t seed) +TheEndLevelRandomLevelSource::TheEndLevelRandomLevelSource(Level *level, __int64 seed) { m_XZSize = END_LEVEL_MIN_WIDTH; @@ -370,17 +370,17 @@ void TheEndLevelRandomLevelSource::postProcess(ChunkSource *parent, int xt, int // 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 - // used in RandomLevelSource::postProcess to make sure this random value is consistent for each world generation. + // used in RandomLevelSource::postProcess to make sure this random value is consistent for each world generation. pprandom->setSeed(level->getSeed()); - int64_t xScale = pprandom->nextLong() / 2 * 2 + 1; - int64_t zScale = pprandom->nextLong() / 2 * 2 + 1; + __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; + __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 HeavyTile::instaFall = false; - + app.processSchematics(parent->getChunk(xt,zt)); } @@ -418,4 +418,4 @@ TilePos *TheEndLevelRandomLevelSource::findNearestMapFeature(Level *level, const { return NULL; } - + diff --git a/Minecraft.World/TheEndLevelRandomLevelSource.h b/Minecraft.World/TheEndLevelRandomLevelSource.h index 217918ee..2dc7f131 100644 --- a/Minecraft.World/TheEndLevelRandomLevelSource.h +++ b/Minecraft.World/TheEndLevelRandomLevelSource.h @@ -9,7 +9,7 @@ public: 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; private: @@ -30,7 +30,7 @@ private: Level *level; public: - TheEndLevelRandomLevelSource(Level *level, int64_t seed); + TheEndLevelRandomLevelSource(Level *level, __int64 seed); ~TheEndLevelRandomLevelSource(); void prepareHeights(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); @@ -56,5 +56,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 TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); }; diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp index 77a62c8d..e0ef8dd9 100644 --- a/Minecraft.World/Tile.cpp +++ b/Minecraft.World/Tile.cpp @@ -16,14 +16,14 @@ #include "net.minecraft.h" #include "Tile.h" -wstring Tile::TILE_DESCRIPTION_PREFIX = L"Tile."; +wstring Tile::TILE_DESCRIPTION_PREFIX = L"Tile."; const float Tile::INDESTRUCTIBLE_DESTROY_TIME = -1.0f; Tile::SoundType *Tile::SOUND_NORMAL = NULL; Tile::SoundType *Tile::SOUND_WOOD = NULL; Tile::SoundType *Tile::SOUND_GRAVEL = NULL; -Tile::SoundType *Tile::SOUND_GRASS = NULL; +Tile::SoundType *Tile::SOUND_GRASS = NULL; Tile::SoundType *Tile::SOUND_STONE = NULL; Tile::SoundType *Tile::SOUND_METAL = NULL; Tile::SoundType *Tile::SOUND_GLASS = NULL; @@ -185,7 +185,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; @@ -273,7 +273,7 @@ void Tile::staticCtor() 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(); @@ -281,7 +281,7 @@ void Tile::staticCtor() 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); @@ -310,17 +310,17 @@ void Tile::staticCtor() // 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); @@ -409,7 +409,7 @@ void Tile::staticCtor() 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); @@ -658,7 +658,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; @@ -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, 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); @@ -977,7 +977,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(); @@ -1333,7 +1333,7 @@ void Tile::handleRain(Level *level, int x, int y, int z) { } - void Tile::levelTimeChanged(Level *level, int64_t delta, int64_t newTime) + void Tile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime) { } @@ -1454,26 +1454,26 @@ Tile::SoundType::SoundType(eMATERIALSOUND_TYPE eMaterialSound, float volume, flo } float Tile::SoundType::getVolume() const -{ - return volume; +{ + return volume; } float Tile::SoundType::getPitch() const -{ - return pitch; +{ + return pitch; } //wstring getBreakSound() const { return breakSound; } //wstring getStepSound() const { return stepSound; } int Tile::SoundType::getBreakSound() const -{ - return iBreakSound; +{ + return iBreakSound; } int Tile::SoundType::getStepSound() const -{ - return iStepSound; +{ + return iStepSound; } int Tile::SoundType::getPlaceSound() const -{ - return iPlaceSound; +{ + return iPlaceSound; } diff --git a/Minecraft.World/Tile.h b/Minecraft.World/Tile.h index fb17f917..fa2f5786 100644 --- a/Minecraft.World/Tile.h +++ b/Minecraft.World/Tile.h @@ -56,13 +56,13 @@ protected: ThreadStorage(); }; static DWORD tlsIdxShape; -public: +public: // Each new thread that needs to use Vec3 pools 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 ReleaseThreadStorage(); -public: +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 @@ -87,7 +87,7 @@ public: float pitch; 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; } @@ -100,7 +100,7 @@ public: static SoundType *SOUND_NORMAL; static SoundType *SOUND_WOOD; static SoundType *SOUND_GRAVEL; - static SoundType *SOUND_GRASS; + static SoundType *SOUND_GRASS; static SoundType *SOUND_STONE; static SoundType *SOUND_METAL; static SoundType *SOUND_GLASS; @@ -287,7 +287,7 @@ public: 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; @@ -456,7 +456,7 @@ public: static TripWireSourceTile *tripWireSource; static Tile *tripWire; static Tile *emeraldBlock; - + static Tile *cocoa; static Tile *skull; @@ -464,7 +464,7 @@ public: static Tile *flowerPot; static Tile *carrots; static Tile *potatoes; - static Tile *anvil; + static Tile *anvil; static Tile *netherQuartz; static Tile *quartzBlock; static Tile *stairs_quartz; @@ -636,9 +636,9 @@ public: 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); + virtual void levelTimeChanged(Level *level, __int64 delta, __int64 newTime); virtual void registerIcons(IconRegister *iconRegister); - virtual wstring getTileItemIconName(); + 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 diff --git a/Minecraft.World/VoronoiZoom.cpp b/Minecraft.World/VoronoiZoom.cpp index f62cc9b6..78323dfa 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, shared_ptrparent) : Layer(seedMixup) +VoronoiZoom::VoronoiZoom(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/VoronoiZoom.h b/Minecraft.World/VoronoiZoom.h index 43a8de66..c0738c90 100644 --- a/Minecraft.World/VoronoiZoom.h +++ b/Minecraft.World/VoronoiZoom.h @@ -5,7 +5,7 @@ class VoronoiZoom : public Layer { public: - VoronoiZoom(int64_t seedMixup, shared_ptrparent); + VoronoiZoom(__int64 seedMixup, shared_ptrparent); virtual intArray getArea(int xo, int yo, int w, int h); diff --git a/Minecraft.World/WaterLevelChunk.cpp b/Minecraft.World/WaterLevelChunk.cpp index 19f3e8a1..b6dbd05d 100644 --- a/Minecraft.World/WaterLevelChunk.cpp +++ b/Minecraft.World/WaterLevelChunk.cpp @@ -143,7 +143,7 @@ bool WaterLevelChunk::testSetBlocksAndData(byteArray data, int x0, int y0, int z return false; } -Random *WaterLevelChunk::getRandom(int64_t l) +Random *WaterLevelChunk::getRandom(__int64 l) { return new Random((level->getSeed() + x * x * 4987142 + x * 5947611 + z * z * 4392871l + z * 389711) ^ l); } diff --git a/Minecraft.World/WaterLevelChunk.h b/Minecraft.World/WaterLevelChunk.h index 43e7e0c6..18dc8a05 100644 --- a/Minecraft.World/WaterLevelChunk.h +++ b/Minecraft.World/WaterLevelChunk.h @@ -39,7 +39,7 @@ public: void setBlocks(byteArray newBlocks, int sub); 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; bool testSetBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p); - Random *getRandom(int64_t l); + Random *getRandom(__int64 l); virtual Biome *getBiome(int x, int z, BiomeSource *biomeSource); virtual void reSyncLighting() {}; // 4J added }; diff --git a/Minecraft.World/ZoneFile.cpp b/Minecraft.World/ZoneFile.cpp index 661cb7dd..fc1f36bf 100644 --- a/Minecraft.World/ZoneFile.cpp +++ b/Minecraft.World/ZoneFile.cpp @@ -6,7 +6,7 @@ const int ZoneFile::slotsLength = ZonedChunkStorage::CHUNKS_PER_ZONE * ZonedChunkStorage::CHUNKS_PER_ZONE; -ZoneFile::ZoneFile(int64_t key, File file, File entityFile) : slots(slotsLength) +ZoneFile::ZoneFile(__int64 key, File file, File entityFile) : slots(slotsLength) { lastUse = 0; diff --git a/Minecraft.World/ZoneFile.h b/Minecraft.World/ZoneFile.h index 5adb60ee..d7b8cc82 100644 --- a/Minecraft.World/ZoneFile.h +++ b/Minecraft.World/ZoneFile.h @@ -17,18 +17,18 @@ private: short slotCount; public: - int64_t lastUse; + __int64 lastUse; private: HANDLE channel; public: - int64_t key; + __int64 key; File file; NbtSlotFile *entityFile; - ZoneFile(int64_t key, File file, File entityFile); + ZoneFile(__int64 key, File file, File entityFile); ~ZoneFile(); void readHeader(); diff --git a/Minecraft.World/ZoneIo.cpp b/Minecraft.World/ZoneIo.cpp index 0bd2a637..f1838c86 100644 --- a/Minecraft.World/ZoneIo.cpp +++ b/Minecraft.World/ZoneIo.cpp @@ -2,7 +2,7 @@ #include "ByteBuffer.h" #include "ZoneIo.h" -ZoneIo::ZoneIo(HANDLE channel, int64_t pos) +ZoneIo::ZoneIo(HANDLE channel, __int64 pos) { this->channel = channel; this->pos = pos; diff --git a/Minecraft.World/ZoneIo.h b/Minecraft.World/ZoneIo.h index 59840564..22473583 100644 --- a/Minecraft.World/ZoneIo.h +++ b/Minecraft.World/ZoneIo.h @@ -7,10 +7,10 @@ class ZoneIo { private: HANDLE channel; - int64_t pos; + __int64 pos; public: - ZoneIo(HANDLE channel, int64_t pos); + ZoneIo(HANDLE channel, __int64 pos); void write(byteArray bb, int size); void write(ByteBuffer *bb, int size); ByteBuffer *read(int size); diff --git a/Minecraft.World/ZonedChunkStorage.cpp b/Minecraft.World/ZonedChunkStorage.cpp index aed408c6..b4ee8585 100644 --- a/Minecraft.World/ZonedChunkStorage.cpp +++ b/Minecraft.World/ZonedChunkStorage.cpp @@ -11,7 +11,7 @@ // 4J Stu - There are changes to this class for 1.8.2, but since we never use it anyway lets not worry about it const int ZonedChunkStorage::BIT_TERRAIN_POPULATED = 0x0000001; - + const int ZonedChunkStorage::CHUNKS_PER_ZONE_BITS = 5; // = 32 const int ZonedChunkStorage::CHUNKS_PER_ZONE = 1 << ZonedChunkStorage::CHUNKS_PER_ZONE_BITS; // ^2 @@ -50,7 +50,7 @@ ZoneFile *ZonedChunkStorage::getZoneFile(int x, int z, bool create) int xZone = x >> CHUNKS_PER_ZONE_BITS; int zZone = z >> CHUNKS_PER_ZONE_BITS; - int64_t key = xZone + (zZone << 20l); + __int64 key = xZone + (zZone << 20l); // 4J - was !zoneFiles.containsKey(key) if (zoneFiles.find(key) == zoneFiles.end()) { @@ -107,8 +107,8 @@ LevelChunk *ZonedChunkStorage::load(Level *level, int x, int z) header->flip(); int xOrg = header->getInt(); int zOrg = header->getInt(); - int64_t time = header->getLong(); - int64_t flags = header->getLong(); + __int64 time = header->getLong(); + __int64 flags = header->getLong(); lc->terrainPopulated = (flags & BIT_TERRAIN_POPULATED) != 0; @@ -121,7 +121,7 @@ LevelChunk *ZonedChunkStorage::load(Level *level, int x, int z) void ZonedChunkStorage::save(Level *level, LevelChunk *lc) { - int64_t flags = 0; + __int64 flags = 0; if (lc->terrainPopulated) flags |= BIT_TERRAIN_POPULATED; ByteBuffer *header = ByteBuffer::allocate(CHUNK_HEADER_SIZE); @@ -147,10 +147,10 @@ void ZonedChunkStorage::tick() tickCount++; if (tickCount % (20 * 10) == 4) { - vector toClose; + vector<__int64> toClose; AUTO_VAR(itEndZF, zoneFiles.end()); - for( unordered_map::iterator it = zoneFiles.begin(); it != itEndZF; it++ ) + for( unordered_map<__int64, ZoneFile *>::iterator it = zoneFiles.begin(); it != itEndZF; it++ ) { ZoneFile *zoneFile = it->second; if (tickCount - zoneFile->lastUse > 20 * 60) @@ -158,11 +158,11 @@ void ZonedChunkStorage::tick() toClose.push_back(zoneFile->key); } } - + AUTO_VAR(itEndTC, toClose.end()); for (AUTO_VAR(it, toClose.begin()); it != itEndTC; it++) { - int64_t key = *it ; //toClose[i]; + __int64 key = *it ; //toClose[i]; // 4J - removed try/catch // try { char buf[256]; @@ -181,7 +181,7 @@ void ZonedChunkStorage::tick() void ZonedChunkStorage::flush() { AUTO_VAR(itEnd, zoneFiles.end()); - for( unordered_map::iterator it = zoneFiles.begin(); it != itEnd; it++ ) + for( unordered_map<__int64, ZoneFile *>::iterator it = zoneFiles.begin(); it != itEnd; it++ ) { ZoneFile *zoneFile = it->second; // 4J - removed try/catch diff --git a/Minecraft.World/ZonedChunkStorage.h b/Minecraft.World/ZonedChunkStorage.h index c8b89db9..ed7e3b65 100644 --- a/Minecraft.World/ZonedChunkStorage.h +++ b/Minecraft.World/ZonedChunkStorage.h @@ -14,24 +14,24 @@ class ZonedChunkStorage : public ChunkStorage { public: static const int BIT_TERRAIN_POPULATED; - + static const int CHUNKS_PER_ZONE_BITS; // = 32 static const int CHUNKS_PER_ZONE; // ^2 - + static const int CHUNK_WIDTH; - + static const int CHUNK_HEADER_SIZE; static const int CHUNK_SIZE; static const int CHUNK_LAYERS ; static const int CHUNK_SIZE_BYTES; - + static const ByteOrder BYTEORDER; File dir; private: - unordered_map zoneFiles; - int64_t tickCount; + unordered_map<__int64, ZoneFile *> zoneFiles; + __int64 tickCount; public: ZonedChunkStorage(File dir); diff --git a/Minecraft.World/ZoomLayer.cpp b/Minecraft.World/ZoomLayer.cpp index c2123785..bef24709 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, shared_ptrparent) : Layer(seedMixup) +ZoomLayer::ZoomLayer(__int64 seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } @@ -81,7 +81,7 @@ int ZoomLayer::random(int a, int b, int c, int d) return d; } -shared_ptrZoomLayer::zoom(int64_t seed, shared_ptr sup, int count) +shared_ptrZoomLayer::zoom(__int64 seed, shared_ptr sup, int count) { shared_ptrresult = sup; for (int i = 0; i < count; i++) diff --git a/Minecraft.World/ZoomLayer.h b/Minecraft.World/ZoomLayer.h index 8ec93c8a..f865f088 100644 --- a/Minecraft.World/ZoomLayer.h +++ b/Minecraft.World/ZoomLayer.h @@ -5,7 +5,7 @@ class ZoomLayer : public Layer { public: - ZoomLayer(int64_t seedMixup, shared_ptr parent); + ZoomLayer(__int64 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 shared_ptr zoom(int64_t seed, shared_ptrsup, int count); + static shared_ptr zoom(__int64 seed, shared_ptrsup, int count); }; \ No newline at end of file diff --git a/Minecraft.World/stdafx.h b/Minecraft.World/stdafx.h index 065cd097..614f997b 100644 --- a/Minecraft.World/stdafx.h +++ b/Minecraft.World/stdafx.h @@ -9,7 +9,9 @@ #define AUTO_VAR(_var, _val) auto _var = _val #endif -#include +#if ( defined _XBOX || defined _WINDOWS64 || defined _DURANGO ) +typedef unsigned __int64 __uint64; +#endif #ifdef _WINDOWS64 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers diff --git a/Minecraft.World/system.cpp b/Minecraft.World/system.cpp index 69039921..72727e20 100644 --- a/Minecraft.World/system.cpp +++ b/Minecraft.World/system.cpp @@ -21,7 +21,7 @@ void System::arraycopy(arrayWithLength src, unsigned int srcPos, arrayWith assert( srcPos >=0 && srcPos <= src.length); assert( srcPos + length <= src.length ); assert( dstPos + length <= dst->length ); - + memcpy( dst->data + dstPos, src.data + srcPos, length); } @@ -30,7 +30,7 @@ void System::arraycopy(arrayWithLength src, unsigned int srcPos, arrayWithL assert( srcPos >=0 && srcPos <= src.length); assert( srcPos + length <= src.length ); assert( dstPos + length <= dst->length ); - + memcpy( dst->data + dstPos, src.data + srcPos, length * sizeof(int) ); } @@ -47,10 +47,10 @@ void System::arraycopy(arrayWithLength src, unsigned int srcPos, arrayWithL // long startTime = System.nanoTime(); // // ... the code being measured ... // long estimatedTime = System.nanoTime() - startTime; -// +// //Returns: //The current value of the system timer, in nanoseconds. -int64_t System::nanoTime() +__int64 System::nanoTime() { return GetTickCount() * 1000000LL; } @@ -58,21 +58,21 @@ int64_t System::nanoTime() //Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, //the granularity of the value depends on the underlying operating system and may be larger. For example, //many operating systems measure time in units of tens of milliseconds. -//See the description of the class Date for a discussion of slight discrepancies that may arise between "computer time" +//See the description of the class Date for a discussion of slight discrepancies that may arise between "computer time" //and coordinated universal time (UTC). // //Returns: //the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC. -int64_t System::currentTimeMillis() +__int64 System::currentTimeMillis() { #ifdef __PS3__ -// sys_time_get_current_time() obtains the elapsed time since Epoch (1970/01/01 00:00:00 UTC). -// The value is separated into two parts: sec stores the elapsed time in seconds, and nsec +// sys_time_get_current_time() obtains the elapsed time since Epoch (1970/01/01 00:00:00 UTC). +// The value is separated into two parts: sec stores the elapsed time in seconds, and nsec // stores the value that is smaller than a second in nanoseconds. sys_time_sec_t sec; sys_time_nsec_t nsec; sys_time_get_current_time(&sec, &nsec); - int64_t msec = (sec * 1000) + (nsec / (1000*1000)); + __int64 msec = (sec * 1000) + (nsec / (1000*1000)); return msec; #elif defined __ORBIS__ @@ -85,7 +85,7 @@ int64_t System::currentTimeMillis() return sceKernelGetProcessTimeWide() / 1000; /* SceDateTime Time; sceRtcGetCurrentClockLocalTime(&Time); - int64_t systTime = (((((((Time.day * 24) + Time.hour) * 60) + Time.minute) * 60) + Time.second) * 1000) + (Time.microsecond / 1000); + __int64 systTime = (((((((Time.day * 24) + Time.hour) * 60) + Time.minute) * 60) + Time.second) * 1000) + (Time.microsecond / 1000); return systTime;*/ #else @@ -106,12 +106,12 @@ int64_t System::currentTimeMillis() } // 4J Stu - Added this so that we can use real-world timestamps in PSVita saves. Particularly required for the save transfers to be smooth -int64_t System::currentRealTimeMillis() +__int64 System::currentRealTimeMillis() { #ifdef __PSVITA__ SceDateTime Time; sceRtcGetCurrentClockLocalTime(&Time); - int64_t systTime = (((((((Time.day * 24) + Time.hour) * 60) + Time.minute) * 60) + Time.second) * 1000) + (Time.microsecond / 1000); + __int64 systTime = (((((((Time.day * 24) + Time.hour) * 60) + Time.minute) * 60) + Time.second) * 1000) + (Time.microsecond / 1000); return systTime; #else return currentTimeMillis(); @@ -175,9 +175,9 @@ void System::ReverseINT(int *piVal) pchVal1[3]=pchVal2[0]; } -void System::ReverseULONGLONG(int64_t *pullVal) +void System::ReverseULONGLONG(__int64 *pullVal) { - int64_t ullValue=*pullVal; + __int64 ullValue=*pullVal; unsigned char *pchVal1=(unsigned char *)pullVal; unsigned char *pchVal2=(unsigned char *)&ullValue; -- 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/ConsoleSaveFileOriginal.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 PlayStation®Plus 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. + + Sí - - 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 - - Sí + + 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. + + Sì - - 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 - - Sì + + 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... + + + Sí + + + 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 - - Sí + + 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. + + På - - 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 - - På + + 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. + - - Lã + + + 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 + + Lã - - 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. + - - Lã + + +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 + + Lã - - 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. + + PÃ¥ - - 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 - - PÃ¥ + + 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. + + Aç - - 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 - - AÄŸ + + {*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. - - Aç + + 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 + + AÄŸ - - 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 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. +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