diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..a4d4a4c2 --- /dev/null +++ b/.clang-format @@ -0,0 +1,53 @@ +--- +BasedOnStyle: Microsoft +AccessModifierOffset: -2 +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterExternBlock: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: false + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +ColumnLimit: 0 +IncludeBlocks: Preserve +IndentAccessModifiers: false +IndentCaseBlocks: true +IndentCaseLabels: false +IndentExportBlock: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: false +IndentPPDirectives: None +IndentWidth: 4 +InsertBraces: true +InsertNewlineAtEOF: true +NamespaceIndentation: None +PointerAlignment: Right +RemoveParentheses: Leave +RemoveSemicolon: false +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: CaseSensitive +SpacesInParens: Never +SpacesInParensOptions: + ExceptDoubleParentheses: false + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +TabWidth: 4 +UseTab: Never diff --git a/.github/IMG_8725.png b/.github/TutorialWorld.png similarity index 100% rename from .github/IMG_8725.png rename to .github/TutorialWorld.png diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0dfcc8e2..a1c3e74a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,21 +1,23 @@ -# Pull Request + ## Description -Briefly describe the changes this PR introduces. + ## Changes ### Previous Behavior -*Describe how the code behaved before this change.* + ### Root Cause -*Explain the core reason behind the erroneous/old behavior (e.g., bug, design flaw, missing edge case).* + ### New Behavior -*Describe how the code behaves after this change.* + ### Fix Implementation -*Detail exactly how the issue was resolved (specific code changes, algorithms, logic flows).* + ## Related Issues - Fixes #[issue-number] diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 00f18f53..4ef1274d 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -5,6 +5,10 @@ on: push: branches: - 'main' + paths-ignore: + - '.gitignore' + - '*.md' + - '.github/*.md' jobs: build: @@ -32,4 +36,8 @@ jobs: with: tag_name: nightly name: Nightly Release - files: LCEWindows64.zip \ No newline at end of file + body: Requires at least Windows 7 and DirectX 11 compatible GPU to run. Compiled with MSVC v14.44.35207 in Release mode with Whole Program Optimization, as well as `/O2 /Ot /Oi /Ob3 /GF /fp:precise`. + files: | + LCEWindows64.zip + ./x64/Release/Minecraft.Client.exe + ./x64/Release/Minecraft.Client.pdb diff --git a/.gitignore b/.gitignore index 0a42b42e..9caff84a 100644 --- a/.gitignore +++ b/.gitignore @@ -423,4 +423,13 @@ Minecraft.World/x64_Debug/ Minecraft.World/Release/ Minecraft.World/x64_Release/ -build/* \ No newline at end of file +build/* + +# Existing build output files +!x64/**/Effects.msscmp +!x64/**/iggy_w64.dll +!x64/**/mss64.dll +!x64/**/redist64/ + +# Local saves +Minecraft.Client/Saves/ diff --git a/CMakeLists.txt b/CMakeLists.txt index a9ce5f69..2d83c5c8 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 RC ASM_MASM) if(NOT WIN32) message(FATAL_ERROR "This CMake build currently supports Windows only.") @@ -12,11 +12,25 @@ endif() set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +function(configure_msvc_target target) + target_compile_options(${target} PRIVATE + $<$>,$>:/W3> + $<$,$>:/W0> + $<$:/MP> + $<$:/FS> + $<$:/EHsc> + $<$,$>:/GL /O2 /Oi /GT /GF> + ) +endfunction() + include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/WorldSources.cmake") include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ClientSources.cmake") list(TRANSFORM MINECRAFT_WORLD_SOURCES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World/") list(TRANSFORM MINECRAFT_CLIENT_SOURCES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/") +list(APPEND MINECRAFT_CLIENT_SOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Xbox/MinecraftWindows.rc" +) add_library(MinecraftWorld STATIC ${MINECRAFT_WORLD_SOURCES}) target_include_directories(MinecraftWorld PRIVATE @@ -28,7 +42,7 @@ 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) + configure_msvc_target(MinecraftWorld) endif() add_executable(MinecraftClient WIN32 ${MINECRAFT_CLIENT_SOURCES}) @@ -43,7 +57,10 @@ 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) + configure_msvc_target(MinecraftClient) + target_link_options(MinecraftClient PRIVATE + $<$:/LTCG /INCREMENTAL:NO> + ) endif() set_target_properties(MinecraftClient PROPERTIES @@ -54,18 +71,20 @@ target_link_libraries(MinecraftClient PRIVATE MinecraftWorld d3d11 XInput9_1_0 + 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/Compile.md b/COMPILE.md similarity index 87% rename from Compile.md rename to COMPILE.md index 8947cecb..b62c9575 100644 --- a/Compile.md +++ b/COMPILE.md @@ -41,5 +41,6 @@ cd .\build\Debug Notes: - The CMake build is Windows-only and x64-only. +- Contributors on macOS or Linux need a Windows machine or VM to build the project. Running the game via Wine is separate from having a supported build environment. - Post-build asset copy is automatic for `MinecraftClient` in CMake (Debug and Release variants). - The game relies on relative paths (for example `Common\Media\...`), so launching from the output directory is required. 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); - - InputStream *fileStream = getResource(L"\\" + path + animationDefinitionFile, requiresFallback); - - //Minecraft::getInstance()->getLogger().info("Found animation info for: " + animationDefinitionFile); -#ifndef _CONTENT_PACKAGE - wprintf(L"Found animation info for: %ls\n", animationDefinitionFile.c_str() ); -#endif - InputStreamReader isr(fileStream); - BufferedReader br(&isr); wstring result = L""; - wstring line = br.readLine(); - while (!line.empty()) + InputStream *fileStream = getResource(L"\\" + path + animationDefinitionFile, requiresFallback); + + if(fileStream) { - line = trimString(line); - if (line.length() > 0) + //Minecraft::getInstance()->getLogger().info("Found animation info for: " + animationDefinitionFile); +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Found animation info for: %ls\n", animationDefinitionFile.c_str() ); +#endif + InputStreamReader isr(fileStream); + BufferedReader br(&isr); + + + 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..8123a2f0 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" @@ -52,6 +55,12 @@ #endif #include "DLCTexturePack.h" +#ifdef _WINDOWS64 +#include "Xbox\Network\NetworkPlayerXbox.h" +#include "Common\Network\PlatformNetworkManagerStub.h" +#endif + + #ifdef _DURANGO #include "..\Minecraft.World\DurangoStats.h" #include "..\Minecraft.World\GenericStats.h" @@ -65,15 +74,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 +91,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 +106,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 +124,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 +138,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 +151,8 @@ ClientConnection::~ClientConnection() void ClientConnection::tick() { - if (!done) connection->tick(); - connection->flush(); + if (!done) connection->tick(); + connection->flush(); } INetworkPlayer *ClientConnection::getNetworkPlayer() @@ -152,7 +163,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 +416,17 @@ 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) ); - break; - + case AddEntityPacket::MINECART: + e = Minecart::createMinecart(level, x, y, z, packet->data); case AddEntityPacket::FISH_HOOK: { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing @@ -446,9 +448,10 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } } - shared_ptr player = dynamic_pointer_cast(owner); - if (player != NULL) + + if (owner != NULL && 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 +466,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 +484,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 +510,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 +522,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 +575,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 +600,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 +639,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) { - e->absMoveTo(x,y,z,yRot,xRot); + // 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); } - e->entityId = packet->id; - level->putEntity(packet->id, e); + 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 + { + // For everything else, set position + e->absMoveTo(x, y, z, yRot, xRot); + } + 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 +679,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 +707,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) @@ -734,7 +762,7 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) return; } } -#ifdef _WINDOWS64 +/*#ifdef _WINDOWS64 // On Windows64 all XUIDs are INVALID_XUID so the XUID check above never fires. // packet->m_playerIndex is the server-assigned sequential index (set via LoginPacket), // NOT the controller slot — so we must scan all local player slots and match by @@ -748,17 +776,17 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) return; } } -#endif +#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 +795,45 @@ 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->getName(); +#endif + +#ifdef _WINDOWS64 + { + PlayerUID pktXuid = player->getXuid(); + const PlayerUID WIN64_XUID_BASE = (PlayerUID)0xe000d45248242f2e; + if (pktXuid >= WIN64_XUID_BASE && pktXuid < WIN64_XUID_BASE + MINECRAFT_NET_MAX_PLAYERS) + { + BYTE smallId = (BYTE)(pktXuid - WIN64_XUID_BASE); + INetworkPlayer* np = g_NetworkManager.GetPlayerBySmallId(smallId); + if (np != NULL) + { + NetworkPlayerXbox* npx = (NetworkPlayerXbox*)np; + IQNetPlayer* qp = npx->GetQNetPlayer(); + if (qp != NULL && qp->m_gamertag[0] == 0) + { + wcsncpy_s(qp->m_gamertag, 32, packet->name.c_str(), _TRUNCATE); + } + } + } + } #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 +873,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 +885,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 +930,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 +943,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,11 +959,44 @@ 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) { +#ifdef _WINDOWS64 + if (!g_NetworkManager.IsHost()) + { + for (int i = 0; i < packet->ids.length; i++) + { + shared_ptr entity = getEntity(packet->ids[i]); + if (entity != NULL && entity->GetType() == eTYPE_PLAYER) + { + shared_ptr player = dynamic_pointer_cast(entity); + if (player != NULL) + { + PlayerUID xuid = player->getXuid(); + INetworkPlayer* np = g_NetworkManager.GetPlayerByXuid(xuid); + if (np != NULL) + { + NetworkPlayerXbox* npx = (NetworkPlayerXbox*)np; + IQNetPlayer* qp = npx->GetQNetPlayer(); + if (qp != NULL) + { + extern CPlatformNetworkManagerStub* g_pPlatformNetworkManager; + g_pPlatformNetworkManager->NotifyPlayerLeaving(qp); + qp->m_smallId = 0; + qp->m_isRemote = false; + qp->m_isHostPlayer = false; + qp->m_gamertag[0] = 0; + qp->SetCustomDataValue(0); + } + } + } + } + } + } +#endif for (int i = 0; i < packet->ids.length; i++) { level->removeEntity(packet->ids[i]); @@ -916,51 +1005,51 @@ void ClientConnection::handleRemoveEntity(shared_ptr packe void ClientConnection::handleMovePlayer(shared_ptr packet) { - shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; + shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; - double x = player->x; - double y = player->y; - double z = player->z; - float yRot = player->yRot; - float xRot = player->xRot; + double x = player->x; + double y = player->y; + double z = player->z; + float yRot = player->yRot; + float xRot = player->xRot; - if (packet->hasPos) + if (packet->hasPos) { - x = packet->x; - y = packet->y; - z = packet->z; - } - if (packet->hasRot) + x = packet->x; + y = packet->y; + z = packet->z; + } + if (packet->hasRot) { - yRot = packet->yRot; - xRot = packet->xRot; - } + 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) + 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 +1058,7 @@ void ClientConnection::handleMovePlayer(shared_ptr packet) { ui.CloseUIScenes(m_userIndex); } - } + } } @@ -1067,24 +1156,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 +1252,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 +1282,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 +1327,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 +1379,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 +1389,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 +1443,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 +1683,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 +1723,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 +1747,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 +1818,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 +1881,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 +1911,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 +1939,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 +2216,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 +2250,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 +2262,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 +2283,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 +2297,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 (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 (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 +2323,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 +2336,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 +2383,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 +2589,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 +2688,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 +2736,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 +2786,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 +2805,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 +2837,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 +2880,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 +2894,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 +2907,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 +2951,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 +2963,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 +2975,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 +3002,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 +3058,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 +3082,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 +3184,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 +3202,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 +3243,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 +3305,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 +3328,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: - minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); - break; } + + 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); + } + + minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); } void ClientConnection::handleAwardStat(shared_ptr packet) @@ -2971,17 +3359,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 +3398,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 +3546,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 +3690,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 +3705,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 +3753,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..e8e0d147 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 }; @@ -797,6 +829,7 @@ enum EControllerActions ACTION_MENU_OTHER_STICK_LEFT, ACTION_MENU_OTHER_STICK_RIGHT, ACTION_MENU_PAUSEMENU, + ACTION_MENU_QUICK_MOVE, #ifdef _DURANGO ACTION_MENU_GTC_PAUSE, @@ -875,7 +908,7 @@ enum eMCLang eMCLang_plPL, eMCLang_trTR, eMCLang_elEL, - eMCLang_zhCHS, + eMCLang_csCS, eMCLang_zhCHT, eMCLang_laLAS, @@ -910,4 +943,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 1906b1aa..e9affe6b 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 @@ -1318,6 +1334,38 @@ void SoundEngine::playMusicUpdate() // char *SoundName = (char *)ConvertSoundPathToName(name); // strcat((char *)szStreamName,SoundName); + const bool isCD = (m_musicID >= m_iStream_CD_1); + const char* folder = isCD ? "cds/" : "music/"; + + FILE* pFile = nullptr; + if (fopen_s(&pFile, reinterpret_cast(m_szStreamName), "rb") == 0 && pFile) + { + fclose(pFile); + } + else + { + const char* extensions[] = { ".wav" }; // only wav works outside of binka files to my knowledge, i've only tested ogg, wav, mp3 and only wav worked out of the bunch + size_t count = sizeof(extensions) / sizeof(extensions[0]); + bool found = false; + + for (size_t i = 0; i < count; i++) + { + int n = sprintf_s(reinterpret_cast(m_szStreamName), 512, "%s%s%s%s", m_szMusicPath, folder, m_szStreamFileA[m_musicID], extensions[i]); + if (n < 0) continue; + + if (fopen_s(&pFile, reinterpret_cast(m_szStreamName), "rb") == 0 && pFile) + { + fclose(pFile); + found = true; + break; + } + } + + if (!found) + { + return; + } + } app.DebugPrintf("Starting streaming - %s\n",m_szStreamName); 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/ConsoleGameMode.cpp b/Minecraft.Client/Common/ConsoleGameMode.cpp index b080e628..703d3f55 100644 --- a/Minecraft.Client/Common/ConsoleGameMode.cpp +++ b/Minecraft.Client/Common/ConsoleGameMode.cpp @@ -1,9 +1,9 @@ #include "stdafx.h" #include "ConsoleGameMode.h" -#include "..\Common\Tutorial\Tutorial.h" +#include ".\Tutorial\Tutorial.h" ConsoleGameMode::ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection) : TutorialMode(iPad, minecraft, connection) { tutorial = new Tutorial(iPad); -} \ No newline at end of file +} diff --git a/Minecraft.Client/Common/ConsoleGameMode.h b/Minecraft.Client/Common/ConsoleGameMode.h index 3e486cbf..983381b5 100644 --- a/Minecraft.Client/Common/ConsoleGameMode.h +++ b/Minecraft.Client/Common/ConsoleGameMode.h @@ -1,5 +1,5 @@ #pragma once -#include "..\Common\Tutorial\TutorialMode.h" +#include ".\Tutorial\TutorialMode.h" class ConsoleGameMode : public TutorialMode { @@ -7,4 +7,4 @@ public: ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection); virtual bool isImplemented() { return true; } -}; \ No newline at end of file +}; diff --git a/Minecraft.Client/Common/Console_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 c2082965..b476ca90 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -1,20 +1,22 @@  #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" #include "..\ProgressRenderer.h" -#include "..\..\Minecraft.Client\LevelRenderer.h" -#include "..\..\Minecraft.Client\MobSkinMemTextureProcessor.h" -#include "..\..\Minecraft.Client\Minecraft.h" +#include "..\LevelRenderer.h" +#include "..\MobSkinMemTextureProcessor.h" +#include "..\Minecraft.h" #include "..\ClientConnection.h" #include "..\MultiPlayerLocalPlayer.h" -#include "..\..\Minecraft.Client\LocalPlayer.h" +#include "..\LocalPlayer.h" #include "..\..\Minecraft.World\Player.h" #include "..\..\Minecraft.World\Inventory.h" #include "..\..\Minecraft.World\Level.h" @@ -22,25 +24,23 @@ #include "..\..\Minecraft.World\Container.h" #include "..\..\Minecraft.World\DispenserTileEntity.h" #include "..\..\Minecraft.World\SignTileEntity.h" -#include "..\..\Minecraft.Client\StatsCounter.h" +#include "..\StatsCounter.h" #include "..\GameMode.h" #include "..\Xbox\Social\SocialManager.h" #include "Tutorial\TutorialMode.h" #if defined _XBOX || defined _WINDOWS64 -#include "..\..\Minecraft.Client\Xbox\XML\ATGXmlParser.h" -#include "..\..\Minecraft.Client\Xbox\XML\xmlFilesCallback.h" +#include "..\Xbox\XML\ATGXmlParser.h" +#include "..\Xbox\XML\xmlFilesCallback.h" #endif #include "Minecraft_Macros.h" -#include "..\..\Minecraft.Client\PlayerList.h" -#include "..\..\Minecraft.Client\ServerPlayer.h" +#include "..\PlayerList.h" +#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" -#include "..\..\Minecraft.Client\EntityRenderDispatcher.h" +#include "..\EntityRenderDispatcher.h" #include "..\..\Minecraft.World\compression.h" #include "..\TexturePackRepository.h" #include "..\DLCTexturePack.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,10 +691,112 @@ 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 ////////////////////////////////////////////// + +#ifdef _WINDOWS64 +static void Win64_GetSettingsPath(char *outPath, DWORD size) +{ + GetModuleFileNameA(NULL, outPath, size); + char *lastSlash = strrchr(outPath, '\\'); + if (lastSlash) *(lastSlash + 1) = '\0'; + strncat_s(outPath, size, "settings.dat", _TRUNCATE); +} +static void Win64_SaveSettings(GAME_SETTINGS *gs) +{ + if (!gs) return; + char filePath[MAX_PATH] = {}; + Win64_GetSettingsPath(filePath, MAX_PATH); + FILE *f = NULL; + if (fopen_s(&f, filePath, "wb") == 0 && f) + { + fwrite(gs, sizeof(GAME_SETTINGS), 1, f); + fclose(f); + } +} +static void Win64_LoadSettings(GAME_SETTINGS *gs) +{ + if (!gs) return; + char filePath[MAX_PATH] = {}; + Win64_GetSettingsPath(filePath, MAX_PATH); + FILE *f = NULL; + if (fopen_s(&f, filePath, "rb") == 0 && f) + { + GAME_SETTINGS temp = {}; + if (fread(&temp, sizeof(GAME_SETTINGS), 1, f) == 1) + memcpy(gs, &temp, sizeof(GAME_SETTINGS)); + fclose(f); + } +} +#endif + void CMinecraftApp::InitGameSettings() { for(int i=0;iuiMashUpPackWorldsDisplay=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 +941,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 +951,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 +991,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 +1039,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 +1074,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 +1106,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 +1229,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 +1246,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 +1257,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 @@ -1180,9 +1381,13 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) case eGameSetting_Gamma: if(iPad==ProfileManager.GetPrimaryPad()) { +#if defined(_WIN64) || defined(_WINDOWS64) + pMinecraft->options->set(Options::Option::GAMMA, ((float)GameSettingsA[iPad]->ucGamma) / 100.0f); +#else // ucGamma range is 0-100, UpdateGamma is 0 - 32768 float fVal=((float)GameSettingsA[iPad]->ucGamma)*327.68f; RenderManager.UpdateGamma((unsigned short)fVal); +#endif } break; @@ -1208,7 +1413,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 +1483,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 +1619,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 +1644,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 +1723,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 +1763,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 +1774,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 +1793,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 +2182,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 +2315,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 +2340,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 +2368,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; @@ -2187,6 +2411,9 @@ void CMinecraftApp::CheckGameSettingsChanged(bool bOverride5MinuteTimer, int iPa StorageManager.WriteToProfile(i,true, bOverride5MinuteTimer); #else ProfileManager.WriteToProfile(i,true, bOverride5MinuteTimer); +#ifdef _WINDOWS64 + Win64_SaveSettings(GameSettingsA[i]); +#endif #endif GameSettingsA[i]->bSettingsChanged=false; } @@ -2200,6 +2427,9 @@ void CMinecraftApp::CheckGameSettingsChanged(bool bOverride5MinuteTimer, int iPa StorageManager.WriteToProfile(iPad,true, bOverride5MinuteTimer); #else ProfileManager.WriteToProfile(iPad,true, bOverride5MinuteTimer); +#ifdef _WINDOWS64 + Win64_SaveSettings(GameSettingsA[iPad]); +#endif #endif GameSettingsA[iPad]->bSettingsChanged=false; } @@ -2333,18 +2563,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 +2823,7 @@ void CMinecraftApp::HandleXuiActions(void) } loadingParams->completionData = completionData; - + // 4J Stu - Xbox only #ifdef _XBOX // Temporarily make this scene fullscreen @@ -2624,12 +2854,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 +2872,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 +2906,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 +2977,11 @@ void CMinecraftApp::HandleXuiActions(void) } } } - + #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(i); #endif - + SetAction(i,eAppAction_Idle); } break; @@ -2936,12 +3166,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 +3261,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 +3284,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 +3302,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 +3330,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 +3365,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 +3403,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,9 +3445,9 @@ 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) + if (pMinecraft->levels.data[i] != nullptr) { gameStarted = true; break; @@ -3239,7 +3469,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 +3480,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 +3496,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 +3535,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 +3593,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 +3607,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 +3625,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 +3635,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 +3647,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 +3671,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 +3808,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 +3821,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 +3838,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 +3904,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 +3915,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 +3957,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 +3977,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 +4021,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 +4050,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 +4074,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 +4117,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 +4145,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 +4251,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 +4370,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 +4388,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 +4467,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 +4592,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 +4628,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 +4643,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 +4673,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 +4688,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 +4701,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 +4738,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 +4757,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 +4770,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 +4779,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 +4811,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 +4827,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 +4895,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 +4931,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 +4953,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 +4971,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 +5003,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 +5203,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 +5236,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(); } */ @@ -5107,6 +5387,16 @@ void CMinecraftApp::MountNextDLC(int iPad) StorageManager.SetSaveDisabled(false); } } +#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 } } @@ -5142,7 +5432,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 +5501,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 +5962,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 +5978,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 +5996,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 +6007,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 +6168,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 +6188,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 +6310,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 +6410,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 +6485,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 +6591,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 +6858,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 +6876,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 +7023,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 +7082,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 +7358,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForProductName(WCHAR *pwchProductName) } ++it; } - + return NULL; } @@ -6998,6 +7391,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 +7400,7 @@ void CMinecraftApp::EnterSaveNotificationSection() app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); } } + } LeaveCriticalSection(&m_saveNotificationCriticalSection); } @@ -7013,6 +7409,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 +7418,7 @@ void CMinecraftApp::LeaveSaveNotificationSection() app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); } } + } LeaveCriticalSection(&m_saveNotificationCriticalSection); } @@ -7069,12 +7468,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 +7611,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 +7726,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 +7929,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 +8130,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 +8246,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 +8263,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 +8353,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 +8459,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 +8545,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 +8715,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 +8859,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 +8873,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto { #ifdef _XBOX_ONE - + switch(pCurrent->eType) { @@ -8365,10 +8895,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 +8937,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto } break; } - + } LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); @@ -8661,7 +9191,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 +9255,7 @@ vector *CMinecraftApp::GetAdditionalSkinBoxes(DWORD dwSkinID) pvSkinBoxes = (*it).second; } } - + LeaveCriticalSection( &csAdditionalSkinBoxes ); return pvSkinBoxes; } @@ -8770,14 +9300,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 +9331,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 +9352,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 +9578,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 +9686,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 +9714,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 +9758,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 +9821,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 +9877,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 +9949,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 +10017,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 +10028,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 +10046,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 +10063,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 -wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder) +#endif + +wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder, wstring mountPoint) { - wstring path = L"TPACK:"; + wstring path = mountPoint; #ifdef _XBOX if(allowOverride) { @@ -9489,6 +10112,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 +10133,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 +10171,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 14356010..ec36b765 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -5,11 +5,11 @@ using namespace std; #include "Audio/Consoles_SoundEngine.h" #include -#include "..\Common\Tutorial\TutorialEnum.h" +#include ".\Tutorial\TutorialEnum.h" #ifdef _XBOX -#include "..\Common\XUI\XUI_Helper.h" -#include "..\Common\XUI\XUI_HelpCredits.h" +#include ".\XUI\XUI_Helper.h" +#include ".\XUI\XUI_HelpCredits.h" #endif #include "UI\UIStructs.h" @@ -17,9 +17,9 @@ using namespace std; #include #include "..\StringTable.h" -#include "..\Common\DLC\DLCManager.h" -#include "..\Common\GameRules\ConsoleGameRulesConstants.h" -#include "..\Common\GameRules\GameRuleManager.h" +#include ".\DLC\DLCManager.h" +#include ".\GameRules\ConsoleGameRulesConstants.h" +#include ".\GameRules\GameRuleManager.h" #include "..\SkinBox.h" #include "..\ArchiveFile.h" @@ -39,6 +39,11 @@ class Container; class DispenserTileEntity; class SignTileEntity; class BrewingStandTileEntity; +class CommandBlockEntity; +class HopperTileEntity; +class MinecartHopper; +class EntityHorse; +class BeaconTileEntity; class LocalPlayer; class DLCPack; class LevelRuleset; @@ -87,9 +92,9 @@ public: #ifdef _EXTENDED_ACHIEVEMENTS /* 4J-JEV: - * We need more space in the profile data because of the new achievements and statistics - * necessary for the new expanded achievement set. - */ + * We need more space in the profile data because of the new achievements and statistics + * necessary for the new expanded achievement set. + */ static const int GAME_DEFINED_PROFILE_DATA_BYTES = 2*972; // per user #else static const int GAME_DEFINED_PROFILE_DATA_BYTES = 972; // per user @@ -108,7 +113,7 @@ public: static const int USER_RR = 5; static const int USER_SR = 6; static const int USER_UI = 7; // 4J Stu - This also makes it appear on the UI console - + void HandleButtonPresses(); bool IntroRunning() { return m_bIntroRunning;} void SetIntroRunning(bool bSet) {m_bIntroRunning=bSet;} @@ -127,23 +132,30 @@ public: int GetLocalPlayerCount(void); bool LoadInventoryMenu(int iPad,shared_ptr player, bool bNavigateBack=false); bool LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack=false); - bool LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level); + bool LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level, const wstring &name); bool LoadFurnaceMenu(int iPad,shared_ptr inventory, shared_ptr furnace); bool LoadBrewingStandMenu(int iPad,shared_ptr inventory, shared_ptr brewingStand); bool LoadContainerMenu(int iPad,shared_ptr inventory, shared_ptr container); bool LoadTrapMenu(int iPad,shared_ptr inventory, shared_ptr trap); bool LoadCrafting2x2Menu(int iPad,shared_ptr player); bool LoadCrafting3x3Menu(int iPad,shared_ptr player, int x, int y, int z); + bool LoadFireworksMenu(int iPad,shared_ptr player, int x, int y, int z); bool LoadSignEntryMenu(int iPad,shared_ptr sign); bool LoadRepairingMenu(int iPad,shared_ptr inventory, Level *level, int x, int y, int z); - bool LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level); + bool LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level, const wstring &name); + + bool LoadCommandBlockMenu(int iPad, shared_ptr commandBlock) { return false; } + bool LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper); + bool LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper); + bool LoadHorseMenu(int iPad ,shared_ptr inventory, shared_ptr container, shared_ptr horse); + bool LoadBeaconMenu(int iPad ,shared_ptr inventory, shared_ptr beacon); bool GetTutorialMode() { return m_bTutorialMode;} void SetTutorialMode(bool bSet) {m_bTutorialMode=bSet;} void SetSpecialTutorialCompletionFlag(int iPad, int index); - static LPCWSTR GetString(int iID); + static LPCWSTR GetString(int iID); eGameMode GetGameMode() { return m_eGameMode;} void SetGameMode(eGameMode eMode) { m_eGameMode=eMode;} @@ -159,7 +171,7 @@ public: void SetXuiServerAction(int iPad, eXuiServerAction action, LPVOID param = NULL) {m_eXuiServerAction[iPad]=action; m_eXuiServerActionParam[iPad] = param;} eXuiServerAction GetGlobalXuiServerAction() {return m_eGlobalXuiServerAction;} void SetGlobalXuiServerAction(eXuiServerAction action) {m_eGlobalXuiServerAction=action;} - + DisconnectPacket::eDisconnectReason GetDisconnectReason() { return m_disconnectReason; } void SetDisconnectReason(DisconnectPacket::eDisconnectReason bVal) { m_disconnectReason = bVal; } @@ -206,6 +218,7 @@ public: static int OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad); #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + wstring toStringOptionsStatus(const C4JStorage::eOptionsCallback &eStatus); static int DefaultOptionsCallback(LPVOID pParam,C4JStorage::PROFILESETTINGS *pSettings, const int iPad); int SetDefaultOptions(C4JStorage::PROFILESETTINGS *pSettings,const int iPad,bool bWriteProfile=true); #ifdef __ORBIS__ @@ -224,7 +237,7 @@ public: #endif virtual void SetRichPresenceContext(int iPad, int contextId) = 0; - + void SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal); unsigned char GetGameSettings(int iPad,eGameSetting eVal); unsigned char GetGameSettings(eGameSetting eVal); // for the primary pad @@ -247,7 +260,8 @@ public: // Minecraft language select void SetMinecraftLanguage(int iPad, unsigned char ucLanguage); unsigned char GetMinecraftLanguage(int iPad); - + void SetMinecraftLocale(int iPad, unsigned char ucLanguage); + unsigned char GetMinecraftLocale(int iPad); // 4J-PB - set a timer when the user navigates the quickselect, so we can bring the opacity back to defaults for a short time unsigned int GetOpacityTimer(int iPad) { return m_uiOpacityCountDown[iPad]; } @@ -301,9 +315,11 @@ public: #endif #ifdef _DEBUG_MENUS_ENABLED - bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugArtToolsOn(); #else - bool DebugSettingsOn() { return false;} + bool DebugSettingsOn() { return false;} + bool DebugArtToolsOn() { return false;} #endif void SetDebugSequence(const char *pchSeq); static int DebugInputCallback(LPVOID pParam); @@ -424,10 +440,10 @@ public: byteArray getArchiveFile(const wstring &filename); private: - + static int BannedLevelDialogReturned(void *pParam,int iPad,const C4JStorage::EMessageResult); static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); - + VBANNEDLIST *m_vBannedListA[XUSER_MAX_COUNT]; void HandleButtonPresses(int iPad); @@ -440,7 +456,7 @@ private: // Container scene for some menu -// CXuiScene debugContainerScene; + // CXuiScene debugContainerScene; //bool m_bSplitScreenEnabled; @@ -482,14 +498,14 @@ public: static const DWORD m_dwOfferID = 0x00000001; -// timer + // timer void InitTime(); void UpdateTime(); // trial timer void SetTrialTimerStart(void); float getTrialTimer(void); - + // notifications from the game for qnet VNOTIFICATIONS *GetNotifications() {return &m_vNotifications;} @@ -599,7 +615,7 @@ public: unsigned int GetDLCCreditsCount(); SCreditTextItemDef * GetDLCCredits(int iIndex); -// TMS + // TMS void ReadDLCFileFromTMS(int iPad,eTMSAction action, bool bCallback=false); void ReadXuidsFileFromTMS(int iPad,eTMSAction action,bool bCallback=false); @@ -633,8 +649,8 @@ private: static unordered_map DLCInfo_Full; // full offerid, dlc_info static unordered_map DLCInfo_SkinName; // skin name, full offer id #endif -// bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file -// bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file + // bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file + // bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file bool m_bDefaultCapeInstallAttempted; // have we attempted to install the default cape from tms @@ -651,13 +667,13 @@ public: XUSER_SIGNIN_INFO m_currentSigninInfo[XUSER_MAX_COUNT]; //void OverrideFontRenderer(bool set, bool immediate = true); -// void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } + // void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } BANNEDLIST BannedListA[XUSER_MAX_COUNT]; private: -// XUI_FontRenderer *m_fontRenderer; -// bool m_bFontRendererOverridden; -// bool m_bOverrideFontRenderer; + // XUI_FontRenderer *m_fontRenderer; + // bool m_bFontRendererOverridden; + // bool m_bOverrideFontRenderer; bool m_bRead_BannedListA[XUSER_MAX_COUNT]; @@ -667,7 +683,7 @@ private: public: void SetBanListCheck(int iPad,bool bVal) {m_BanListCheck[iPad]=bVal;} bool GetBanListCheck(int iPad) { return m_BanListCheck[iPad];} -// AUTOSAVE + // AUTOSAVE public: void SetAutosaveTimerTime(void); bool AutosaveDue(void); @@ -685,6 +701,11 @@ private: unsigned int m_uiGameHostSettings; static unsigned char m_szPNG[8]; +#ifdef _LARGE_WORLDS + unsigned int m_GameNewWorldSize; + bool m_bGameNewWorldSizeUseMoat; + unsigned int m_GameNewHellScale; +#endif unsigned int FromBigEndian(unsigned int uiValue); public: @@ -695,6 +716,13 @@ public: unsigned int GetGameHostOption(eGameHostOption eVal); unsigned int GetGameHostOption(unsigned int uiHostSettings, eGameHostOption eVal); +#ifdef _LARGE_WORLDS + void SetGameNewWorldSize(unsigned int newSize, bool useMoat) { m_GameNewWorldSize = newSize; m_bGameNewWorldSizeUseMoat = useMoat; } + unsigned int GetGameNewWorldSize() { return m_GameNewWorldSize; } + unsigned int GetGameNewWorldSizeUseMoat() { return m_bGameNewWorldSizeUseMoat; } + void SetGameNewHellScale(unsigned int newScale) { m_GameNewHellScale = newScale; } + unsigned int GetGameNewHellScale() { return m_GameNewHellScale; } +#endif void SetResetNether(bool bResetNether) {m_bResetNether=bResetNether;} bool GetResetNether() {return m_bResetNether;} bool CanRecordStatsAndAchievements(); @@ -808,9 +836,9 @@ public: DWORD m_dwDLCFileSize; BYTE *m_pDLCFileBuffer; -// static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); -// static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); -// static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); // Storing additional model parts per skin texture void SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC); @@ -875,27 +903,27 @@ public: void SetTickTMSDLCFiles(bool bVal); - wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder); + wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder, wstring mountPoint = L"TPACK:"); private: - unordered_mapm_localeA; - unordered_mapm_eMCLangA; - unordered_mapm_xcLangA; - wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder); + unordered_mapm_localeA; + unordered_mapm_eMCLangA; + unordered_mapm_xcLangA; + wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder, wstring mountPoint); public: #ifdef _XBOX -// bool m_bTransferSavesToXboxOne; -// unsigned int m_uiTransferSlotC; - + // bool m_bTransferSavesToXboxOne; + // unsigned int m_uiTransferSlotC; + #elif defined (__PS3__) - + #elif defined _DURANGO - + #elif defined _WINDOWS64 //CMinecraftAudio audio; #else // PS4 - + #endif #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/DLC/DLCManager.cpp index 123e4266..17c9fc6d 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.cpp +++ b/Minecraft.Client/Common/DLC/DLCManager.cpp @@ -91,6 +91,28 @@ void DLCManager::removePack(DLCPack *pack) } } +void DLCManager::removeAllPacks(void) +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = (DLCPack *)*it; + delete pack; + } + + m_packs.clear(); +} + +void DLCManager::LanguageChanged(void) +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = (DLCPack *)*it; + // update the language + pack->UpdateLanguage(); + } + +} + DLCPack *DLCManager::getPack(const wstring &name) { DLCPack *pack = NULL; @@ -292,12 +314,12 @@ DWORD DLCManager::checkForCorruptDLCAndAlert(bool showMessage /*= true*/) WCHAR wchFormat[132]; swprintf(wchFormat, 132, L"%ls\n\n%%ls", firstCorruptPack->getName().c_str()); - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),wchFormat); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL,wchFormat); } else { - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad()); } } diff --git a/Minecraft.Client/Common/DLC/DLCManager.h b/Minecraft.Client/Common/DLC/DLCManager.h index 55a62312..27765232 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.h +++ b/Minecraft.Client/Common/DLC/DLCManager.h @@ -74,6 +74,8 @@ public: void addPack(DLCPack *pack); void removePack(DLCPack *pack); + void removeAllPacks(void); + void LanguageChanged(void); DLCPack *getPack(const wstring &name); #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/DLC/DLCPack.cpp b/Minecraft.Client/Common/DLC/DLCPack.cpp index 507e51a7..4a003d05 100644 --- a/Minecraft.Client/Common/DLC/DLCPack.cpp +++ b/Minecraft.Client/Common/DLC/DLCPack.cpp @@ -191,7 +191,8 @@ DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) { case DLCManager::e_DLCType_Skin: { - std::vector splitPath = stringSplit(path,L'/'); + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); wstring strippedPath = splitPath.back(); newFile = new DLCSkinFile(strippedPath); @@ -211,7 +212,8 @@ DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) break; case DLCManager::e_DLCType_Cape: { - std::vector splitPath = stringSplit(path,L'/'); + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); wstring strippedPath = splitPath.back(); newFile = new DLCCapeFile(strippedPath); } @@ -411,3 +413,19 @@ bool DLCPack::hasPurchasedFile(DLCManager::EDLCType type, const wstring &path) return true; }*/ } + +void DLCPack::UpdateLanguage() +{ + // find the language file + DLCManager::e_DLCType_LocalisationData; + DLCFile *file = NULL; + + if(m_files[DLCManager::e_DLCType_LocalisationData].size() > 0) + { + file = m_files[DLCManager::e_DLCType_LocalisationData][0]; + DLCLocalisationFile *localisationFile = (DLCLocalisationFile *)getFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc"); + StringTable *strTable = localisationFile->getStringTable(); + strTable->ReloadStringTable(); + } + +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCPack.h b/Minecraft.Client/Common/DLC/DLCPack.h index 856744c2..df1f65f0 100644 --- a/Minecraft.Client/Common/DLC/DLCPack.h +++ b/Minecraft.Client/Common/DLC/DLCPack.h @@ -68,6 +68,8 @@ public: DWORD getLicenseMask( ) { return m_dwLicenseMask; } wstring getName() { return m_packName; } + + void UpdateLanguage(); #ifdef _XBOX_ONE wstring getPurchaseOfferId() { return m_wsProductId; } #else diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp index cf99465a..edf071c6 100644 --- a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp @@ -30,6 +30,7 @@ void DLCTextureFile::addParameter(DLCManager::EDLCParameterType type, const wstr { case DLCManager::e_DLCParamType_Anim: m_animString = value; + if(m_animString.empty()) m_animString = L","; m_bIsAnim = true; break; diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h index 5b97b108..91c4ef35 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h @@ -35,4 +35,8 @@ public: bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); virtual int getMinY(); + + EStructurePiece GetType() { return (EStructurePiece)0; } + void addAdditonalSaveData(CompoundTag *tag) {} + void readAdditonalSaveData(CompoundTag *tag) {} }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp index 4a4e27b2..3b995000 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -278,7 +278,7 @@ __int64 ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkB //{ // if(blockData[i] == Tile::sand_Id || blockData[i] == Tile::sandStone_Id) // { - // blockData[i] = Tile::whiteStone_Id; + // blockData[i] = Tile::endStone_Id; // } //} @@ -706,15 +706,19 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l shared_ptr e = *it; bool mobCanBeSaved = false; - if(bSaveMobs) + if (bSaveMobs) { - if( ( e->GetType() & eTYPE_MONSTER ) || ( e->GetType() & eTYPE_WATERANIMAL ) || ( e->GetType() & eTYPE_ANIMAL ) || - ( e->GetType() == eTYPE_CHICKEN ) || ( e->GetType() == eTYPE_WOLF ) || ( e->GetType() == eTYPE_VILLAGER) || ( e->GetType() == eTYPE_MUSHROOMCOW ) ) + if ( e->instanceof(eTYPE_MONSTER) || e->instanceof(eTYPE_WATERANIMAL) || e->instanceof(eTYPE_ANIMAL) || (e->GetType() == eTYPE_VILLAGER) ) + + // 4J-JEV: All these are derived from eTYPE_ANIMAL and true implicitly. + //|| ( e->GetType() == eTYPE_CHICKEN ) || ( e->GetType() == eTYPE_WOLF ) || ( e->GetType() == eTYPE_MUSHROOMCOW ) ) { mobCanBeSaved = true; } } - if(mobCanBeSaved || e->GetType() == eTYPE_MINECART || e->GetType() == eTYPE_BOAT || e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME) + + // 4J-JEV: Changed to check for instances of minecarts and hangingEntities instead of just eTYPE_PAINTING, eTYPE_ITEM_FRAME and eTYPE_MINECART + if (mobCanBeSaved || e->instanceof(eTYPE_MINECART) || e->GetType() == eTYPE_BOAT || e->instanceof(eTYPE_HANGING_ENTITY)) { CompoundTag *eTag = new CompoundTag(); if( e->save(eTag) ) @@ -725,7 +729,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l pos->get(1)->data -= yStart; pos->get(2)->data -= zStart; - if( e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME ) + if( e->instanceof(eTYPE_HANGING_ENTITY) ) { ((IntTag *) eTag->get(L"TileX") )->data -= xStart; ((IntTag *) eTag->get(L"TileY") )->data -= yStart; diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp index 0c6a7804..6e5688cc 100644 --- a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -106,17 +106,14 @@ void GameRuleManager::loadGameRules(DLCPack *pack) DWORD dSize; byte *dData = dlcHeader->getData(dSize); - LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); // = loadGameRules(dData, dSize); //, strings); createdLevelGenerationOptions->setGrSource( dlcHeader ); + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); - createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); - - - //createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); dlcHeader->lgo = createdLevelGenerationOptions; } @@ -128,15 +125,13 @@ void GameRuleManager::loadGameRules(DLCPack *pack) DWORD dSize; byte *dData = dlcFile->getData(dSize); - LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); // = loadGameRules(dData, dSize); //, strings); createdLevelGenerationOptions->setGrSource( new JustGrSource() ); - readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); - createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_tutorial ); - - //createdLevelGenerationOptions->set_DLCGameRulesFile( dlcFile ); + + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); createdLevelGenerationOptions->setLoadedData(); } @@ -659,6 +654,25 @@ void GameRuleManager::loadDefaultGameRules() #else // _XBOX +#ifdef _WINDOWS64 + File packedTutorialFile(L"Windows64Media\\Tutorial\\Tutorial.pck"); + if(!packedTutorialFile.exists()) packedTutorialFile = File(L"Windows64\\Tutorial\\Tutorial.pck"); +#elif defined(__ORBIS__) + File packedTutorialFile(L"/app0/orbis/Tutorial/Tutorial.pck"); +#elif defined(__PSVITA__) + File packedTutorialFile(L"PSVita/Tutorial/Tutorial.pck"); +#elif defined(__PS3__) + File packedTutorialFile(L"PS3/Tutorial/Tutorial.pck"); +#else + File packedTutorialFile(L"Tutorial\\Tutorial.pck"); +#endif + if(loadGameRulesPack(&packedTutorialFile)) + { + m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(L"Tutorial"); + m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + } +#if 0 wstring fpTutorial = L"Tutorial.pck"; if(app.getArchiveFileSize(fpTutorial) >= 0) { @@ -667,25 +681,18 @@ void GameRuleManager::loadDefaultGameRules() if ( app.m_dlcManager.readDLCDataFile(dwFilesProcessed,fpTutorial,pack,true) ) { app.m_dlcManager.addPack(pack); - m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); - m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + //m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); } else delete pack; } - /*StringTable *strings = new StringTable(baStrings.data, baStrings.length); - LevelGenerationOptions *lgo = new LevelGenerationOptions(); - lgo->setGrSource( new JustGrSource() ); - lgo->setSrc( LevelGenerationOptions::eSrc_tutorial ); - readRuleFile(lgo, tutorial.data, tutorial.length, strings); - lgo->setLoadedData();*/ - +#endif #endif } bool GameRuleManager::loadGameRulesPack(File *path) { bool success = false; -#ifdef _XBOX if(path->exists()) { DLCPack *pack = new DLCPack(L"",0xffffffff); @@ -700,12 +707,13 @@ bool GameRuleManager::loadGameRulesPack(File *path) delete pack; } } -#endif return success; } void GameRuleManager::setLevelGenerationOptions(LevelGenerationOptions *levelGen) { + unloadCurrentGameRules(); + m_currentGameRuleDefinitions = NULL; m_currentLevelGenerationOptions = levelGen; diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp index 717b066e..9ebd3428 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -7,6 +7,7 @@ #include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "Common\DLC\DLCGameRulesHeader.h" #include "..\..\StringTable.h" #include "LevelGenerationOptions.h" #include "ConsoleGameRules.h" @@ -41,7 +42,7 @@ void JustGrSource::setBaseSavePath(const wstring &x) { m_baseSavePath = x; m_bRe bool JustGrSource::ready() { return true; } -LevelGenerationOptions::LevelGenerationOptions() +LevelGenerationOptions::LevelGenerationOptions(DLCPack *parentPack) { m_spawnPos = NULL; m_stringTable = NULL; @@ -49,6 +50,7 @@ LevelGenerationOptions::LevelGenerationOptions() m_hasLoadedData = false; m_seed = 0; + m_bHasBeenInCreative = true; m_useFlatWorld = false; m_bHaveMinY = false; m_minY = INT_MAX; @@ -56,6 +58,9 @@ LevelGenerationOptions::LevelGenerationOptions() m_pbBaseSaveData = NULL; m_dwBaseSaveSize = 0; + + m_parentDLCPack = parentPack; + m_bLoadingData = false; } LevelGenerationOptions::~LevelGenerationOptions() @@ -70,17 +75,17 @@ LevelGenerationOptions::~LevelGenerationOptions() { delete *it; } - + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) { delete *it; } - + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) { delete *it; } - + if (m_stringTable) if (!isTutorial()) delete m_stringTable; @@ -93,7 +98,7 @@ ConsoleGameRules::EGameRuleType LevelGenerationOptions::getActionType() { return void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttrs) { GameRuleDefinition::writeAttributes(dos, numAttrs + 5); - + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnX); dos->writeUTF(_toString(m_spawnPos->x)); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnY); @@ -110,12 +115,12 @@ void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttr void LevelGenerationOptions::getChildren(vector *children) { GameRuleDefinition::getChildren(children); - + vector used_schematics; for (AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end(); it++) if ( !(*it)->isComplete() ) used_schematics.push_back( *it ); - + for(AUTO_VAR(it, m_structureRules.begin()); it!=m_structureRules.end(); it++) children->push_back( *it ); for(AUTO_VAR(it, used_schematics.begin()); it!=used_schematics.end(); it++) @@ -190,24 +195,24 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws { if(attributeValue.compare(L"true") == 0) m_useFlatWorld = true; app.DebugPrintf("LevelGenerationOptions: Adding parameter flatworld=%s\n",m_useFlatWorld?"TRUE":"FALSE"); - } + } else if(attributeName.compare(L"saveName") == 0) { - wstring string(getString(attributeValue)); + wstring string(attributeValue); if(!string.empty()) setDefaultSaveName( string ); else setDefaultSaveName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter saveName=%ls\n", getDefaultSaveName().c_str()); } else if(attributeName.compare(L"worldName") == 0) { - wstring string(getString(attributeValue)); + wstring string(attributeValue); if(!string.empty()) setWorldName( string ); else setWorldName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter worldName=%ls\n", getWorldName()); } else if(attributeName.compare(L"displayName") == 0) { - wstring string(getString(attributeValue)); + wstring string(attributeValue); if(!string.empty()) setDisplayName( string ); else setDisplayName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter displayName=%ls\n", getDisplayName()); @@ -228,6 +233,12 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws setBaseSavePath( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter baseSaveName=%ls\n", getBaseSavePath().c_str()); } + else if(attributeName.compare(L"hasBeenInCreative") == 0) + { + bool value = _fromString(attributeValue); + m_bHasBeenInCreative = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter gameMode=%d\n", m_bHasBeenInCreative); + } else { GameRuleDefinition::addAttribute(attributeName, attributeValue); @@ -297,7 +308,7 @@ bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int m_bHaveMinY = true; } - + // 4J Stu - We DO NOT intersect if our upper bound is below the lower bound for all schematics if( y1 < m_minY ) return false; @@ -413,14 +424,14 @@ void LevelGenerationOptions::getBiomeOverride(int biomeId, BYTE &tile, BYTE &top } } -bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation) { bool isFeature = false; for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) { StartFeature *sf = *it; - if(sf->isFeatureChunk(chunkX, chunkZ, feature)) + if(sf->isFeatureChunk(chunkX, chunkZ, feature, orientation)) { isFeature = true; break; @@ -442,15 +453,175 @@ unordered_map *LevelGenerationOptions::getUnfin = new unordered_map(); for (AUTO_VAR(it, usedFiles.begin()); it!=usedFiles.end(); it++) out->insert( pair(*it, getSchematicFile(*it)) ); - + return out; } +void LevelGenerationOptions::loadBaseSaveData() +{ + int mountIndex = -1; + if(m_parentDLCPack != NULL) mountIndex = m_parentDLCPack->GetDLCMountIndex(); + + if(mountIndex > -1) + { +#ifdef _DURANGO + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&LevelGenerationOptions::packMounted,this,L"WPACK")!=ERROR_IO_PENDING) +#else + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&LevelGenerationOptions::packMounted,this,"WPACK")!=ERROR_IO_PENDING) +#endif + { + // corrupt DLC + setLoadedData(); + app.DebugPrintf("Failed to mount LGO DLC %d for pad %d\n",mountIndex,ProfileManager.GetPrimaryPad()); + } + else + { + m_bLoadingData = true; + app.DebugPrintf("Attempted to mount DLC data for LGO %d\n", mountIndex); + } + } + else + { + setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + } +} + +int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) +{ + LevelGenerationOptions *lgo = (LevelGenerationOptions *)pParam; + lgo->m_bLoadingData = false; + if(dwErr!=ERROR_SUCCESS) + { + // corrupt DLC + app.DebugPrintf("Failed to mount LGO DLC for pad %d: %d\n",iPad,dwErr); + } + else + { + app.DebugPrintf("Mounted DLC for LGO, attempting to load data\n"); + DWORD dwFilesProcessed = 0; + int gameRulesCount = lgo->m_parentDLCPack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader); + for(int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader *dlcFile = (DLCGameRulesHeader *) lgo->m_parentDLCPack->getFile(DLCManager::e_DLCType_GameRulesHeader, i); + + if (!dlcFile->getGrfPath().empty()) + { + File grf( app.getFilePath(lgo->m_parentDLCPack->GetPackID(), dlcFile->getGrfPath(),true, L"WPACK:" ) ); + if (grf.exists()) + { +#ifdef _UNICODE + wstring path = grf.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(grf.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD dwFileSize = grf.length(); + DWORD bytesRead; + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + dlcFile->setGrfData(pbData, dwFileSize, lgo->m_stringTable); + + delete [] pbData; + + app.m_gameRules.setLevelGenerationOptions( dlcFile->lgo ); + } + } + } + } + if(lgo->requiresBaseSave() && !lgo->getBaseSavePath().empty() ) + { + File save(app.getFilePath(lgo->m_parentDLCPack->GetPackID(), lgo->getBaseSavePath(),true, L"WPACK:" )); + if (save.exists()) + { +#ifdef _UNICODE + wstring path = save.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(save.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD bytesRead,dwFileSize = GetFileSize(fileHandle,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + lgo->setBaseSaveData(pbData, dwFileSize); + } + } + + } +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"WPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("WPACK"); +#endif + + } + + lgo->setLoadedData(); + + return 0; +} + void LevelGenerationOptions::reset_start() { for ( AUTO_VAR( it, m_schematicRules.begin()); - it != m_schematicRules.end(); - it++ ) + it != m_schematicRules.end(); + it++ ) { (*it)->reset(); } @@ -478,9 +649,38 @@ bool LevelGenerationOptions::isFromDLC() { return getSrc() == eSrc_fromDLC; } bool LevelGenerationOptions::requiresTexturePack() { return info()->requiresTexturePack(); } UINT LevelGenerationOptions::getRequiredTexturePackId() { return info()->getRequiredTexturePackId(); } -wstring LevelGenerationOptions::getDefaultSaveName() { return info()->getDefaultSaveName(); } -LPCWSTR LevelGenerationOptions::getWorldName() { return info()->getWorldName(); } -LPCWSTR LevelGenerationOptions::getDisplayName() { return info()->getDisplayName(); } + +wstring LevelGenerationOptions::getDefaultSaveName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getDefaultSaveName() ); + case eSrc_fromDLC: return getString( info()->getDefaultSaveName() ); + case eSrc_tutorial: return app.GetString(IDS_TUTORIALSAVENAME); + } + return L""; +} +LPCWSTR LevelGenerationOptions::getWorldName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getWorldName() ); + case eSrc_fromDLC: return getString( info()->getWorldName() ); + case eSrc_tutorial: return app.GetString(IDS_PLAY_TUTORIAL); + } + return L""; +} +LPCWSTR LevelGenerationOptions::getDisplayName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getDisplayName() ); + case eSrc_fromDLC: return getString( info()->getDisplayName() ); + case eSrc_tutorial: return L""; + } + return L""; +} + wstring LevelGenerationOptions::getGrfPath() { return info()->getGrfPath(); } bool LevelGenerationOptions::requiresBaseSave() { return info()->requiresBaseSave(); } wstring LevelGenerationOptions::getBaseSavePath() { return info()->getBaseSavePath(); } @@ -506,6 +706,7 @@ bool LevelGenerationOptions::hasLoadedData() { return m_hasLoadedData; } void LevelGenerationOptions::setLoadedData() { m_hasLoadedData = true; } __int64 LevelGenerationOptions::getLevelSeed() { return m_seed; } +int LevelGenerationOptions::getLevelHasBeenInCreative() { return m_bHasBeenInCreative; } Pos *LevelGenerationOptions::getSpawnPos() { return m_spawnPos; } bool LevelGenerationOptions::getuseFlatWorld() { return m_useFlatWorld; } diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h index 0cc9da79..aa128ff8 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h @@ -149,6 +149,7 @@ private: __int64 m_seed; bool m_useFlatWorld; Pos *m_spawnPos; + int m_bHasBeenInCreative; vector m_schematicRules; vector m_structureRules; bool m_bHaveMinY; @@ -162,8 +163,11 @@ private: StringTable *m_stringTable; + DLCPack *m_parentDLCPack; + bool m_bLoadingData; + public: - LevelGenerationOptions(); + LevelGenerationOptions(DLCPack *parentPack = NULL); ~LevelGenerationOptions(); virtual ConsoleGameRules::EGameRuleType getActionType(); @@ -174,6 +178,7 @@ public: virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); __int64 getLevelSeed(); + int getLevelHasBeenInCreative(); Pos *getSpawnPos(); bool getuseFlatWorld(); @@ -197,12 +202,15 @@ public: LevelRuleset *getRequiredGameRules(); void getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile); - bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation = NULL); void loadStringTable(StringTable *table); LPCWSTR getString(const wstring &key); unordered_map *getUnfinishedSchematicFiles(); + + void loadBaseSaveData(); + static int packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask); // 4J-JEV: // ApplySchematicRules contain limited state diff --git a/Minecraft.Client/Common/GameRules/StartFeature.cpp b/Minecraft.Client/Common/GameRules/StartFeature.cpp index 9d5f15c0..7f0c8b5c 100644 --- a/Minecraft.Client/Common/GameRules/StartFeature.cpp +++ b/Minecraft.Client/Common/GameRules/StartFeature.cpp @@ -6,12 +6,13 @@ StartFeature::StartFeature() { m_chunkX = 0; m_chunkZ = 0; + m_orientation = 0; m_feature = StructureFeature::eFeature_Temples; } void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) { - GameRuleDefinition::writeAttributes(dos, numAttrs + 3); + GameRuleDefinition::writeAttributes(dos, numAttrs + 4); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkX); dos->writeUTF(_toString(m_chunkX)); @@ -19,6 +20,8 @@ void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) dos->writeUTF(_toString(m_chunkZ)); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_feature); dos->writeUTF(_toString((int)m_feature)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_orientation); + dos->writeUTF(_toString(m_orientation)); } void StartFeature::addAttribute(const wstring &attributeName, const wstring &attributeValue) @@ -35,6 +38,12 @@ void StartFeature::addAttribute(const wstring &attributeName, const wstring &att m_chunkZ = value; app.DebugPrintf("StartFeature: Adding parameter chunkZ=%d\n",m_chunkZ); } + else if(attributeName.compare(L"orientation") == 0) + { + int value = _fromString(attributeValue); + m_orientation = value; + app.DebugPrintf("StartFeature: Adding parameter orientation=%d\n",m_orientation); + } else if(attributeName.compare(L"feature") == 0) { int value = _fromString(attributeValue); @@ -47,7 +56,8 @@ void StartFeature::addAttribute(const wstring &attributeName, const wstring &att } } -bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation) { + if(orientation != NULL) *orientation = m_orientation; return chunkX == m_chunkX && chunkZ == m_chunkZ && feature == m_feature; } \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/StartFeature.h b/Minecraft.Client/Common/GameRules/StartFeature.h index d3f1280a..b198a2fa 100644 --- a/Minecraft.Client/Common/GameRules/StartFeature.h +++ b/Minecraft.Client/Common/GameRules/StartFeature.h @@ -7,7 +7,7 @@ using namespace std; class StartFeature : public GameRuleDefinition { private: - int m_chunkX, m_chunkZ; + int m_chunkX, m_chunkZ, m_orientation; StructureFeature::EFeatureTypes m_feature; public: @@ -18,5 +18,5 @@ public: virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); - bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp index 8184f45b..d81a2b03 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp @@ -74,16 +74,16 @@ bool XboxStructureActionPlaceContainer::placeContainerInLevel(StructurePiece *st { // Remove the current tile entity level->removeTileEntity( worldX, worldY, worldZ ); - level->setTile( worldX, worldY, worldZ, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); } - level->setTile( worldX, worldY, worldZ, m_tile ); + level->setTileAndData( worldX, worldY, worldZ, m_tile, 0, Tile::UPDATE_ALL ); shared_ptr container = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); app.DebugPrintf("XboxStructureActionPlaceContainer - placing a container at (%d,%d,%d)\n", worldX, worldY, worldZ); if ( container != NULL ) { - level->setData( worldX, worldY, worldZ, m_data); + level->setData( worldX, worldY, worldZ, m_data, Tile::UPDATE_CLIENTS); // Add items int slotId = 0; for(AUTO_VAR(it, m_items.begin()); it != m_items.end() && (slotId < container->getContainerSize()); ++it, ++slotId ) diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp index 1eca3342..3f6204af 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp @@ -50,10 +50,10 @@ bool XboxStructureActionPlaceSpawner::placeSpawnerInLevel(StructurePiece *struct { // Remove the current tile entity level->removeTileEntity( worldX, worldY, worldZ ); - level->setTile( worldX, worldY, worldZ, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); } - level->setTile( worldX, worldY, worldZ, m_tile ); + level->setTileAndData( worldX, worldY, worldZ, m_tile, 0, Tile::UPDATE_ALL ); shared_ptr entity = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); #ifndef _CONTENT_PACKAGE diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp new file mode 100644 index 00000000..07463517 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp @@ -0,0 +1,88 @@ +#include "stdafx.h" +#include "LeaderboardInterface.h" + +LeaderboardInterface::LeaderboardInterface(LeaderboardManager *man) +{ + m_manager = man; + m_pending = false; + + m_filter = (LeaderboardManager::EFilterMode) -1; + m_callback = NULL; + m_difficulty = 0; + m_type = LeaderboardManager::eStatsType_UNDEFINED; + m_startIndex = 0; + m_readCount = 0; + + m_manager->OpenSession(); +} + +LeaderboardInterface::~LeaderboardInterface() +{ + m_manager->CancelOperation(); + m_manager->CloseSession(); +} + +void LeaderboardInterface::ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_Friends; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_myUID = myUID; + m_startIndex = startIndex; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_MyScore; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_myUID = myUID; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, unsigned int startIndex, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_TopRank; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_startIndex = startIndex; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::CancelOperation() +{ + m_manager->CancelOperation(); + m_pending = false; +} + +void LeaderboardInterface::tick() +{ + if (m_pending) m_pending = !callManager(); +} + +bool LeaderboardInterface::callManager() +{ + switch (m_filter) + { + case LeaderboardManager::eFM_Friends: return m_manager->ReadStats_Friends(m_callback, m_difficulty, m_type, m_myUID, m_startIndex, m_readCount); + case LeaderboardManager::eFM_MyScore: return m_manager->ReadStats_MyScore(m_callback, m_difficulty, m_type, m_myUID, m_readCount); + case LeaderboardManager::eFM_TopRank: return m_manager->ReadStats_TopRank(m_callback, m_difficulty, m_type, m_startIndex, m_readCount); + default: assert(false); return true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h new file mode 100644 index 00000000..089c482b --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h @@ -0,0 +1,35 @@ +#pragma once + +#include "LeaderboardManager.h" + +// 4J-JEV: Simple interface for handling ReadStat failures. +class LeaderboardInterface +{ +private: + LeaderboardManager *m_manager; + bool m_pending; + + // Arguments. + LeaderboardManager::EFilterMode m_filter; + LeaderboardReadListener *m_callback; + int m_difficulty; + LeaderboardManager::EStatsType m_type; + PlayerUID m_myUID; + unsigned int m_startIndex; + unsigned int m_readCount; + +public: + LeaderboardInterface(LeaderboardManager *man); + ~LeaderboardInterface(); + + void ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + void ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int readCount); + void ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, unsigned int startIndex, unsigned int readCount); + + void CancelOperation(); + + void tick(); + +private: + bool callManager(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp new file mode 100644 index 00000000..78d62568 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp @@ -0,0 +1,1131 @@ +#include "stdafx.h" + +#include +#include +//#include + +#include "SonyLeaderboardManager.h" + +#include "base64.h" + +#include "Common\Consoles_App.h" +#include "Common\Network\Sony\SQRNetworkManager.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + + +#ifdef __ORBIS__ +#include "Orbis\OrbisExtras\ShutdownManager.h" +#include "Orbis\Orbis_App.h" +#elif defined __PSVITA__ +#include "PSVita\PSVitaExtras\ShutdownManager.h" +#include "PSVita\PSVita_App.h" +#elif defined __PS3__ +#include "PS3\PS3Extras\ShutdownManager.h" +#include "PS3\PS3_App.h" +#else +#error "SonyLeaderboardManager is included for a non-sony platform." +#endif + +SonyLeaderboardManager::SonyLeaderboardManager() +{ + m_eStatsState = eStatsState_Idle; + + m_titleContext = -1; + + m_myXUID = INVALID_XUID; + + m_scores = NULL; + + m_statsType = eStatsType_Kills; + m_difficulty = 0; + + m_requestId = 0; + + m_openSessions = 0; + + InitializeCriticalSection(&m_csViewsLock); + + m_running = false; + m_threadScoreboard = NULL; +} + +SonyLeaderboardManager::~SonyLeaderboardManager() +{ + m_running = false; + + // 4J-JEV: Wait for thread to stop and hope it doesn't take too long. + long long startShutdown = System::currentTimeMillis(); + while (m_threadScoreboard->isRunning()) + { + Sleep(1); + assert( (System::currentTimeMillis() - startShutdown) < 16 ); + } + + delete m_threadScoreboard; + + DeleteCriticalSection(&m_csViewsLock); +} + +int SonyLeaderboardManager::scoreboardThreadEntry(LPVOID lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eLeaderboardThread); + SonyLeaderboardManager *self = reinterpret_cast(lpParam); + + self->m_running = true; + app.DebugPrintf("[SonyLeaderboardManager] Thread started.\n"); + + bool needsWriting = false; + do + { + if (self->m_openSessions > 0 || needsWriting) + { + self->scoreboardThreadInternal(); + } + + EnterCriticalSection(&self->m_csViewsLock); + needsWriting = self->m_views.size() > 0; + LeaveCriticalSection(&self->m_csViewsLock); + + // 4J Stu - We can't write while we aren't signed in to live + if (!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + needsWriting = false; + } + + if ( (!needsWriting) && (self->m_eStatsState != eStatsState_Getting) ) + { + Sleep(50); // 4J-JEV: When we're not reading or writing. + } + + } while ( (self->m_running || self->m_eStatsState == eStatsState_Getting || needsWriting) + && ShutdownManager::ShouldRun(ShutdownManager::eLeaderboardThread) + ); + + // 4J-JEV, moved this here so setScore can finish up. + self->destroyTitleContext(self->m_titleContext); + + // TODO sceNpScoreTerm(); + app.DebugPrintf("[SonyLeaderboardManager] Thread closed.\n"); + ShutdownManager::HasFinished(ShutdownManager::eLeaderboardThread); + return 0; +} + +void SonyLeaderboardManager::scoreboardThreadInternal() +{ + // 4J-JEV: Just initialise the context the once now. + if (m_titleContext == -1) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + + if (!ProfileManager.IsSignedInLive(primaryPad)) return; + + int ret = initialiseScoreUtility(); + if (ret < 0) + { + if ( !scoreUtilityAlreadyInitialised(ret) ) + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() failed. ret = 0x%x\n", ret); + return; + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() already initialised, (0x%x)\n", ret); + } + } + + SceNpId npId; + ProfileManager.GetSceNpId(primaryPad,&npId); + + ret = createTitleContext(npId); + + if (ret < 0) return; + else m_titleContext = ret; + } + else assert( m_titleContext > 0 ); //Paranoia + + + switch (m_eStatsState) + { + case eStatsState_Getting: + // Player starts using async multiplayer feature + // 4J-PB - Fix for SCEA FQA #4 - TRC R4064 - Incorrect usage of AsyncMultiplay + // Note 1: + // The following NP call should be reserved for asynchronous multiplayer modes that require PS Plus to be accessed. + // + // Note 2: + // The message is not displayed with a user without PlayStationPlus subscription and they are able to access the Leaderboards. + + // NotifyAsyncPlusFeature(); + + switch(m_eFilterMode) + { + case eFM_MyScore: + case eFM_Friends: + getScoreByIds(); + break; + case eFM_TopRank: + getScoreByRange(); + break; + } + break; + + case eStatsState_Canceled: + case eStatsState_Failed: + case eStatsState_Ready: + case eStatsState_Idle: + + // 4J-JEV: Moved this here, I don't want reading and + // writing going on at the same time. + // -- + // 4J-JEV: Writing no longer changes the manager state, + // we'll manage the write queue seperately. + + EnterCriticalSection(&m_csViewsLock); + bool hasWork = !m_views.empty(); + LeaveCriticalSection(&m_csViewsLock); + + if (hasWork) + { + setScore(); + } + + break; + } +} + +HRESULT SonyLeaderboardManager::fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len) +{ + HRESULT ret; + + // Get queried users. + switch(m_eFilterMode) + { + case eFM_Friends: + { + // 4J-JEV: Implementation for Orbis & Vita as they a very similar. +#if (defined __ORBIS__) || (defined __PSVITA__) + + sce::Toolkit::NP::Utilities::Future s_friendList; + ret = getFriendsList(s_friendList); + + if(ret != SCE_TOOLKIT_NP_SUCCESS) + { + // Error handling + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] 'getFriendslist' fail, 0x%x.\n", ret); + return false; + } + else if (s_friendList.hasResult()) + { + // 4J-JEV: Friends list doesn't include player, leave space for them. + len = s_friendList.get()->size() + 1; + + npIds = new SceNpId[len]; + + int i = 0; + + sce::Toolkit::NP::FriendsList::const_iterator itr; + for (itr = s_friendList.get()->begin(); itr != s_friendList.get()->end(); itr++) + { + npIds[i] = itr->npid; + i++; + } + + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + } + else + { + // 4J-JEV: Something terrible must have happend, + // 'getFriendslist' was supposed to be a synchronous operation. + __debugbreak(); + + // 4J-JEV: We can at least fall-back to just the players score. + len = 1; + npIds = new SceNpId[1]; + + npIds[0] = myNpId; + } + +#elif (defined __PS3__) + // PS3 + + // 4J-JEV: Doesn't include the player (its just their friends). + ret = sceNpBasicGetFriendListEntryCount(&len); + len += 1; + + npIds = new SceNpId[len]; + + + for (uint32_t i = 0; i < len-1; i++) + { + ret = sceNpBasicGetFriendListEntry(i, npIds+i); + if (ret<0) return ret; + + } + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + +#endif + } + break; + case eFM_MyScore: + { + len = 1; + npIds = new SceNpId[1]; + npIds[0] = myNpId; + } + break; + } + + return S_OK; +} + +bool SonyLeaderboardManager::getScoreByIds() +{ + if (m_eStatsState == eStatsState_Canceled) return false; + + // ---------------------------- + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + SceNpId *npIds = NULL; + + int ret; + uint32_t num = 0; + + SceNpScorePlayerRankData *ptr; + SceNpScoreComment *comments; + // ---------------------------- + + // Check for invalid LManager state. + assert( m_eFilterMode == eFM_Friends + || m_eFilterMode == eFM_MyScore); + + SceNpId myNpId; + // 4J-PB - should it be user 0? + if(!ProfileManager.IsSignedInLive(0)) + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession() fail: User isn't signed in to PSN\n"); + return false; + } + ProfileManager.GetSceNpId(0,&myNpId); + + ret = fillByIdsQuery(myNpId, npIds, num); +#ifdef __PS3__ + if (ret < 0) goto error2; +#endif + + ptr = new SceNpScorePlayerRankData[num]; + comments = new SceNpScoreComment[num]; + + ZeroMemory(ptr, sizeof(SceNpScorePlayerRankData) * num); + ZeroMemory(comments, sizeof(SceNpScoreComment) * num); + + /* app.DebugPrintf("sceNpScoreGetRankingByNpId(\n\t transaction=%i,\n\t boardID=0,\n\t npId=%i,\n\t friendCount*sizeof(SceNpId)=%i*%i=%i,\ + rankData=%i,\n\t friendCount*sizeof(SceNpScorePlayerRankData)=%i,\n\t NULL, 0, NULL, 0,\n\t friendCount=%i,\n...\n", + transaction, npId, friendCount, sizeof(SceNpId), friendCount*sizeof(SceNpId), + rankData, friendCount*sizeof(SceNpScorePlayerRankData), friendCount + ); */ + + int boardId = getBoardId(m_difficulty, m_statsType); + + // 4J-JEV: Orbis can only do with 100 ids max, so we use batches. +#ifdef __ORBIS__ + for (int batch=0; batchrankData.scoreValue + ); + + // Sort scores + std::sort(m_scores, m_scores + m_readCount, SortByRank); + + delete [] ptr; + delete [] comments; + delete [] npIds; + + m_eStatsState = eStatsState_Ready; + return true; + + // Error. +error3: + if (ret!=SCE_NP_COMMUNITY_ERROR_ABORTED) //0x8002a109 + destroyTransactionContext(m_requestId); + m_requestId = 0; + delete [] ptr; + delete [] comments; +error2: + if (npIds != NULL) delete [] npIds; +error1: + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] getScoreByIds() FAILED, ret=0x%X\n", ret); + return false; +} + +bool SonyLeaderboardManager::getScoreByRange() +{ + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + unsigned int num = m_readCount; + SceNpScoreRankData *ptr; + SceNpScoreComment *comments; + + assert(m_eFilterMode == eFM_TopRank); + + int ret = createTransactionContext(m_titleContext); + if (m_eStatsState == eStatsState_Canceled) + { + // Cancel operation has been called, abort. + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - m_eStatsState == eStatsState_Canceled.\n"); + destroyTransactionContext(ret); + return false; + } + else if (ret < 0) + { + // Error occurred creating a transaction, abort. + m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - createTransaction failed, ret=0x%X\n", ret); + return false; + } + else + { + // Transaction created successfully, continue. + m_requestId = ret; + } + + ptr = new SceNpScoreRankData[num]; + comments = new SceNpScoreComment[num]; + + int boardId = getBoardId(m_difficulty, m_statsType); + ret = sceNpScoreGetRankingByRange( + m_requestId, + boardId, // BoardId + + m_startIndex, + + ptr, sizeof(SceNpScoreRankData) * num, //OUT: Rank Data + + comments, sizeof(SceNpScoreComment) * num, //OUT: Comment Data + + NULL, 0, // GameData. + + num, + + &last_sort_date, + &m_maxRank, // 'Total number of players registered in the target scoreboard.' + + NULL // Reserved, specify null. + ); + + if (ret == SCE_NP_COMMUNITY_ERROR_ABORTED) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): 'sceNpScoreGetRankingByRange' aborted (0x%X).\n", ret); + + delete [] ptr; + delete [] comments; + + return false; + } + else if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): Game ranking not found."); + + delete [] ptr; + delete [] comments; + + m_scores = NULL; + m_readCount = 0; + + m_eStatsState = eStatsState_Ready; + return false; + } + else if (ret<0) goto error2; + else + { + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(), success, 1stScore=%i.\n", ptr->scoreValue); + } + + // Return. + destroyTransactionContext(m_requestId); + m_requestId = 0; + + //m_stats = ptr; //Maybe: addPadding(num,ptr); + + if (m_scores != NULL) delete [] m_scores; + m_readCount = ret; + m_scores = new ReadScore[m_readCount]; + for (int i=0; i 0) + ret = eStatsReturn_Success; + + if (m_readListener != NULL) + { + app.DebugPrintf("[SonyLeaderboardManager] OnStatsReadComplete(%i, %i, _), m_readCount=%i.\n", ret, m_maxRank, m_readCount); + m_readListener->OnStatsReadComplete(ret, m_maxRank, view); + } + + m_eStatsState = eStatsState_Idle; + + delete [] m_scores; + m_scores = NULL; + } + break; + + case eStatsState_Failed: + { + view.m_numQueries = 0; + view.m_queries = NULL; + + if ( m_readListener != NULL ) + m_readListener->OnStatsReadComplete(eStatsReturn_NetworkError, 0, view); + + m_eStatsState = eStatsState_Idle; + } + break; + + case eStatsState_Canceled: + { + m_eStatsState = eStatsState_Idle; + } + break; + + default: // Getting or Idle. + break; + } +} + +bool SonyLeaderboardManager::OpenSession() +{ + if (m_openSessions == 0) + { + if (m_threadScoreboard == NULL) + { + m_threadScoreboard = new C4JThread(&scoreboardThreadEntry, this, "4JScoreboard"); + m_threadScoreboard->SetProcessor(CPU_CORE_LEADERBOARDS); + m_threadScoreboard->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); + m_threadScoreboard->Run(); + } + + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Starting sceNpScore utility.\n"); + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Another session opened, total=%i\n", m_openSessions+1); + } + + m_openSessions++; + return true; +} + +void SonyLeaderboardManager::CloseSession() +{ + m_openSessions--; + + if (m_openSessions == 0) app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): Quitting sceNpScore utility.\n"); + else app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): %i sessions still open.\n", m_openSessions); +} + +void SonyLeaderboardManager::DeleteSession() {} + +bool SonyLeaderboardManager::WriteStats(unsigned int viewCount, ViewIn views) +{ + // Need to cancel read/write operation first. + //if (m_eStatsState != eStatsState_Idle) return false; + + // Write relevant parameters. + //RegisterScore *regScore = reinterpret_cast(views); + + EnterCriticalSection(&m_csViewsLock); + for (int i=0; i> (8-dIndex); + + fivebits = (fivebits>>3) & 0x1F; + + if (fivebits < 10) // 0 - 9 + chars[i] = '0' + fivebits; + else if (fivebits < 32) // A - V + chars[i] = 'A' + (fivebits-10); + else + assert(false); + } + + toSymbols( getComment(out) ); +} + +void SonyLeaderboardManager::fromBase32(void *out, SceNpScoreComment *in) +{ + PBYTE bytes = (PBYTE) out; + ZeroMemory(bytes, RECORD_SIZE); + + fromSymbols( getComment(in) ); + + char ch[2] = { 0, 0 }; + for (int i = 0; i < SCE_NP_SCORE_COMMENT_MAXLEN; i++) + { + ch[0] = getComment(in)[i]; + unsigned char fivebits = strtol(ch, NULL, 32) << 3; + + int sByte = (i*5) / 8; + int eByte = (5+(i*5)) / 8; + int dIndex = (i*5) % 8; + + *(bytes + sByte) = *(bytes+sByte) | (fivebits >> dIndex); + + if (eByte != sByte) + *(bytes + eByte) = fivebits << (8-dIndex); + } +} + +char symbBase32[32] = { + ' ', '!','\"', '#', '$', '%', '&','\'', '(', ')', + '*', '+', '`', '-', '.', '/', ':', ';', '<', '=', + '>', '?', '[','\\', ']', '^', '_', '{', '|', '}', + '~', '@' +}; + +char charBase32[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V' +}; + +void SonyLeaderboardManager::toSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==charBase32[j]) + str[i] =symbBase32[j]; + } + } +} + +void SonyLeaderboardManager::fromSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==symbBase32[j]) + str[i] =charBase32[j]; + } + } +} + +bool SonyLeaderboardManager::test_string(string testing) +{ +#ifndef _CONTENT_PACKAGE + static SceNpScoreComment comment; + ZeroMemory(&comment, sizeof(SceNpScoreComment)); + memcpy(&comment, testing.c_str(), SCE_NP_SCORE_COMMENT_MAXLEN); + + int ctx = createTransactionContext(m_titleContext); + if (ctx<0) return false; + + int ret = sceNpScoreCensorComment(ctx, (const char *) &comment, NULL); + + if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_CENSORED) + { + app.DebugPrintf("\n[TEST_STRING]: REJECTED "); + } + else if (ret < 0) + { + destroyTransactionContext(ctx); + return false; + } + else + { + app.DebugPrintf("\n[TEST_STRING]: permitted "); + } + + app.DebugPrintf("'%s'\n", getComment(&comment)); + destroyTransactionContext(ctx); + return true; +#else + return true; +#endif +} + +void SonyLeaderboardManager::initReadScoreStruct(ReadScore &out, SceNpScoreRankData &rankData) +{ + ZeroMemory(&out, sizeof(ReadScore)); + + // Init rank and onlineID + out.m_uid.setOnlineID( rankData.npId.handle, true ); + out.m_rank = rankData.rank; + + // Convert to wstring and copy name. + wstring wstrName = convStringToWstring( string(rankData.npId.handle.data) ).c_str(); + //memcpy(&out.m_name, wstrName.c_str(), XUSER_NAME_SIZE); + out.m_name=wstrName; +} + +void SonyLeaderboardManager::fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment) +{ + StatsData statsData; + fromBase32( (void *) &statsData, &comment ); + + switch (statsData.m_statsType) + { + case eStatsType_Farming: + out.m_statsSize = 6; + out.m_statsData[0] = statsData.m_farming.m_eggs; + out.m_statsData[1] = statsData.m_farming.m_wheat; + out.m_statsData[2] = statsData.m_farming.m_mushroom; + out.m_statsData[3] = statsData.m_farming.m_sugarcane; + out.m_statsData[4] = statsData.m_farming.m_milk; + out.m_statsData[5] = statsData.m_farming.m_pumpkin; + break; + case eStatsType_Mining: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_mining.m_dirt; + out.m_statsData[1] = statsData.m_mining.m_cobblestone; + out.m_statsData[2] = statsData.m_mining.m_sand; + out.m_statsData[3] = statsData.m_mining.m_stone; + out.m_statsData[4] = statsData.m_mining.m_gravel; + out.m_statsData[5] = statsData.m_mining.m_clay; + out.m_statsData[6] = statsData.m_mining.m_obsidian; + break; + case eStatsType_Kills: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_kills.m_zombie; + out.m_statsData[1] = statsData.m_kills.m_skeleton; + out.m_statsData[2] = statsData.m_kills.m_creeper; + out.m_statsData[3] = statsData.m_kills.m_spider; + out.m_statsData[4] = statsData.m_kills.m_spiderJockey; + out.m_statsData[5] = statsData.m_kills.m_zombiePigman; + out.m_statsData[6] = statsData.m_kills.m_slime; + break; + case eStatsType_Travelling: + out.m_statsSize = 4; + out.m_statsData[0] = statsData.m_travelling.m_walked; + out.m_statsData[1] = statsData.m_travelling.m_fallen; + out.m_statsData[2] = statsData.m_travelling.m_minecart; + out.m_statsData[3] = statsData.m_travelling.m_boat; + break; + } +} + +bool SonyLeaderboardManager::SortByRank(const ReadScore &lhs, const ReadScore &rhs) +{ + return lhs.m_rank < rhs.m_rank; +} diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h new file mode 100644 index 00000000..3b2c26c5 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h @@ -0,0 +1,133 @@ +#pragma once + +#include "Common\Leaderboards\LeaderboardManager.h" + +#ifdef __PS3__ +typedef CellRtcTick SonyRtcTick; +#else +typedef SceRtcTick SonyRtcTick; +#endif + +class SonyLeaderboardManager : public LeaderboardManager +{ +protected: + enum EStatsState + { + eStatsState_Idle, + eStatsState_Getting, + eStatsState_Failed, + eStatsState_Ready, + eStatsState_Canceled, + eStatsState_Max + }; + +public: + SonyLeaderboardManager(); + virtual ~SonyLeaderboardManager(); + +protected: + unsigned short m_openSessions; + + C4JThread *m_threadScoreboard; + bool m_running; + + int m_titleContext; + int32_t m_requestId; + + //SceNpId m_myNpId; + + static int scoreboardThreadEntry(LPVOID lpParam); + void scoreboardThreadInternal(); + + virtual bool getScoreByIds(); + virtual bool getScoreByRange(); + + virtual bool setScore(); + + queue m_views; + + CRITICAL_SECTION m_csViewsLock; + + EStatsState m_eStatsState; //State of the stats read + // EFilterMode m_eFilterMode; + + ReadScore *m_scores; + unsigned int m_maxRank; + //SceNpScoreRankData *m_stats; + +public: + virtual void Tick(); + + //Open a session + virtual bool OpenSession(); + + //Close a session + virtual void CloseSession(); + + //Delete a session + virtual void DeleteSession(); + + //Write the given stats + //This is called synchronously and will not free any memory allocated for views when it is done + + virtual bool WriteStats(unsigned int viewCount, ViewIn views); + + virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount); + virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount); + + //Perform a flush of the stats + virtual void FlushStats(); + + //Cancel the current operation + virtual void CancelOperation(); + + //Is the leaderboard manager idle. + virtual bool isIdle(); + +protected: + int getBoardId(int difficulty, EStatsType); + + SceNpScorePlayerRankData *addPadding(unsigned int num, SceNpScoreRankData *rankData); + + void convertToOutput(unsigned int &num, ReadScore *out, SceNpScorePlayerRankData *rankData, SceNpScoreComment *comm); + + void toBinary(void *out, SceNpScoreComment *in); + void fromBinary(SceNpScoreComment **out, void *in); + + void toBase32(SceNpScoreComment *out, void *in); + void fromBase32(void *out, SceNpScoreComment *in); + + void toSymbols(char *); + void fromSymbols(char *); + + bool test_string(string); + + void initReadScoreStruct(ReadScore &out, SceNpScoreRankData &); + void fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment); + + static bool SortByRank(const ReadScore &lhs, const ReadScore &rhs); + + +protected: + // 4J-JEV: Interface differences: + + // Sce NP score library function redirects. + virtual HRESULT initialiseScoreUtility() { return ERROR_SUCCESS; } + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr) { return false; } + + virtual HRESULT createTitleContext(const SceNpId &npId) = 0; + virtual HRESULT destroyTitleContext(int titleContext) = 0; + + virtual HRESULT createTransactionContext(int titleContext) = 0; + virtual HRESULT abortTransactionContext(int transactionContext) = 0; + virtual HRESULT destroyTransactionContext(int transactionContext) = 0; + + virtual HRESULT fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len); + +#if (defined __ORBIS__) || (defined __PSVITA__) + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList) = 0; +#endif + + virtual char * getComment(SceNpScoreComment *comment) = 0; +}; diff --git a/Minecraft.Client/Common/Leaderboards/base64.cpp b/Minecraft.Client/Common/Leaderboards/base64.cpp new file mode 100644 index 00000000..19106cc4 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.cpp @@ -0,0 +1,131 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 Ren Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + Ren Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "stdafx.h" + +#include "base64.h" +#include + +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + +static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +// 4J ADDED, +std::string base64_encode(std::string str) +{ + return base64_encode( reinterpret_cast(str.c_str()), str.length() ); +} + +std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(int ii = 0; (ii <4) ; ii++) + ret += base64_chars[char_array_4[ii]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + + } + + return ret; + +} + +std::string base64_decode(std::string const& encoded_string) { + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/base64.h b/Minecraft.Client/Common/Leaderboards/base64.h new file mode 100644 index 00000000..7f6a1e49 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +std::string base64_encode(std::string str); +std::string base64_encode(unsigned char const* , unsigned int len); +std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/BeaconMenu1080.swf b/Minecraft.Client/Common/Media/BeaconMenu1080.swf new file mode 100644 index 00000000..f84c9101 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenu480.swf b/Minecraft.Client/Common/Media/BeaconMenu480.swf new file mode 100644 index 00000000..b04e2919 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenu720.swf b/Minecraft.Client/Common/Media/BeaconMenu720.swf new file mode 100644 index 00000000..c470b04e Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf b/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf new file mode 100644 index 00000000..02647e98 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf b/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf new file mode 100644 index 00000000..1a68b14f Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuVita.swf b/Minecraft.Client/Common/Media/BeaconMenuVita.swf new file mode 100644 index 00000000..ab91a154 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Controls1080.swf b/Minecraft.Client/Common/Media/Controls1080.swf index 36051b8c..9ec38f92 100644 Binary files a/Minecraft.Client/Common/Media/Controls1080.swf and b/Minecraft.Client/Common/Media/Controls1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf index 65cb014a..e462de70 100644 Binary files a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf and b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf index 041e7663..27a0b580 100644 Binary files a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf and b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf index cc42f3d1..155db47e 100644 Binary files a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf index 245bbf65..282c51f8 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf and b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf index 9426b616..2773341d 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf and b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf index b7474a63..985ef7a1 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf and b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf index 814efa9c..f7fe1071 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf and b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuVita.swf b/Minecraft.Client/Common/Media/CreativeMenuVita.swf index ecbbb3db..01797a06 100644 Binary files a/Minecraft.Client/Common/Media/CreativeMenuVita.swf and b/Minecraft.Client/Common/Media/CreativeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu1080.swf b/Minecraft.Client/Common/Media/FireworksMenu1080.swf new file mode 100644 index 00000000..20250d06 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu480.swf b/Minecraft.Client/Common/Media/FireworksMenu480.swf new file mode 100644 index 00000000..81a8290b Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu720.swf b/Minecraft.Client/Common/Media/FireworksMenu720.swf new file mode 100644 index 00000000..917736e1 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf b/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf new file mode 100644 index 00000000..f8537492 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf b/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf new file mode 100644 index 00000000..c3e56007 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuVita.swf b/Minecraft.Client/Common/Media/FireworksMenuVita.swf new file mode 100644 index 00000000..e54cdd78 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_1.png b/Minecraft.Client/Common/Media/Graphics/Beacon_1.png new file mode 100644 index 00000000..7e272400 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_2.png b/Minecraft.Client/Common/Media/Graphics/Beacon_2.png new file mode 100644 index 00000000..1668e204 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_3.png b/Minecraft.Client/Common/Media/Graphics/Beacon_3.png new file mode 100644 index 00000000..818adb91 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_4.png b/Minecraft.Client/Common/Media/Graphics/Beacon_4.png new file mode 100644 index 00000000..70d5a9e6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png new file mode 100644 index 00000000..b8194456 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png new file mode 100644 index 00000000..55f7727e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png new file mode 100644 index 00000000..85e785c8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png new file mode 100644 index 00000000..29b0cd58 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png new file mode 100644 index 00000000..9c94f518 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png new file mode 100644 index 00000000..47e0ad46 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png new file mode 100644 index 00000000..e51ce707 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png new file mode 100644 index 00000000..004bc5c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png new file mode 100644 index 00000000..3a20d5f2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png new file mode 100644 index 00000000..e9529e1a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png new file mode 100644 index 00000000..0746bdd9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png new file mode 100644 index 00000000..c14d3625 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png new file mode 100644 index 00000000..c4e90222 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png new file mode 100644 index 00000000..f64c5c55 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png new file mode 100644 index 00000000..e07dce1b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png new file mode 100644 index 00000000..d5d5ad61 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png new file mode 100644 index 00000000..368e9848 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png new file mode 100644 index 00000000..b7eaca73 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png b/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png new file mode 100644 index 00000000..5445c58b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png b/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png new file mode 100644 index 00000000..7df8dbfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png new file mode 100644 index 00000000..3a22ce06 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png new file mode 100644 index 00000000..0d5f33b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png new file mode 100644 index 00000000..4d0e5bac Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png new file mode 100644 index 00000000..fb1e3a80 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png new file mode 100644 index 00000000..23a09824 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png new file mode 100644 index 00000000..6454bcab Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png new file mode 100644 index 00000000..872584b8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png new file mode 100644 index 00000000..93ba58c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png new file mode 100644 index 00000000..519b87a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png new file mode 100644 index 00000000..90f65b5b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png new file mode 100644 index 00000000..8c408680 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png new file mode 100644 index 00000000..336895b0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png new file mode 100644 index 00000000..04c41d25 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png new file mode 100644 index 00000000..d5752af8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png new file mode 100644 index 00000000..dc57f82f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png new file mode 100644 index 00000000..8fa22b21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png index b8475962..4052436a 100644 Binary files a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png and b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png new file mode 100644 index 00000000..e6d47265 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.col b/Minecraft.Client/Common/Media/HTMLColours.col index 50999d5a..21db75ae 100644 Binary files a/Minecraft.Client/Common/Media/HTMLColours.col and b/Minecraft.Client/Common/Media/HTMLColours.col differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.xml b/Minecraft.Client/Common/Media/HTMLColours.xml index ea6ef00c..8f17132c 100644 --- a/Minecraft.Client/Common/Media/HTMLColours.xml +++ b/Minecraft.Client/Common/Media/HTMLColours.xml @@ -7,14 +7,14 @@ - + - + diff --git a/Minecraft.Client/Common/Media/HUD1080.swf b/Minecraft.Client/Common/Media/HUD1080.swf index c9a05166..261be0e6 100644 Binary files a/Minecraft.Client/Common/Media/HUD1080.swf and b/Minecraft.Client/Common/Media/HUD1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUD480.swf b/Minecraft.Client/Common/Media/HUD480.swf index d8a65a41..25cc211c 100644 Binary files a/Minecraft.Client/Common/Media/HUD480.swf and b/Minecraft.Client/Common/Media/HUD480.swf differ diff --git a/Minecraft.Client/Common/Media/HUD720.swf b/Minecraft.Client/Common/Media/HUD720.swf index 3527bb70..b044e31f 100644 Binary files a/Minecraft.Client/Common/Media/HUD720.swf and b/Minecraft.Client/Common/Media/HUD720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit1080.swf b/Minecraft.Client/Common/Media/HUDSplit1080.swf index cff338b9..c22cfc85 100644 Binary files a/Minecraft.Client/Common/Media/HUDSplit1080.swf and b/Minecraft.Client/Common/Media/HUDSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit720.swf b/Minecraft.Client/Common/Media/HUDSplit720.swf index 405cb99d..ba9937e1 100644 Binary files a/Minecraft.Client/Common/Media/HUDSplit720.swf and b/Minecraft.Client/Common/Media/HUDSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDVita.swf b/Minecraft.Client/Common/Media/HUDVita.swf index 3197a722..03b05f42 100644 Binary files a/Minecraft.Client/Common/Media/HUDVita.swf and b/Minecraft.Client/Common/Media/HUDVita.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu1080.swf b/Minecraft.Client/Common/Media/HopperMenu1080.swf new file mode 100644 index 00000000..84394e94 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu480.swf b/Minecraft.Client/Common/Media/HopperMenu480.swf new file mode 100644 index 00000000..6a9efe29 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu720.swf b/Minecraft.Client/Common/Media/HopperMenu720.swf new file mode 100644 index 00000000..bbfc69b7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf b/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf new file mode 100644 index 00000000..98dd6cde Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuSplit720.swf b/Minecraft.Client/Common/Media/HopperMenuSplit720.swf new file mode 100644 index 00000000..030e18aa Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuVita.swf b/Minecraft.Client/Common/Media/HopperMenuVita.swf new file mode 100644 index 00000000..fcb93ba7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf index 2f383848..db0f4d36 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf index 1c1d8177..599c3e38 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf index b07966bc..eee79a2f 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf index c90925e5..edfa8430 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf index d4814571..5883cba4 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf new file mode 100644 index 00000000..606f515e Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay1080.swf b/Minecraft.Client/Common/Media/HowToPlay1080.swf index 8a74aae1..c1e91110 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay1080.swf and b/Minecraft.Client/Common/Media/HowToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay480.swf b/Minecraft.Client/Common/Media/HowToPlay480.swf index 60449f75..e7cbe808 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay480.swf and b/Minecraft.Client/Common/Media/HowToPlay480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay720.swf b/Minecraft.Client/Common/Media/HowToPlay720.swf index eb7652ac..3e12dbb0 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay720.swf and b/Minecraft.Client/Common/Media/HowToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf index 5dc90de1..6e128ffa 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf and b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf index df33898a..5e25feaf 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf and b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf index 0f01ef70..ef85f005 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf and b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf index 2c1515ce..f44140b6 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf index c861543a..fe33c20e 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf index b2db55a1..aa1ca7a7 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf and b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf index db806225..3ba64d5a 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf and b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf index 1735af41..bc9542e3 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf and b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayVita.swf b/Minecraft.Client/Common/Media/HowToPlayVita.swf index 7ead38e2..51f2397d 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayVita.swf and b/Minecraft.Client/Common/Media/HowToPlayVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf index 9caefeab..207c86a7 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf and b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions480.swf b/Minecraft.Client/Common/Media/InGameHostOptions480.swf index 6177ad68..f0d0e0c6 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions480.swf and b/Minecraft.Client/Common/Media/InGameHostOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions720.swf b/Minecraft.Client/Common/Media/InGameHostOptions720.swf index 448b39a3..f4e55bf4 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions720.swf and b/Minecraft.Client/Common/Media/InGameHostOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf index 281f75d9..a45e8a37 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf index 328a3115..7f76aaaf 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf index c9f6c0d7..a7276f10 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf index 12a15405..601cc467 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf index 707d8fdb..9e0b0ad9 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf index 36c7ea04..bc9c4f6b 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf index 65772a1b..c4187a09 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf index 1c3b7820..ab0b3a7e 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf index c8d8d370..13c0b653 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/Intro1080.swf b/Minecraft.Client/Common/Media/Intro1080.swf index 92569e1a..c9f2d3ba 100644 Binary files a/Minecraft.Client/Common/Media/Intro1080.swf and b/Minecraft.Client/Common/Media/Intro1080.swf differ diff --git a/Minecraft.Client/Common/Media/Intro480.swf b/Minecraft.Client/Common/Media/Intro480.swf index 2b289ff8..425c01fe 100644 Binary files a/Minecraft.Client/Common/Media/Intro480.swf and b/Minecraft.Client/Common/Media/Intro480.swf differ diff --git a/Minecraft.Client/Common/Media/Intro720.swf b/Minecraft.Client/Common/Media/Intro720.swf index 42c086d4..0c2bb3eb 100644 Binary files a/Minecraft.Client/Common/Media/Intro720.swf and b/Minecraft.Client/Common/Media/Intro720.swf differ diff --git a/Minecraft.Client/Common/Media/IntroVita.swf b/Minecraft.Client/Common/Media/IntroVita.swf index 54a9b2d5..8229640d 100644 Binary files a/Minecraft.Client/Common/Media/IntroVita.swf and b/Minecraft.Client/Common/Media/IntroVita.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu1080.swf b/Minecraft.Client/Common/Media/InventoryMenu1080.swf index f7e84e8a..47434cc3 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu1080.swf and b/Minecraft.Client/Common/Media/InventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu480.swf b/Minecraft.Client/Common/Media/InventoryMenu480.swf index c5facdc4..5c129e1d 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu480.swf and b/Minecraft.Client/Common/Media/InventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu720.swf b/Minecraft.Client/Common/Media/InventoryMenu720.swf index e6f3cee0..3de2da83 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu720.swf and b/Minecraft.Client/Common/Media/InventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf index 4f6e78c5..efe2d484 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf and b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf index 1e7d00ed..a9d13a05 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf and b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuVita.swf b/Minecraft.Client/Common/Media/InventoryMenuVita.swf index e38bb07d..1eae726a 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuVita.swf and b/Minecraft.Client/Common/Media/InventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu1080.swf b/Minecraft.Client/Common/Media/LanguagesMenu1080.swf new file mode 100644 index 00000000..9c0bef5a Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu480.swf b/Minecraft.Client/Common/Media/LanguagesMenu480.swf new file mode 100644 index 00000000..5cea7c87 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu720.swf b/Minecraft.Client/Common/Media/LanguagesMenu720.swf new file mode 100644 index 00000000..09022fd6 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf b/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf new file mode 100644 index 00000000..24d7a0b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf b/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf new file mode 100644 index 00000000..99b9076f Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuVita.swf b/Minecraft.Client/Common/Media/LanguagesMenuVita.swf new file mode 100644 index 00000000..cffdba59 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf index 3db865f8..07d81207 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf index ea1132c0..666f1127 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf index 1cdf4d22..e77beb4e 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf index 21fede27..5c1d44d9 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu1080.swf b/Minecraft.Client/Common/Media/LoadMenu1080.swf index e89f1875..d0d61ec7 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu1080.swf and b/Minecraft.Client/Common/Media/LoadMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu480.swf b/Minecraft.Client/Common/Media/LoadMenu480.swf index ce7ac1ad..e105c9e7 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu480.swf and b/Minecraft.Client/Common/Media/LoadMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu720.swf b/Minecraft.Client/Common/Media/LoadMenu720.swf index c3976f49..ef33463e 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu720.swf and b/Minecraft.Client/Common/Media/LoadMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenuVita.swf b/Minecraft.Client/Common/Media/LoadMenuVita.swf index 8bbf94e7..a5be6f3f 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenuVita.swf and b/Minecraft.Client/Common/Media/LoadMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MediaDurango.arc b/Minecraft.Client/Common/Media/MediaDurango.arc index 53e9b222..50240c42 100644 Binary files a/Minecraft.Client/Common/Media/MediaDurango.arc and b/Minecraft.Client/Common/Media/MediaDurango.arc differ diff --git a/Minecraft.Client/Common/Media/MediaOrbis.arc b/Minecraft.Client/Common/Media/MediaOrbis.arc index fcb53c05..aea52dc1 100644 Binary files a/Minecraft.Client/Common/Media/MediaOrbis.arc and b/Minecraft.Client/Common/Media/MediaOrbis.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPS3.arc b/Minecraft.Client/Common/Media/MediaPS3.arc index 7ab3a320..5eb550f8 100644 Binary files a/Minecraft.Client/Common/Media/MediaPS3.arc and b/Minecraft.Client/Common/Media/MediaPS3.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPSVita.arc b/Minecraft.Client/Common/Media/MediaPSVita.arc index 01aa7466..8683db23 100644 Binary files a/Minecraft.Client/Common/Media/MediaPSVita.arc and b/Minecraft.Client/Common/Media/MediaPSVita.arc differ diff --git a/Minecraft.Client/Common/Media/MediaWindows64.arc b/Minecraft.Client/Common/Media/MediaWindows64.arc index 130661a2..9498b91d 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 @@ -29411,6 +29982,2088 @@ +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 + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + + + + HtmlItemDescriptionSmall 32.000000 32.000000 @@ -29912,6 +32565,21 @@ stop + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + Icon @@ -30025,6 +32693,24 @@ 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 + @@ -30277,6 +32963,21 @@ stop + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + Icon @@ -30390,6 +33091,24 @@ 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 + @@ -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,7 +2931,291 @@ Can also be used for low-level lighting. Skull - + + + + Command Block + + + Beacon + + + Trapped Chest + + + Weighted Pressure Plate (Light) + + + Weighted Pressure Plate (Heavy) + + + Redstone Comparator + + + Daylight Sensor + + + Block of Redstone + + + 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 @@ -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 - - There are no downloadable content offers of this type available for this title at the moment. + + Horse - - %s has joined the game. + + Dropper - - %s has left the game. + + Hopper - - %s was kicked from the game. + + Beacon - - Are you sure you want to delete this save game? + + Primary Power + + + Secondary Power + + + Minecart + + + + There are no downloadable content offers of this type available for this title at the moment. + + + %s has joined the game. + + + %s has left the game. + + + %s was kicked from the game. + + + Are you sure you want to delete this save game? - Awaiting approval + 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 + + Change Skin - - How To Play + + How To Play - - Controls + + Controls - - Settings + + Settings - - Credits - - - Reinstall Content - - - Debug Settings + + Credits + + Reinstall Content + + + Debug Settings + - - Fire Spreads + + 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 - - TNT Explodes + + Can Use Doors and Switches - - Player vs Player + + Can Open Containers - - Trust Players + + Can Attack Players - - Host Privileges + + Can Attack Animals - - Generate Structures + + Moderator - - Superflat World + + Kick Player - - Bonus Chest + + Can Fly - - World Options + + Disable Exhaustion + + + Invisible + + + Host Options + + + Players/Invite - - Can Build and Mine + + Online Game - - Can Use Doors and Switches + + Invite Only - - Can Open Containers + + More Options - - Can Attack Players + + Load - - Can Attack Animals + + New World - - Moderator + + World Name - - Kick Player + + Seed for the World Generator - - Can Fly + + Leave blank for a random seed - - Disable Exhaustion + + Players - - Invisible + + Join Game - - Host Options + + Start Game - - Players/Invite - - - - Online Game - - - Invite Only - - - More Options - - - Load - - - New World - - - World Name - - - Seed for the World Generator - - - Leave blank for a random seed - - - Players - - - Join Game - - - Start Game - - - No Games Found + + 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 -9.000000 +19.000000 +101.000000,0.000000,0.000000 -Armour0 +Health9 +9.000000 +9.000000 +0.000031,10.000061,0.000000 +HudHealth + + + + +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 -9.000000 +19.000000 +101.000000,0.000000,0.000000 -Armour0 +Health9 +9.000000 +9.000000 +0.000031,10.000061,0.000000 +HudHealth + + + + +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 -9.000000 +19.000000 +101.000000,0.000000,0.000000 -Armour0 +Health9 +9.000000 +9.000000 +0.000031,10.000061,0.000000 +HudHealth + + + + +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,32 +6,132 @@ 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 -2 -XuiBlankScene +GameOptions +488.000000 +440.000000 +0.000013,0.000000,0.000000 +10 +XuiScene -CheckboxResetNether +CheckboxNaturalRegeneration 402.000000 34.000000 -23.000000,272.000000,0.000000 +24.000015,393.000000,0.000000 +2 +XuiCheckbox +CheckboxTileDrops + + + + +CheckboxTileDrops +402.000000 +34.000000 +24.000015,359.000000,0.000000 +2 +XuiCheckbox +CheckboxMobLoot +CheckboxNaturalRegeneration + + + + +CheckboxMobLoot +402.000000 +34.000000 +24.000015,325.000000,0.000000 +2 +XuiCheckbox +CheckboxMobGriefing +CheckboxTileDrops + + + + +CheckboxMobGriefing +402.000000 +34.000000 +24.000015,291.000000,0.000000 +2 +XuiCheckbox +CheckboxMobSpawning +CheckboxMobLoot + + + + +CheckboxMobSpawning +402.000000 +34.000000 +24.000015,257.000000,0.000000 +2 +XuiCheckbox +CheckboxKeepInventory +CheckboxMobGriefing + + + + +CheckboxKeepInventory +402.000000 +34.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 -..\GenerationOptions\CheckboxStructures +CheckboxKeepInventory @@ -39,47 +139,11 @@ CheckboxHostPrivileges 402.000000 34.000000 -23.000000,238.000000,0.000000 -2 -XuiCheckbox -CheckboxTNT -CheckboxResetNether - - - - -CheckboxTNT -402.000000 -34.000000 -23.000000,204.000000,0.000000 -2 -XuiCheckbox -CheckboxFireSpreads -CheckboxHostPrivileges - - - - -CheckboxFireSpreads -402.000000 -34.000000 -23.000000,170.000000,0.000000 -2 -XuiCheckbox -CheckboxTrustSystem -CheckboxTNT - - - - -CheckboxTrustSystem -402.000000 -34.000000 -23.000000,136.000000,0.000000 +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 +31.000000 +24.000000,82.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiEditSeed +402.000000 +32.000000 +24.000000,44.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxStructures + + + + +XuiLabelSeed 402.000000 26.000000 -23.000000,0.000000,0.000000 +24.000000,16.000000,0.000000 XuiLabelDark - - -WO_Box -405.000000 -112.000000 -22.999971,23.999985,0.000000 - - - -2.000000 -112.000000 -401.000031,0.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - -2.000000 -112.000000 -0.000029,0.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - -402.000000 -2.000000 -0.000029,0.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - -402.000000 -2.000000 -0.000029,110.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - + + + +WorldOptionsTab +244.000000 +58.000000 +290.000000,103.000008,0.000000 +1 +Graphics\PanelsAndTabs\WorldOptionsTabOn.png +48 + + + + +GameOptionsTab +244.000000 +58.000000 +534.000000,103.000008,0.000000 +false +1 +Graphics\PanelsAndTabs\GameOptionsTabOn.png +48 + + -Description -450.000000 -140.000000 -0.000015,496.000000,0.000000 -8 -TipPanel +LabelGameOptions +224.000000 +24.000000 +544.000000,122.000000,0.000000 +XuiLabelDarkCentred +Game Options + + +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,171 +6,124 @@ MultiGameLaunchMoreOptions -340.000000 -356.000000 -150.000031,8.500015,0.000000 +640.000000 +480.000000 CScene_MultiGameLaunchMoreOptions -XuiScene -HostOptions\CheckboxOnline - - - -GenerationOptions -340.000000 -104.000000 -0.000000,244.000000,0.000000 XuiBlankScene +WorldOptionsGroup\WorldOptions\XuiEditSeed - + -CheckboxBonusChest -304.000000 -26.000000 -19.000000,77.000000,0.000000 -XuiCheckboxSmall -false -CheckboxFlatWorld +OptionsTab_off +175.000000 +40.000000 +235.000000,44.000000,0.000000 +1 +Graphics\PanelsAndTabs\MoreOptionsTabOff_Small.png +48 - - - -CheckboxFlatWorld -304.000000 -26.000000 -19.000000,50.999992,0.000000 -XuiCheckboxSmall -false -CheckboxStructures -CheckboxBonusChest - - - - -CheckboxStructures -304.000000 -26.000000 -19.000000,24.999992,0.000000 -XuiCheckboxSmall -false -..\HostOptions\CheckboxResetNether -CheckboxFlatWorld - - - - -WorldOptions -304.000000 -19.000000 -16.000000,0.000000,0.000000 -XuiLabelDarkSmall - - + -WO_Box -307.000000 -85.000000 -15.999971,18.999985,0.000000 +GameOptionsGroup +510.000000 +328.000000 +60.000000,76.000015,0.000000 +false +true - + -2.000000 -82.000000 -302.000031,0.000015,0.000000 - - -0xff000000 +GameOptionsDescription +182.000000 +312.000000 +347.000000,10.000000,0.000000 +10 +TipPanel - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - -2.000000 -82.000000 -0.000029,0.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - -304.000000 -2.000000 -0.000029,0.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - -304.000000 -2.000000 -0.000029,80.000015,0.000000 - - -0xff000000 - - - - -0xff505050 -1 - - -true -4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, - - - - + -HostOptions -340.000000 -233.000000 -0.000000,11.000000,0.000000 -XuiBlankScene +GameOptions +350.000000 +328.000000 +0.000015,0.000002,0.000000 +GraphicPanel -CheckboxResetNether +CheckboxNaturalRegeneration 304.000000 26.000000 -16.000000,207.000000,0.000000 +16.000000,299.000000,0.000000 +XuiCheckboxSmall +CheckboxTileDrops + + + + +CheckboxTileDrops +304.000000 +26.000000 +16.000000,273.000000,0.000000 +XuiCheckboxSmall +CheckboxMobLoot +CheckboxNaturalRegeneration + + + + +CheckboxMobLoot +304.000000 +26.000000 +16.000000,247.000000,0.000000 +XuiCheckboxSmall +CheckboxMobGriefing +CheckboxTileDrops + + + + +CheckboxMobGriefing +304.000000 +26.000000 +16.000000,221.000000,0.000000 +XuiCheckboxSmall +CheckboxMobSpawning +CheckboxMobLoot + + + + +CheckboxMobSpawning +304.000000 +26.000000 +16.000000,195.000000,0.000000 +XuiCheckboxSmall +CheckboxKeepInventory +CheckboxMobGriefing + + + + +CheckboxKeepInventory +304.000000 +26.000000 +16.000000,169.000000,0.000000 +XuiCheckboxSmall +CheckboxDayLightCycle +CheckboxMobSpawning + + + + +CheckboxDayLightCycle +304.000000 +26.000000 +16.000000,143.000000,0.000000 XuiCheckboxSmall CheckboxHostPrivileges -..\GenerationOptions\CheckboxStructures +CheckboxKeepInventory @@ -178,43 +131,10 @@ CheckboxHostPrivileges 304.000000 26.000000 -16.000000,181.000000,0.000000 -XuiCheckboxSmall -CheckboxTNT -CheckboxResetNether - - - - -CheckboxTNT -304.000000 -26.000000 -16.000000,155.000000,0.000000 -XuiCheckboxSmall -CheckboxFireSpreads -CheckboxHostPrivileges - - - - -CheckboxFireSpreads -304.000000 -26.000000 -16.000000,129.000000,0.000000 -XuiCheckboxSmall -CheckboxTrustSystem -CheckboxTNT - - - - -CheckboxTrustSystem -304.000000 -26.000000 -16.000000,102.999992,0.000000 +16.000000,116.999992,0.000000 XuiCheckboxSmall CheckboxPVP -CheckboxFireSpreads +CheckboxDayLightCycle @@ -222,10 +142,10 @@ CheckboxPVP 304.000000 26.000000 -16.000000,76.999992,0.000000 +16.000000,90.999992,0.000000 XuiCheckboxSmall CheckboxAllowFoF -CheckboxTrustSystem +CheckboxHostPrivileges @@ -233,7 +153,7 @@ CheckboxAllowFoF 304.000000 25.000000 -16.000000,52.000000,0.000000 +16.000000,66.000000,0.000000 XuiCheckboxSmall CheckboxInviteOnly CheckboxPVP @@ -244,7 +164,7 @@ CheckboxInviteOnly 304.000000 26.000000 -16.000000,25.999992,0.000000 +16.000000,39.999992,0.000000 XuiCheckboxSmall CheckboxOnline CheckboxAllowFoF @@ -255,24 +175,307 @@ CheckboxOnline 304.000000 26.000000 -16.000000,-0.000008,0.000000 +16.000000,13.999992,0.000000 XuiCheckboxSmall CheckboxInviteOnly + + + +WorldOptionsGroup +510.000000 +305.000000 +60.000000,76.000000,0.000000 +true + -Description -500.000000 -64.000000 --80.000000,358.000000,0.000000 -8 +WorldOptionsDescription +182.000000 +298.000000 +347.000000,10.000000,0.000000 +10 TipPanel -6666666666666666666666 -666666666666666666666666 -6666666666666666666666666 + + + + +WorldOptions +350.000000 +315.000000 +0.000015,0.000000,0.000000 +10 +GraphicPanel + + + +CheckboxFireSpreads +304.000000 +26.000000 +19.000000,253.000000,0.000000 +XuiCheckboxSmall +CheckboxTNT + + + + +CheckboxTNT +304.000000 +26.000000 +19.000000,227.000000,0.000000 +XuiCheckboxSmall +CheckboxTrustSystem +CheckboxFireSpreads + + + + +CheckboxTrustSystem +304.000000 +26.000000 +19.000000,201.000000,0.000000 +XuiCheckboxSmall +CheckboxResetNether +CheckboxTNT + + + + +CheckboxResetNether +304.000000 +26.000000 +19.000000,175.000000,0.000000 +XuiCheckboxSmall +CheckboxBonusChest +CheckboxTrustSystem + + + + +CheckboxBonusChest +304.000000 +26.000000 +19.000000,149.000000,0.000000 +XuiCheckboxSmall +CheckboxFlatWorld +CheckboxResetNether + + + + +CheckboxFlatWorld +304.000000 +26.000000 +19.000000,123.000000,0.000000 +XuiCheckboxSmall +CheckboxStructures +CheckboxBonusChest + + + + +CheckboxStructures +304.000000 +26.000000 +19.000000,97.000000,0.000000 +XuiCheckboxSmall +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 + + + + +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..a65a61aa 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" @@ -166,6 +167,11 @@ bool CGameNetworkManager::_RunNetworkGame(LPVOID lpParameter) return true; } } + else + { + // Client needs QNET_STATE_GAME_PLAY so that IsInGameplay() returns true + s_pPlatformNetworkManager->SetGamePlayState(); + } if( g_NetworkManager.IsLeavingGame() ) return false; @@ -204,7 +210,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 +772,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 +816,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 +934,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 +955,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 +978,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) Compression::UseDefaultThreadStorage(); //app.SetGameStarted(false); - -#ifndef __PSVITA__ UIScene_PauseMenu::_ExitWorld(NULL); -#endif while( g_NetworkManager.IsInSession() ) { @@ -900,7 +986,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 +1000,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 +1139,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 +1159,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 +1301,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 + } } } } @@ -1391,7 +1484,10 @@ void CGameNetworkManager::CreateSocket( INetworkPlayer *pNetworkPlayer, bool loc Minecraft *pMinecraft = Minecraft::GetInstance(); Socket *socket = NULL; - shared_ptr mpPlayer = pMinecraft->localplayers[pNetworkPlayer->GetUserIndex()]; + shared_ptr mpPlayer = nullptr; + int userIdx = pNetworkPlayer->GetUserIndex(); + if (userIdx >= 0 && userIdx < XUSER_MAX_COUNT) + mpPlayer = pMinecraft->localplayers[userIdx]; if( localPlayer && mpPlayer != NULL && mpPlayer->connection != NULL) { // If we already have a MultiplayerLocalPlayer here then we are doing a session type change @@ -1572,7 +1668,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,60 +1677,39 @@ 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; + return; + } } } #endif -#ifdef __PSVITA__ - // Need to check we're signed in to PSN - bool isSignedInLive = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); - if (!isSignedInLive) - { - // Determine why they're not "signed in live" - // MGH - we need to add a new message at some point for connecting when already signed in -// if (ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) -// { -// // Signed in to PSN but not connected (no internet access) -// UINT uiIDA[1]; -// uiIDA[0] = IDS_OK; -// ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL, app.GetStringTable()); -// } -// else - { - // Not signed in to PSN - UINT uiIDA[1]; - uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &CGameNetworkManager::MustSignInReturned_1, (void *)pInviteInfo, app.GetStringTable(), NULL, 0, false); - } - return; - } -#endif - int localUsersMask = 0; Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -1675,17 +1750,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 +1783,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 +1797,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 +1811,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 +1862,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 +1874,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 +1886,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 { @@ -1887,7 +1978,7 @@ bool CGameNetworkManager::AllowedToPlayMultiplayer(int playerIdx) return ProfileManager.AllowedToPlayMultiplayer(playerIdx); } -char *CGameNetworkManager::GetOnlineName(int playerIdx) +const char *CGameNetworkManager::GetOnlineName(int playerIdx) { return ProfileManager.GetGamertag(playerIdx); } diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h index 1bb532da..bb7633c2 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 @@ -195,7 +196,7 @@ private: int GetLockedProfile(); bool IsSignedInLive(int playerIdx); bool AllowedToPlayMultiplayer(int playerIdx); - char *GetOnlineName(int playerIdx); + const char *GetOnlineName(int playerIdx); C4JThread::Event* m_hServerStoppedEvent; C4JThread::Event* m_hServerReadyEvent; 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/PlatformNetworkManagerInterface.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h index 901e59e7..31c415a7 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h @@ -84,6 +84,7 @@ public: virtual void HandleSignInChange() = 0; virtual bool _RunNetworkGame() = 0; + virtual void SetGamePlayState() {} private: virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom) = 0; diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp index b6b0fe12..c2466fe3 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp @@ -2,7 +2,12 @@ #include "..\..\..\Minecraft.World\Socket.h" #include "..\..\..\Minecraft.World\StringHelpers.h" #include "PlatformNetworkManagerStub.h" -#include "..\..\Xbox\Network\NetworkPlayerXbox.h" // TODO - stub version of this? +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" +#ifdef _WINDOWS64 +#include "..\..\Windows64\Network\WinsockNetLayer.h" +#include "..\..\Minecraft.h" +#include "..\..\User.h" +#endif CPlatformNetworkManagerStub *g_pPlatformNetworkManager; @@ -114,10 +119,43 @@ void CPlatformNetworkManagerStub::NotifyPlayerJoined(IQNetPlayer *pQNetPlayer ) } } +void CPlatformNetworkManagerStub::NotifyPlayerLeaving(IQNetPlayer* pQNetPlayer) +{ + app.DebugPrintf("Player 0x%p \"%ls\" leaving.\n", pQNetPlayer, pQNetPlayer->GetGamertag()); + + INetworkPlayer* networkPlayer = getNetworkPlayer(pQNetPlayer); + if (networkPlayer == NULL) + return; + + Socket* socket = networkPlayer->GetSocket(); + if (socket != NULL) + { + if (m_pIQNet->IsHost()) + g_NetworkManager.CloseConnection(networkPlayer); + } + + if (m_pIQNet->IsHost()) + { + SystemFlagRemovePlayer(networkPlayer); + } + + g_NetworkManager.PlayerLeaving(networkPlayer); + + for (int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if (playerChangedCallback[idx] != NULL) + playerChangedCallback[idx](playerChangedCallbackParam[idx], networkPlayer, true); + } + + removeNetworkPlayer(pQNetPlayer); +} + + bool CPlatformNetworkManagerStub::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) { m_pGameNetworkManager = pGameNetworkManager; m_flagIndexSize = flagIndexSize; + m_pIQNet = new IQNet(); g_pPlatformNetworkManager = this; for( int i = 0; i < XUSER_MAX_COUNT; i++ ) { @@ -174,6 +212,37 @@ bool CPlatformNetworkManagerStub::isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer // We call this twice a frame, either side of the render call so is a good place to "tick" things void CPlatformNetworkManagerStub::DoWork() { +#ifdef _WINDOWS64 + extern QNET_STATE _iQNetStubState; + if (_iQNetStubState == QNET_STATE_SESSION_STARTING && app.GetGameStarted()) + { + _iQNetStubState = QNET_STATE_GAME_PLAY; + if (m_pIQNet->IsHost()) + WinsockNetLayer::UpdateAdvertiseJoinable(true); + } + if (_iQNetStubState == QNET_STATE_IDLE) + TickSearch(); + if (_iQNetStubState == QNET_STATE_GAME_PLAY && m_pIQNet->IsHost()) + { + BYTE disconnectedSmallId; + while (WinsockNetLayer::PopDisconnectedSmallId(&disconnectedSmallId)) + { + IQNetPlayer* qnetPlayer = m_pIQNet->GetPlayerBySmallId(disconnectedSmallId); + if (qnetPlayer != NULL && qnetPlayer->m_smallId == disconnectedSmallId) + { + NotifyPlayerLeaving(qnetPlayer); + qnetPlayer->m_smallId = 0; + qnetPlayer->m_isRemote = false; + qnetPlayer->m_isHostPlayer = false; + qnetPlayer->m_gamertag[0] = 0; + qnetPlayer->SetCustomDataValue(0); + WinsockNetLayer::PushFreeSmallId(disconnectedSmallId); + if (IQNet::s_playerCount > 1) + IQNet::s_playerCount--; + } + } + } +#endif } int CPlatformNetworkManagerStub::GetPlayerCount() @@ -232,6 +301,10 @@ bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) m_bLeavingGame = true; +#ifdef _WINDOWS64 + WinsockNetLayer::StopAdvertising(); +#endif + // If we are the host wait for the game server to end if(m_pIQNet->IsHost() && g_NetworkManager.ServerStoppedValid()) { @@ -239,6 +312,22 @@ bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) g_NetworkManager.ServerStoppedWait(); g_NetworkManager.ServerStoppedDestroy(); } + else + { + m_pIQNet->EndGame(); + } + + for (AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++) + delete* it; + currentNetworkPlayers.clear(); + m_machineQNetPrimaryPlayers.clear(); + SystemFlagReset(); + +#ifdef _WINDOWS64 + WinsockNetLayer::Shutdown(); + WinsockNetLayer::Initialize(); +#endif + return true; } @@ -262,7 +351,35 @@ void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, m_pIQNet->HostGame(); +#ifdef _WINDOWS64 + IQNet::m_player[0].m_smallId = 0; + IQNet::m_player[0].m_isRemote = false; + IQNet::m_player[0].m_isHostPlayer = true; + IQNet::s_playerCount = 1; +#endif + _HostGame( localUsersMask, publicSlots, privateSlots ); + +#ifdef _WINDOWS64 + int port = WIN64_NET_DEFAULT_PORT; + const char* bindIp = NULL; + if (g_Win64DedicatedServer) + { + if (g_Win64DedicatedServerPort > 0) + port = g_Win64DedicatedServerPort; + if (g_Win64DedicatedServerBindIP[0] != 0) + bindIp = g_Win64DedicatedServerBindIP; + } + if (!WinsockNetLayer::IsActive()) + WinsockNetLayer::HostGame(port, bindIp); + + if (WinsockNetLayer::IsActive()) + { + const wchar_t* hostName = IQNet::m_player[0].m_gamertag; + unsigned int settings = app.GetGameHostOption(eGameHostOption_All); + WinsockNetLayer::StartAdvertising(port, hostName, settings, 0, 0, MINECRAFT_NET_VERSION); + } +#endif //#endif } @@ -275,9 +392,54 @@ bool CPlatformNetworkManagerStub::_StartGame() return true; } -int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) +int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo* searchResult, int localUsersMask, int primaryUserIndex) { +#ifdef _WINDOWS64 + if (searchResult == NULL) + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + + const char* hostIP = searchResult->data.hostIP; + int hostPort = searchResult->data.hostPort; + + if (hostPort <= 0 || hostIP[0] == 0) + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + + m_bLeavingGame = false; + IQNet::s_isHosting = false; + m_pIQNet->ClientJoinGame(); + + IQNet::m_player[0].m_smallId = 0; + IQNet::m_player[0].m_isRemote = true; + IQNet::m_player[0].m_isHostPlayer = true; + wcsncpy_s(IQNet::m_player[0].m_gamertag, 32, searchResult->data.hostName, _TRUNCATE); + + WinsockNetLayer::StopDiscovery(); + + if (!WinsockNetLayer::JoinGame(hostIP, hostPort)) + { + app.DebugPrintf("Win64 LAN: Failed to connect to %s:%d\n", hostIP, hostPort); + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + } + + BYTE localSmallId = WinsockNetLayer::GetLocalSmallId(); + + IQNet::m_player[localSmallId].m_smallId = localSmallId; + IQNet::m_player[localSmallId].m_isRemote = false; + IQNet::m_player[localSmallId].m_isHostPlayer = false; + + Minecraft* pMinecraft = Minecraft::GetInstance(); + wcscpy_s(IQNet::m_player[localSmallId].m_gamertag, 32, pMinecraft->user->name.c_str()); + IQNet::s_playerCount = localSmallId + 1; + + NotifyPlayerJoined(&IQNet::m_player[0]); + NotifyPlayerJoined(&IQNet::m_player[localSmallId]); + + m_pGameNetworkManager->StateChange_AnyToStarting(); + return CGameNetworkManager::JOINGAME_SUCCESS; +#else + return CGameNetworkManager::JOINGAME_SUCCESS; +#endif } bool CPlatformNetworkManagerStub::SetLocalGame(bool isLocal) @@ -315,6 +477,22 @@ void CPlatformNetworkManagerStub::HandleSignInChange() bool CPlatformNetworkManagerStub::_RunNetworkGame() { +#ifdef _WINDOWS64 + extern QNET_STATE _iQNetStubState; + _iQNetStubState = QNET_STATE_GAME_PLAY; + + for (DWORD i = 0; i < IQNet::s_playerCount; i++) + { + if (IQNet::m_player[i].m_isRemote) + { + INetworkPlayer* pNetworkPlayer = getNetworkPlayer(&IQNet::m_player[i]); + if (pNetworkPlayer != NULL && pNetworkPlayer->GetSocket() != NULL) + { + Socket::addIncomingSocket(pNetworkPlayer->GetSocket()); + } + } + } +#endif return true; } @@ -503,10 +681,60 @@ wstring CPlatformNetworkManagerStub::GatherRTTStats() void CPlatformNetworkManagerStub::TickSearch() { +#ifdef _WINDOWS64 + if (m_SessionsUpdatedCallback == NULL) + return; + + static DWORD lastSearchTime = 0; + DWORD now = GetTickCount(); + if (now - lastSearchTime < 2000) + return; + lastSearchTime = now; + + SearchForGames(); +#endif } void CPlatformNetworkManagerStub::SearchForGames() { +#ifdef _WINDOWS64 + std::vector lanSessions = WinsockNetLayer::GetDiscoveredSessions(); + + for (size_t i = 0; i < friendsSessions[0].size(); i++) + delete friendsSessions[0][i]; + friendsSessions[0].clear(); + + for (size_t i = 0; i < lanSessions.size(); i++) + { + FriendSessionInfo* info = new FriendSessionInfo(); + size_t nameLen = wcslen(lanSessions[i].hostName); + info->displayLabel = new wchar_t[nameLen + 1]; + wcscpy_s(info->displayLabel, nameLen + 1, lanSessions[i].hostName); + info->displayLabelLength = (unsigned char)nameLen; + info->displayLabelViewableStartIndex = 0; + + info->data.netVersion = lanSessions[i].netVersion; + info->data.m_uiGameHostSettings = lanSessions[i].gameHostSettings; + info->data.texturePackParentId = lanSessions[i].texturePackParentId; + info->data.subTexturePackId = lanSessions[i].subTexturePackId; + info->data.isReadyToJoin = lanSessions[i].isJoinable; + info->data.isJoinable = lanSessions[i].isJoinable; + strncpy_s(info->data.hostIP, sizeof(info->data.hostIP), lanSessions[i].hostIP, _TRUNCATE); + info->data.hostPort = lanSessions[i].hostPort; + wcsncpy_s(info->data.hostName, XUSER_NAME_SIZE, lanSessions[i].hostName, _TRUNCATE); + info->data.playerCount = lanSessions[i].playerCount; + info->data.maxPlayers = lanSessions[i].maxPlayers; + + info->sessionId = (SessionID)((unsigned __int64)inet_addr(lanSessions[i].hostIP) | ((unsigned __int64)lanSessions[i].hostPort << 32)); + + friendsSessions[0].push_back(info); + } + + m_searchResultsCount[0] = (int)friendsSessions[0].size(); + + if (m_SessionsUpdatedCallback != NULL) + m_SessionsUpdatedCallback(m_pSearchParam); +#endif } int CPlatformNetworkManagerStub::SearchForGamesThreadProc( void* lpParameter ) @@ -522,7 +750,9 @@ void CPlatformNetworkManagerStub::SetSearchResultsReady(int resultCount) vector *CPlatformNetworkManagerStub::GetSessionList(int iPad, int localPlayers, bool partyOnly) { - vector *filteredList = new vector();; + vector* filteredList = new vector(); + for (size_t i = 0; i < friendsSessions[0].size(); i++) + filteredList->push_back(friendsSessions[0][i]); return filteredList; } diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h index f997dece..28953cec 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h @@ -161,8 +161,9 @@ public: virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); virtual void ForceFriendsSessionRefresh(); -private: +public: void NotifyPlayerJoined( IQNetPlayer *pQNetPlayer ); + void NotifyPlayerLeaving(IQNetPlayer* pQNetPlayer); #ifndef _XBOX void FakeLocalPlayerJoined() { NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(0)); } diff --git a/Minecraft.Client/Common/Network/SessionInfo.h b/Minecraft.Client/Common/Network/SessionInfo.h index 31472a19..ce6365bc 100644 --- a/Minecraft.Client/Common/Network/SessionInfo.h +++ b/Minecraft.Client/Common/Network/SessionInfo.h @@ -23,9 +23,9 @@ typedef struct _GameSessionData _GameSessionData() { netVersion = 0; - memset(hostName,0,XUSER_NAME_SIZE); - memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0])); - memset(szPlayers,0,MINECRAFT_NET_MAX_PLAYERS*XUSER_NAME_SIZE); + memset(hostName, 0, XUSER_NAME_SIZE); + memset(players, 0, MINECRAFT_NET_MAX_PLAYERS * sizeof(players[0])); + memset(szPlayers, 0, MINECRAFT_NET_MAX_PLAYERS * XUSER_NAME_SIZE); isJoinable = true; m_uiGameHostSettings = 0; texturePackParentId = 0; @@ -50,7 +50,7 @@ typedef struct _GameSessionData _GameSessionData() { netVersion = 0; - memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0])); + memset(players, 0, MINECRAFT_NET_MAX_PLAYERS * sizeof(players[0])); isJoinable = true; m_uiGameHostSettings = 0; texturePackParentId = 0; @@ -63,12 +63,19 @@ typedef struct _GameSessionData #else typedef struct _GameSessionData { - unsigned short netVersion; // 2 bytes - unsigned int m_uiGameHostSettings; // 4 bytes - unsigned int texturePackParentId; // 4 bytes - unsigned char subTexturePackId; // 1 byte + unsigned short netVersion; + unsigned int m_uiGameHostSettings; + unsigned int texturePackParentId; + unsigned char subTexturePackId; - bool isReadyToJoin; // 1 byte + bool isReadyToJoin; + bool isJoinable; + + char hostIP[64]; + int hostPort; + wchar_t hostName[XUSER_NAME_SIZE]; + unsigned char playerCount; + unsigned char maxPlayers; _GameSessionData() { @@ -76,6 +83,13 @@ typedef struct _GameSessionData m_uiGameHostSettings = 0; texturePackParentId = 0; subTexturePackId = 0; + isReadyToJoin = false; + isJoinable = true; + memset(hostIP, 0, sizeof(hostIP)); + hostPort = 0; + memset(hostName, 0, sizeof(hostName)); + playerCount = 0; + maxPlayers = MINECRAFT_NET_MAX_PLAYERS; } } GameSessionData; #endif @@ -91,7 +105,7 @@ public: #elif defined(_DURANGO) DQRNetworkManager::SessionSearchResult searchResult; #endif - wchar_t *displayLabel; + wchar_t* displayLabel; unsigned char displayLabelLength; unsigned char displayLabelViewableStartIndex; GameSessionData data; @@ -107,7 +121,7 @@ public: ~FriendSessionInfo() { - if(displayLabel!=NULL) + if (displayLabel != NULL) delete displayLabel; } }; 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/ChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp index c03166b5..f42b3ee0 100644 --- a/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp +++ b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp @@ -7,6 +7,7 @@ #include "TutorialConstraints.h" #include "ChoiceTask.h" #include "..\..\..\Minecraft.World\Material.h" +#include "..\..\Windows64\KeyboardMouseInput.h" ChoiceTask::ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, int iConfirmMapping /*= 0*/, int iCancelMapping /*= 0*/, @@ -33,7 +34,11 @@ ChoiceTask::ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId /*= - bool ChoiceTask::isCompleted() { - Minecraft *pMinecraft = Minecraft::GetInstance(); + Minecraft* pMinecraft = Minecraft::GetInstance(); + if (!pMinecraft || !pMinecraft->player) + return false; + + int xboxPad = pMinecraft->player->GetXboxPad(); if( m_bConfirmMappingComplete || m_bCancelMappingComplete ) { @@ -49,24 +54,38 @@ bool ChoiceTask::isCompleted() else { // If the player is under water then allow all keypresses so they can jump out - if( pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water) ) return false; - - if(!m_bConfirmMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iConfirmMapping) > 0 ) + if (pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water)) return false; +#ifdef _WINDOWS64 + if (!m_bConfirmMappingComplete && + (InputManager.GetValue(xboxPad, m_iConfirmMapping) > 0 + || KMInput.IsKeyDown(VK_RETURN))) +#else + if (!m_bConfirmMappingComplete && + InputManager.GetValue(xboxPad, m_iConfirmMapping) > 0) +#endif { m_bConfirmMappingComplete = true; } - if(!m_bCancelMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iCancelMapping) > 0 ) + +#ifdef _WINDOWS64 + if (!m_bCancelMappingComplete && + (InputManager.GetValue(xboxPad, m_iCancelMapping) > 0 + || KMInput.IsKeyDown('B'))) +#else + if (!m_bCancelMappingComplete && + InputManager.GetValue(xboxPad, m_iCancelMapping) > 0) +#endif { m_bCancelMappingComplete = true; } - } - if(m_bConfirmMappingComplete || m_bCancelMappingComplete) - { - sendTelemetry(); - enableConstraints(false, true); + if (m_bConfirmMappingComplete || m_bCancelMappingComplete) + { + sendTelemetry(); + enableConstraints(false, true); + } + return m_bConfirmMappingComplete || m_bCancelMappingComplete; } - return m_bConfirmMappingComplete || m_bCancelMappingComplete; } eTutorial_CompletionAction ChoiceTask::getCompletionAction() @@ -99,11 +118,11 @@ void ChoiceTask::handleUIInput(int iAction) { if(bHasBeenActivated && m_bShownForMinimumTime) { - if( iAction == m_iConfirmMapping ) + if( iAction == m_iConfirmMapping) { m_bConfirmMappingComplete = true; } - else if(iAction == m_iCancelMapping ) + else if(iAction == m_iCancelMapping) { m_bCancelMappingComplete = true; } diff --git a/Minecraft.Client/Common/Tutorial/ControllerTask.cpp b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp index c5fe071b..c3a42120 100644 --- a/Minecraft.Client/Common/Tutorial/ControllerTask.cpp +++ b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp @@ -66,7 +66,11 @@ bool ControllerTask::isCompleted() } else { +#ifdef _WINDOWS64 + bAllComplete = true; +#else bAllComplete = false; +#endif } } iCurrent++; @@ -87,7 +91,11 @@ bool ControllerTask::isCompleted() } else { +#ifdef _WINDOWS64 + bAllComplete = true; +#else bAllComplete = false; +#endif } } iCurrent++; 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/InfoTask.cpp b/Minecraft.Client/Common/Tutorial/InfoTask.cpp index 5330841f..43a10357 100644 --- a/Minecraft.Client/Common/Tutorial/InfoTask.cpp +++ b/Minecraft.Client/Common/Tutorial/InfoTask.cpp @@ -7,6 +7,7 @@ #include "TutorialConstraints.h" #include "InfoTask.h" #include "..\..\..\Minecraft.World\Material.h" +#include "..\..\KeyboardMouseInput.h" InfoTask::InfoTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, int iMapping /*= 0*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/) @@ -65,7 +66,11 @@ bool InfoTask::isCompleted() bool current = (*it).second; if(!current) { - if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 ) +#ifdef _WINDOWS64 + if (InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 || KMInput.IsKeyDown(VK_SPACE)) +#else + if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0) +#endif { (*it).second = true; bAllComplete=true; 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_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_State_Unused_9 ); - s_completableTasks.push_back( e_Tutorial_State_Unused_10 ); + 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 29ddcf71..667431b2 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -21,6 +21,7 @@ IUIScene_AbstractContainerMenu::IUIScene_AbstractContainerMenu() m_pointerPos.x = 0.0f; m_pointerPos.y = 0.0f; + m_bPointerDrivenByMouse = false; } @@ -73,7 +74,7 @@ void IUIScene_AbstractContainerMenu::Initialize(int iPad, AbstractContainerMenu* m_iCurrSlotX = 0; m_iCurrSlotY = 0; #endif // TAP_DETECTION - // + // // for(int i=0;i= rows) + { + (*piTargetY) = rows - 1; + } + else + { + (*piTargetY) = offsetY; + } // Update X int offsetX = (*piTargetX) - xOffset; @@ -205,7 +215,7 @@ void IUIScene_AbstractContainerMenu::SetToolTip( EToolTipButton eButton, EToolTi void IUIScene_AbstractContainerMenu::UpdateTooltips() { // Table gives us text id for tooltip. - static const DWORD kaToolTipextIds[ eNumToolTips ] = + static const DWORD kaToolTipextIds[ eNumToolTips ] = { IDS_TOOLTIPS_PICKUPPLACE, //eToolTipPickupPlace_OLD IDS_TOOLTIPS_EXIT, // eToolTipExit @@ -307,7 +317,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() float fNewX=(((float)pTouchPadData->touch[0].x)-m_oldvTouchPos.x) * m_fTouchPadMulX; float fNewY=(((float)pTouchPadData->touch[0].y)-m_oldvTouchPos.y) * m_fTouchPadMulY; - // relative positions - needs a deadzone + // relative positions - needs a deadzone if(fNewX>m_fTouchPadDeadZoneX) { @@ -320,11 +330,11 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if(fNewY>m_fTouchPadDeadZoneY) { - vPointerPos.y=m_oldvPointerPos.y+((fNewY-m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + vPointerPos.y=m_oldvPointerPos.y+((fNewY-m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); } else if(fNewY<-m_fTouchPadDeadZoneY) { - vPointerPos.y=m_oldvPointerPos.y+((fNewY+m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + vPointerPos.y=m_oldvPointerPos.y+((fNewY+m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); } // Clamp to pointer extents. @@ -334,130 +344,131 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; bStickInput = true; - m_eCurrTapState=eTapStateNoInput; + m_eCurrTapState=eTapStateNoInput; } else { // reset the touch flag m_bFirstTouchStored[iPad]=false; - + #endif - // If there is any input on sticks, move the pointer. - if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) ) + // If there is any input on sticks, move the pointer. + if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) ) + { + m_bPointerDrivenByMouse = false; + fInputDirX = ( fInputX > 0.0f ) ? 1.0f : ( fInputX < 0.0f )?-1.0f : 0.0f; + fInputDirY = ( fInputY > 0.0f ) ? 1.0f : ( fInputY < 0.0f )?-1.0f : 0.0f; + +#ifdef TAP_DETECTION + // Check for potential tap input to jump slot. + ETapState eNewTapInput = GetTapInputType( fInputX, fInputY ); + + switch( m_eCurrTapState ) { - 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; + case eTapStateNoInput: + m_eCurrTapState = eNewTapInput; + break; -#ifdef TAP_DETECTION - // Check for potential tap input to jump slot. - ETapState eNewTapInput = GetTapInputType( fInputX, fInputY ); - - switch( m_eCurrTapState ) - { - case eTapStateNoInput: - m_eCurrTapState = eNewTapInput; - break; - - case eTapStateUp: - case eTapStateDown: - case eTapStateLeft: - case eTapStateRight: - if ( ( eNewTapInput != m_eCurrTapState ) && ( eNewTapInput != eTapStateNoInput ) ) - { - // Input is no longer suitable for tap. - m_eCurrTapState = eTapNone; - } - break; - - case eTapNone: - /// Nothing to do, input is not a tap. - break; - } -#endif // TAP_DETECTION - - // Square it so we get more precision for small inputs. - fInputX = fInputX * fInputX * fInputDirX * POINTER_SPEED_FACTOR; - fInputY = fInputY * fInputY * fInputDirY * POINTER_SPEED_FACTOR; - //fInputX = fInputX * POINTER_SPEED_FACTOR; - //fInputY = fInputY * POINTER_SPEED_FACTOR; - float fInputScale = 1.0f; - - // Ramp up input from zero when new input is recieved over INPUT_TICKS_FOR_SCALING ticks. This is to try to improve tapping stick to move 1 box. - if ( m_iConsectiveInputTicks < MAX_INPUT_TICKS_FOR_SCALING ) - { - ++m_iConsectiveInputTicks; - fInputScale = ( (float)( m_iConsectiveInputTicks) / (float)(MAX_INPUT_TICKS_FOR_SCALING) ); - } -#ifdef TAP_DETECTION - else if ( m_iConsectiveInputTicks < MAX_INPUT_TICKS_FOR_TAPPING ) - { - ++m_iConsectiveInputTicks; - } - else + case eTapStateUp: + case eTapStateDown: + case eTapStateLeft: + case eTapStateRight: + if ( ( eNewTapInput != m_eCurrTapState ) && ( eNewTapInput != eTapStateNoInput ) ) { + // Input is no longer suitable for tap. 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; + break; - fInputX *= fInputScale; - fInputY *= fInputScale; + case eTapNone: + /// Nothing to do, input is not a tap. + break; + } +#endif // TAP_DETECTION -#ifdef USE_POINTER_ACCEL - m_fPointerAccelX += fInputX / 50.0f; - m_fPointerAccelY += fInputY / 50.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; - if ( fabsf( fInputX ) > fabsf( m_fPointerVelX + m_fPointerAccelX ) ) - { - m_fPointerVelX += m_fPointerAccelX; - } - else - { - m_fPointerAccelX = fInputX - m_fPointerVelX; - m_fPointerVelX = fInputX; - } - - if ( fabsf( fInputY ) > fabsf( m_fPointerVelY + m_fPointerAccelY ) ) - { - m_fPointerVelY += m_fPointerAccelY; - } - else - { - m_fPointerAccelY = fInputY - m_fPointerVelY; - m_fPointerVelY = fInputY; - } - //printf( "IN %.2f VEL %.2f ACC %.2f\n", fInputY, m_fPointerVelY, m_fPointerAccelY ); - - vPointerPos.x += m_fPointerVelX; - vPointerPos.y -= m_fPointerVelY; -#else - // Add input to pointer position. - vPointerPos.x += fInputX; - vPointerPos.y -= fInputY; -#endif - // Clamp to pointer extents. - if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; - else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; - if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; - else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; - - bStickInput = true; + // 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_iConsectiveInputTicks = 0; -#ifdef USE_POINTER_ACCEL - m_fPointerVelX = 0.0f; - m_fPointerVelY = 0.0f; - m_fPointerAccelX = 0.0f; - m_fPointerAccelY = 0.0f; -#endif + m_eCurrTapState = eTapNone; } +#endif + // 4J Stu - The cursor moves too fast in SD mode + // The SD/splitscreen scenes are approximately 0.6 times the size of the fullscreen on + if(!RenderManager.IsHiDef() || app.GetLocalPlayerCount() > 1) fInputScale *= 0.6f; + + fInputX *= fInputScale; + fInputY *= fInputScale; + +#ifdef USE_POINTER_ACCEL + m_fPointerAccelX += fInputX / 50.0f; + m_fPointerAccelY += fInputY / 50.0f; + + if ( fabsf( fInputX ) > fabsf( m_fPointerVelX + m_fPointerAccelX ) ) + { + m_fPointerVelX += m_fPointerAccelX; + } + else + { + m_fPointerAccelX = fInputX - m_fPointerVelX; + m_fPointerVelX = fInputX; + } + + if ( fabsf( fInputY ) > fabsf( m_fPointerVelY + m_fPointerAccelY ) ) + { + m_fPointerVelY += m_fPointerAccelY; + } + else + { + m_fPointerAccelY = fInputY - m_fPointerVelY; + m_fPointerVelY = fInputY; + } + //printf( "IN %.2f VEL %.2f ACC %.2f\n", fInputY, m_fPointerVelY, m_fPointerAccelY ); + + vPointerPos.x += m_fPointerVelX; + vPointerPos.y -= m_fPointerVelY; +#else + // Add input to pointer position. + vPointerPos.x += fInputX; + vPointerPos.y -= fInputY; +#endif + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + bStickInput = true; + } + else + { + m_iConsectiveInputTicks = 0; +#ifdef USE_POINTER_ACCEL + m_fPointerVelX = 0.0f; + m_fPointerVelY = 0.0f; + m_fPointerAccelX = 0.0f; + m_fPointerAccelY = 0.0f; +#endif + } #ifdef __ORBIS__ } @@ -501,7 +512,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() ( vPointerPos.y >= sectionPos.y ) && ( vPointerPos.y <= itemMax.y ) ) { // Pointer is over this control! - eSectionUnderPointer = eSection; + eSectionUnderPointer = eSection; vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f ); vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f ); @@ -589,8 +600,11 @@ 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 ) + if ( eSectionUnderPointer == eSectionNone ) { setFocusToPointer( getPad() ); #ifdef TAP_DETECTION @@ -680,7 +694,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() // If there is no stick input, and we are over a slot, then snap pointer to slot centre. // 4J - TomK - only if this particular component allows so! - if(CanHaveFocus(eSectionUnderPointer)) + if(!m_bPointerDrivenByMouse && CanHaveFocus(eSectionUnderPointer)) { vPointerPos.x = vSnapPos.x; vPointerPos.y = vSnapPos.y; @@ -768,20 +782,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 ); @@ -790,7 +810,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if ( bSlotHasItem ) { // Item in hand and item in slot ... is item in slot the same as in out hand? If so, can we stack on to it? - if ( bCarriedIsSameAsSlot ) + if ( bCarriedIsSameAsSlot ) { // Can we stack more into this slot? if ( iSlotStackSizeRemaining == 0 ) @@ -865,13 +885,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; } } @@ -919,7 +948,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else { buttonY = eToolTipQuickMove; - } + } break; case ArmorRecipes::eArmorType_Leggings: if(isSlotEmpty(eSectionInventoryArmor,2)) @@ -1051,7 +1080,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; } @@ -1077,15 +1106,15 @@ void IUIScene_AbstractContainerMenu::onMouseTick() // ingredient slot empty buttonY = eToolTipQuickMoveIngredient; } - } + } else { // valid potion? Glass bottle with water in it is a 'potion' too. if(iId==Item::potion_Id) { // space available? - if(isSlotEmpty(eSectionBrewingBottle1,0) || - isSlotEmpty(eSectionBrewingBottle2,0) || + if(isSlotEmpty(eSectionBrewingBottle1,0) || + isSlotEmpty(eSectionBrewingBottle2,0) || isSlotEmpty(eSectionBrewingBottle3,0)) { buttonY = eToolTipQuickMoveIngredient; @@ -1112,8 +1141,8 @@ void IUIScene_AbstractContainerMenu::onMouseTick() { // is there already something in the ingredient slot? if(isSlotEmpty(eSectionEnchantSlot,0)) - { - // tool slot empty + { + // tool slot empty switch(iId) { case Item::bow_Id: @@ -1124,10 +1153,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: @@ -1155,7 +1184,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() buttonY = eToolTipQuickMove; break; default: - buttonY=eToolTipQuickMoveTool; + buttonY=eToolTipQuickMoveTool; break; } } @@ -1163,10 +1192,10 @@ void IUIScene_AbstractContainerMenu::onMouseTick() { buttonY = eToolTipQuickMove; } - } + } else { - buttonY=eToolTipQuickMove; + buttonY=eToolTipQuickMove; } } else @@ -1201,13 +1230,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; @@ -1275,35 +1304,60 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b #endif int buttonNum=0; // 0 = LeftMouse, 1 = RightMouse - BOOL quickKeyHeld=FALSE; // Represents shift key on PC - - BOOL validKeyPress = FALSE; - //BOOL itemEditorKeyPress = FALSE; + BOOL quickKeyHeld=false; // Represents shift key on PC + BOOL quickKeyDown = false; // Represents shift key on PC + BOOL validKeyPress = false; + bool itemEditorKeyPress = false; // Ignore input from other players //if(pMinecraft->player->GetXboxPad()!=pInputData->UserIndex) return S_OK; - + switch(iAction) { #ifdef _DEBUG_MENUS_ENABLED -#if TO_BE_IMPLEMENTED - case VK_PAD_RTHUMB_PRESS: + case ACTION_MENU_OTHER_STICK_PRESS: itemEditorKeyPress = TRUE; break; -#endif -#endif +#endif case ACTION_MENU_A: #ifdef __ORBIS__ case ACTION_MENU_TOUCHPAD_PRESS: #endif - if(!bRepeat) + if (!bRepeat) { validKeyPress = TRUE; // Standard left click buttonNum = 0; - quickKeyHeld = FALSE; - ui.PlayUISFX(eSFX_Press); + if (KMInput.IsKeyDown(VK_SHIFT)) + { + { + validKeyPress = TRUE; + + // Shift and left click + buttonNum = 0; + quickKeyHeld = TRUE; + if (IsSectionSlotList(m_eCurrSection)) + { + int currentIndex = getCurrentIndex(m_eCurrSection) - getSectionStartOffset(m_eCurrSection); + + bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); + if (bSlotHasItem) + ui.PlayUISFX(eSFX_Press); + } + } + } + else { + if (IsSectionSlotList(m_eCurrSection)) + { + int currentIndex = getCurrentIndex(m_eCurrSection) - getSectionStartOffset(m_eCurrSection); + + bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); + if (bSlotHasItem) + ui.PlayUISFX(eSFX_Press); + } + // + } } break; case ACTION_MENU_X: @@ -1314,9 +1368,18 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b // Standard right click buttonNum = 1; quickKeyHeld = FALSE; - ui.PlayUISFX(eSFX_Press); + + if( IsSectionSlotList( m_eCurrSection ) ) + { + int currentIndex = getCurrentIndex( m_eCurrSection ) - getSectionStartOffset(m_eCurrSection); + + bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); + if ( bSlotHasItem ) + ui.PlayUISFX(eSFX_Press); + } } break; + case ACTION_MENU_Y: if(!bRepeat) { @@ -1333,7 +1396,14 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b // Shift and left click buttonNum = 0; quickKeyHeld = TRUE; - ui.PlayUISFX(eSFX_Press); + if( IsSectionSlotList( m_eCurrSection ) ) + { + int currentIndex = getCurrentIndex( m_eCurrSection ) - getSectionStartOffset(m_eCurrSection); + + bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); + if ( bSlotHasItem ) + ui.PlayUISFX(eSFX_Press); + } } } break; @@ -1358,7 +1428,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b } else { - ui.CloseUIScenes(iPad); + ui.CloseUIScenes(iPad); } bHandled = true; @@ -1395,13 +1465,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 ) ) { @@ -1456,7 +1520,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b { handleOutsideClicked(iPad, buttonNum, quickKeyHeld); } - else // + else // { // over empty space or something else??? handleOtherClicked(iPad,m_eCurrSection,buttonNum,quickKeyHeld?true:false); @@ -1467,46 +1531,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 { @@ -1528,7 +1564,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) @@ -1573,8 +1609,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) @@ -1598,38 +1633,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; - wstring desc = L""; - vector *strings = slot->getItem()->getHoverText(nullptr, false, unformattedStrings); - bool firstLine = true; - for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + vector *lines = slot->getItem()->getHoverText(nullptr, false); + + // Add rarity to first line + if (lines->size() > 0) { - wstring thisString = *it; - if(!firstLine) - { - desc.append( L"
" ); - } - else - { - firstLine = false; - wchar_t formatted[256]; - eMinecraftColour rarityColour = slot->getItem()->getRarity()->color; - int colour = app.GetHTMLColour(rarityColour); + lines->at(0).color = slot->getItem()->getRarity()->color; - if(slot->getItem()->hasCustomHoverName()) - { - colour = app.GetHTMLColour(eTextColor_RenamedItemTitle); - } - - swprintf(formatted, 256, L"%ls",colour,thisString.c_str()); - thisString = formatted; + if(slot->getItem()->hasCustomHoverName()) + { + lines->at(0).color = eTextColor_RenamedItemTitle; } - desc.append( thisString ); } - strings->clear(); - delete strings; - return desc; + + return lines; +} + +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..fe79bf19 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; @@ -96,6 +125,7 @@ protected: eTutorial_State m_previousTutorialState; UIVec2D m_pointerPos; + bool m_bPointerDrivenByMouse; // Offset from pointer image top left to centre (we use the centre as the actual pointer). float m_fPointerImageOffsetX; @@ -162,13 +192,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 +231,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) { - // 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],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i] ); + m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]); + } + else + { + ingItemInst = m_pPlayer->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i] ); + m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i]); } + // 4J Stu - Fix for #13097 - Bug: Milk Buckets are removed when crafting Cake + if (ingItemInst != NULL) + { + if (ingItemInst->getItem()->hasCraftingRemainingItem()) + { + // replace item with remaining result + m_pPlayer->inventory->add( shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + } + + } } } - } - // 4J Stu - Fix for #13119 - We should add the item after we remove the ingredients - if(m_pPlayer->inventory->add(pTempItemInst)==false ) - { - // no room in inventory, so throw it down - m_pPlayer->drop(pTempItemInst); - } + // 4J 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,6 +1070,30 @@ void IUIScene_CraftingMenu::DisplayIngredients() int id=pRecipeIngredientsRequired[iRecipe].iIngIDA[i]; int iAuxVal=pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]; Item *item = Item::items[id]; + + shared_ptr itemInst= shared_ptr(new ItemInstance(item,pRecipeIngredientsRequired[iRecipe].iIngValA[i],iAuxVal)); + + // 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::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; @@ -1076,26 +1103,10 @@ void IUIScene_CraftingMenu::DisplayIngredients() { iAuxVal = 0xFF; } - - shared_ptr itemInst= shared_ptr(new ItemInstance(item,pRecipeIngredientsRequired[iRecipe].iIngValA[i],iAuxVal)); + itemInst->setAuxValue(iAuxVal); setIngredientDescriptionItem(getPad(),i,itemInst); setIngredientDescriptionRedBox(i,false); - - // 4J-PB - a very special case - the bed can use any kind of wool, so we can't use the item description - // and the same goes for the painting - int idescID; - - if( ((pTempItemInst->id==Item::bed_Id) &&(id==Tile::cloth_Id)) || - ((pTempItemInst->id==Item::painting_Id) &&(id==Tile::cloth_Id)) ) - { - idescID=IDS_ANY_WOOL; - } - else - { - idescID=itemInst->getDescriptionId(); - } - setIngredientDescriptionText(i,app.GetString(idescID)); } // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture @@ -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..973020db 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}; - specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup, 0, NULL); + 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); +#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) @@ -633,14 +845,16 @@ IUIScene_CreativeMenu::TabSpec::TabSpec(LPCWSTR icon, int descriptionId, int sta } } - m_staticPerPage = MAX_SIZE - dynamicItems; - m_pages = (int)ceil((float)m_staticItems / m_staticPerPage); + m_staticPerPage = columns; + const int totalRows = (m_staticItems + columns - 1) / columns; + m_pages = std::max(1, totalRows - 5 + 1); } 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 +873,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,27 +887,80 @@ void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, i currentIndex += size; continue; } + displayStatic = true; currentItem = size - ((currentIndex + size) - startIndex); break; } - for(; lastSlotIndex < MAX_SIZE;) - { - Slot *slot = menu->getSlot(lastSlotIndex++); - slot->set(categoryGroups[m_staticGroupsA[currentGroup]][currentItem]); + int lastStaticPageCount = currentIndex; + while(lastStaticPageCount > m_staticPerPage) lastStaticPageCount -= m_staticPerPage; - ++currentItem; - if(currentItem >= categoryGroups[m_staticGroupsA[currentGroup]].size()) + if(displayStatic) + { + for(; lastSlotIndex < MAX_SIZE;) { - currentItem = 0; - ++currentGroup; - if(currentGroup >= m_staticGroupsCount) + Slot *slot = menu->getSlot(lastSlotIndex++); + slot->set(categoryGroups[m_staticGroupsA[currentGroup]][currentItem]); + + ++currentItem; + if(currentItem >= categoryGroups[m_staticGroupsA[currentGroup]].size()) { - break; + currentItem = 0; + ++currentGroup; + if(currentGroup >= m_staticGroupsCount) + { + break; + } } } } +#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; + 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) { Slot *slot = menu->getSlot(lastSlotIndex); @@ -703,7 +970,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 +1039,6 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA newSection = eSectionInventoryCreativeSelector; } break; -#ifndef _XBOX case eSectionInventoryCreativeTab_0: case eSectionInventoryCreativeTab_1: case eSectionInventoryCreativeTab_2: @@ -775,7 +1050,6 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA case eSectionInventoryCreativeSlider: /* do nothing */ break; -#endif default: assert( false ); break; @@ -800,7 +1074,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 +1204,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 +1252,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 +1295,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 +1304,6 @@ bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, if(bSlotHasItem) { buttonA = eToolTipPickUpGeneric; - buttonRT = eToolTipWhatIsThis; if(itemUnderPointer->isStackable()) { @@ -1051,3 +1324,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 eb33b6b3..6ac2f9ba 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(bBitmapFont) + 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(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();) @@ -426,7 +500,7 @@ void UIController::loadSkins() #elif defined __PSVITA__ platformSkinPath = L"skinVita.swf"; #elif defined _WINDOWS64 - if(m_fScreenHeight>=1080.0f) + if(m_fScreenHeight>720.0f) { platformSkinPath = L"skinHDWin.swf"; } @@ -435,7 +509,7 @@ void UIController::loadSkins() platformSkinPath = L"skinWin.swf"; } #elif defined _DURANGO - if(m_fScreenHeight>=1080.0f) + if(m_fScreenHeight>720.0f) { platformSkinPath = L"skinHDDurango.swf"; } @@ -444,7 +518,7 @@ void UIController::loadSkins() platformSkinPath = L"skinDurango.swf"; } #elif defined __ORBIS__ - if(m_fScreenHeight>=1080.0f) + if(m_fScreenHeight>720.0f) { platformSkinPath = L"skinHDOrbis.swf"; } @@ -455,7 +529,7 @@ void UIController::loadSkins() #endif // Every platform has one of these, so nothing shared - if(m_fScreenHeight>=1080.0f) + if(m_fScreenHeight>720.0f) { m_iggyLibraries[eLibrary_Platform] = loadSkin(platformSkinPath, L"platformskinHD.swf"); } @@ -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() @@ -937,6 +1012,7 @@ void UIController::handleKeyPress(unsigned int iPad, unsigned int key) case ACTION_MENU_PAUSEMENU: kbDown = KMInput.IsKeyDown(VK_ESCAPE); kbPressed = KMInput.IsKeyPressed(VK_ESCAPE); kbReleased = KMInput.IsKeyReleased(VK_ESCAPE); break; case ACTION_MENU_LEFT_SCROLL: kbDown = KMInput.IsKeyDown('Q'); kbPressed = KMInput.IsKeyPressed('Q'); kbReleased = KMInput.IsKeyReleased('Q'); break; case ACTION_MENU_RIGHT_SCROLL: kbDown = KMInput.IsKeyDown('E'); kbPressed = KMInput.IsKeyPressed('E'); kbReleased = KMInput.IsKeyReleased('E'); break; + case ACTION_MENU_QUICK_MOVE: kbDown = KMInput.IsKeyDown(VK_SHIFT); kbPressed = KMInput.IsKeyPressed(VK_SHIFT); kbReleased = KMInput.IsKeyReleased(VK_SHIFT); break; } pressed = pressed || kbPressed; released = released || kbReleased; @@ -1369,7 +1445,7 @@ GDrawTexture * RADLINK UIController::TextureSubstitutionCreateCallback ( void * // 4J Stu - All our flash controls that allow replacing textures use a special 64x64 symbol // Force this size here so that our images don't get scaled wildly - #if (defined __ORBIS__ || defined _DURANGO ) + #if (defined __ORBIS__ || defined _DURANGO || defined _WINDOWS64 ) *width = 96; *height = 96; #else @@ -1431,6 +1507,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 +1536,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 +2028,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 +2054,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 +2120,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 +2212,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 +2273,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 +2530,19 @@ void UIController::ClearPressStart() m_iPressStartQuadrantsMask = 0; } -// 4J Stu - For the different StringTable classes. Should really fix the libraries. -#ifndef __PS3__ +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, C4JStringTable *pStringTable, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) -#else -C4JStorage::EMessageResult UIController::RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad, - int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, StringTable *pStringTable, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) -#endif + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) + { MessageBoxInfo param; param.uiTitle = uiTitle; @@ -2453,7 +2550,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 +2609,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 +2648,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 +2802,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 +3060,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 e6f87f81..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; @@ -313,6 +328,10 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) newScene = new UIScene_InGameInfoMenu(iPad, initData, this); break; case eUIScene_InGameHostOptionsMenu: + if (IsSceneInStack(eUIScene_InGameHostOptionsMenu)) { + app.DebugPrintf("Skipped eUIScene_InGameHostOptionsMenu, we have already this tab!"); + return false; + } newScene = new UIScene_InGameHostOptionsMenu(iPad, initData, this); break; case eUIScene_InGamePlayerOptionsMenu: @@ -382,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: @@ -696,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 @@ -719,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 @@ -782,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; } @@ -819,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..bb56c780 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -30,6 +30,14 @@ UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu(int iPad, UILayer * m_bIgnoreInput=false; #ifdef _WINDOWS64 m_bMouseDragSlider=false; + m_bHasMousePosition = false; + m_lastMouseX = 0; + m_lastMouseY = 0; + + for (int btn = 0; btn < 3; btn++) + { + KMInput.ConsumeMousePress(btn); + } #endif } @@ -50,7 +58,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); @@ -181,7 +192,9 @@ void UIScene_AbstractContainerMenu::tick() #ifdef _WINDOWS64 bool mouseActive = (m_iPad == 0 && !KMInput.IsCaptured()); + bool drivePointerFromMouse = false; float rawMouseMovieX = 0, rawMouseMovieY = 0; + int scrollDelta = 0; // Map Windows mouse position to the virtual pointer in movie coordinates if (mouseActive) { @@ -193,15 +206,30 @@ void UIScene_AbstractContainerMenu::tick() { int mouseX = KMInput.GetMouseX(); int mouseY = KMInput.GetMouseY(); + bool mouseMoved = !m_bHasMousePosition || mouseX != m_lastMouseX || mouseY != m_lastMouseY; + + m_bHasMousePosition = true; + m_lastMouseX = mouseX; + m_lastMouseY = mouseY; + scrollDelta = KMInput.ConsumeScrollDelta(); // Convert mouse position to movie coordinates using the movie/client ratio - float mx = (float)mouseX * ((float)m_movieWidth / (float)clientWidth); - float my = (float)mouseY * ((float)m_movieHeight / (float)clientHeight); + float mx = (float)mouseX * ((float)m_movieWidth / (float)clientWidth) - (float)m_controlMainPanel.getXPos(); + float my = (float)mouseY * ((float)m_movieHeight / (float)clientHeight) - (float)m_controlMainPanel.getYPos(); - m_pointerPos.x = mx; - m_pointerPos.y = my; rawMouseMovieX = mx; rawMouseMovieY = my; + + // Once the mouse has taken over the container cursor, keep following the OS cursor + // until explicit controller input takes ownership back. + drivePointerFromMouse = m_bPointerDrivenByMouse || mouseMoved || KMInput.IsMouseDown(0) || KMInput.IsMouseDown(1) || KMInput.IsMouseDown(2) || scrollDelta != 0; + if (drivePointerFromMouse) + { + m_bPointerDrivenByMouse = true; + m_eCurrTapState = eTapStateNoInput; + m_pointerPos.x = mx; + m_pointerPos.y = my; + } } } #endif @@ -248,7 +276,6 @@ void UIScene_AbstractContainerMenu::tick() } // Mouse scroll wheel for page scrolling - int scrollDelta = KMInput.ConsumeScrollDelta(); if (scrollDelta > 0) { handleKeyDown(m_iPad, ACTION_MENU_OTHER_STICK_UP, false); @@ -273,14 +300,19 @@ void UIScene_AbstractContainerMenu::tick() #ifdef _WINDOWS64 S32 x, y; - if (mouseActive) + if (mouseActive && m_bPointerDrivenByMouse) { // Send raw mouse position directly as Iggy event to avoid coordinate round-trip errors // Scale mouse client coords to the Iggy display space (which was set to getRenderDimensions()) RECT clientRect; GetClientRect(KMInput.GetHWnd(), &clientRect); - x = (S32)((float)KMInput.GetMouseX() * ((float)width / (float)clientRect.right)); - y = (S32)((float)KMInput.GetMouseY() * ((float)height / (float)clientRect.bottom)); + float mouseMovieX = (float)KMInput.GetMouseX() * ((float)m_movieWidth / (float)clientRect.right); + float mouseMovieY = (float)KMInput.GetMouseY() * ((float)m_movieHeight / (float)clientRect.bottom); + float mouseLocalX = mouseMovieX - (float)m_controlMainPanel.getXPos(); + float mouseLocalY = mouseMovieY - (float)m_controlMainPanel.getYPos(); + + x = (S32)(mouseLocalX * ((float)width / m_movieWidth)); + y = (S32)(mouseLocalY * ((float)height / m_movieHeight)); } else { @@ -311,7 +343,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 +365,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 +373,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 +386,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) @@ -366,25 +398,29 @@ void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, if(pressed) { + m_bPointerDrivenByMouse = false; handled = handleKeyDown(m_iPad, key, 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 +441,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..812c5b41 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -12,6 +12,9 @@ private: bool m_bIgnoreInput; #ifdef _WINDOWS64 bool m_bMouseDragSlider; + bool m_bHasMousePosition; + int m_lastMouseX; + int m_lastMouseY; #endif protected: @@ -48,15 +51,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 a9ff02f5..f2ecd0d4 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) { - // Set up online game checkbox - bool bOnlineGame = m_MoreOptionsParams.bOnlineGame; - m_checkboxOnline.SetEnable(true); - - // 4J-PB - to stop an offline game being able to select the online flag - if(ProfileManager.IsSignedInLive(m_iPad) == false) - { - m_checkboxOnline.SetEnable(false); - } - - if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) - { - m_checkboxOnline.SetEnable(false); - bOnlineGame = false; - } - - m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); + m_checkboxOnline.SetEnable(false); } -#endif + + if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + m_checkboxOnline.SetEnable(false); + bOnlineGame = false; + } + + 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! @@ -1165,7 +1140,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 ); @@ -1177,6 +1152,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); @@ -1187,26 +1177,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 @@ -1284,7 +1271,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 { @@ -1292,14 +1279,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 } @@ -1319,14 +1306,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 @@ -1390,7 +1377,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. { - LPWSTR creditsString = new wchar_t[ 128 ]; - if(pDef->m_iStringID[1]!=NO_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() ) { - swprintf( creditsString, 128, pDef->m_Text, app.GetString( pDef->m_iStringID[0] ), app.GetString( pDef->m_iStringID[1] ) ); + 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[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, 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; + PlayerInfo *info = BuildPlayerInfo(player); - wstring playerName = L""; -#ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); - } - - int voiceStatus = 0; - if(player != NULL && player->HasVoice() ) - { - if( player->IsMutedByLocalUser(m_iPad) ) - { - // Muted image - voiceStatus = 3; - } - else if( player->IsTalking() ) - { - // Talking image - voiceStatus = 2; - } - else - { - // Not talking image - voiceStatus = 1; - } - } - - m_playersVoiceState[i] = voiceStatus; - m_playersColourState[i] = app.GetPlayerColour( m_players[i] ); - m_playerNames[i] = playerName; - m_playerList.addItem( playerName, app.GetPlayerColour( m_players[i] ), voiceStatus); + 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; + PlayerInfo *info = BuildPlayerInfo(player); - wstring playerName = L""; -#ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); - } - - int voiceStatus = 0; - if(player != NULL && player->HasVoice() ) - { - if( player->IsMutedByLocalUser(m_iPad) ) - { - // Muted image - voiceStatus = 3; - } - else if( player->IsTalking() ) - { - // Talking image - voiceStatus = 2; - } - else - { - // Not talking image - voiceStatus = 1; - } - } - - m_playersVoiceState[i] = voiceStatus; - m_playersColourState[i] = app.GetPlayerColour( m_players[i] ); - m_playerNames[i] = playerName; - m_playerList.addItem( playerName, app.GetPlayerColour( m_players[i] ), voiceStatus); + 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() ) + PlayerInfo *info = BuildPlayerInfo(player); + + m_players[i]->m_smallId = info->m_smallId; + + if(info->m_voiceStatus != m_players[i]->m_voiceStatus) { - if( player->IsMutedByLocalUser(m_iPad) ) - { - // Muted image - voiceStatus = 3; - } - else if( player->IsTalking() ) - { - // Talking image - voiceStatus = 2; - } - else - { - // Not talking image - voiceStatus = 1; - } + m_players[i]->m_voiceStatus = info->m_voiceStatus; + m_playerList.setVOIPIcon(i, info->m_voiceStatus); + } + + if(info->m_colorState != m_players[i]->m_colorState) + { + m_players[i]->m_colorState = info->m_colorState; + m_playerList.setPlayerIcon(i, info->m_colorState); } - if(voiceStatus != m_playersVoiceState[i]) + if(info->m_name.compare( m_players[i]->m_name ) != 0 ) { - m_playersVoiceState[i] = voiceStatus; - m_playerList.setVOIPIcon( i, voiceStatus ); + m_playerList.setButtonLabel(i, info->m_name); + m_players[i]->m_name = info->m_name; } - short icon = app.GetPlayerColour( m_players[i] ); - - if(icon != m_playersColourState[i]) - { - m_playersColourState[i] = icon; - m_playerList.setPlayerIcon( i, (int)app.GetPlayerColour( m_players[i] ) ); - } - - wstring playerName = L""; -#ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); - } - if(playerName.compare( m_playerNames[i] ) != 0 ) - { - m_playerList.setButtonLabel(i, playerName); - m_playerNames[i] = playerName; - } + 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 ) + 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 the player was found remove them (even if they're joining, they'll be added again later) + 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); + app.DebugPrintf(" Player \"%ls\" found, removing\n", pPlayer->GetOnlineName()); + + // Remove player info + delete scene->m_players[foundIndex]; + scene->m_players.erase(scene->m_players.begin() + foundIndex); + + // Remove player from list + scene->m_playerList.removeItem(foundIndex); } - if( !playerFound ) + // If the player is joining + if(!leaving) { - // Player added - scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); - ++scene->m_playersCount; + app.DebugPrintf(" Player \"%ls\" not found, adding\n", pPlayer->GetOnlineName()); - wstring playerName = L""; -#ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); - } - - int voiceStatus = 0; - if(pPlayer != NULL && pPlayer->HasVoice() ) - { - if( pPlayer->IsMutedByLocalUser(scene->m_iPad) ) - { - // Muted image - voiceStatus = 3; - } - else if( pPlayer->IsTalking() ) - { - // Talking image - voiceStatus = 2; - } - else - { - // Not talking image - voiceStatus = 1; - } - } - - scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + 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) + if(pClass) { - pClass->StartSharedLaunchFlow(); -} - else - { - 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) - { -#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_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_checkboxes[eLaunchCheckbox_DisableSaving].init( app.GetString(IDS_DISABLE_SAVING), eLaunchCheckbox_DisableSaving, m_params->bDisableSaving ); -#endif + 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_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_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_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_NAME( m_funcChangeTab, L"ChangeTab") - } - else - { UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Online], "CheckboxOnline") UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_InviteOnly], "CheckboxInviteOnly") UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_AllowFoF], "CheckboxAllowFoF") UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_PVP], "CheckboxPVP") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_HostPrivileges], "CheckboxHostPrivileges") + 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_checkboxes[eLaunchCheckbox_Structures], "CheckboxStructures") + 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_checkboxes[eLaunchCheckbox_HostPrivileges], "CheckboxHostPrivileges") - UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_ResetNether], "CheckboxResetNether") - UI_MAP_ELEMENT( m_labelWorldOptions, "WorldOptions") - UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Structures], "CheckboxStructures") - UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_FlatWorld], "CheckboxFlatWorld") - UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_BonusChest], "CheckboxBonusChest") - } - - UI_MAP_ELEMENT( m_labelDescription, "Description") + UI_MAP_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 bb399b97..92f2a403 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; + 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; } - else - { - app.DebugPrintf("Thumbnail data is NULL, or has size 0\n"); - pClass->m_bThumbnailGetFailed = true; - } - 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); + + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_iPad) == false) { - // Set up online game checkbox - bool bOnlineGame = m_MoreOptionsParams.bOnlineGame; - m_checkboxOnline.SetEnable(true); - - // 4J-PB - to stop an offline game being able to select the online flag - if(ProfileManager.IsSignedInLive(m_iPad) == false) - { - m_checkboxOnline.SetEnable(false); - } - - if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) - { - m_checkboxOnline.SetEnable(false); - bOnlineGame = false; - } - - m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); + m_checkboxOnline.SetEnable(false); } -#endif + + if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + m_checkboxOnline.SetEnable(false); + bOnlineGame = false; + } + + 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 #ifdef _WINDOWS64 @@ -467,6 +476,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 @@ -474,6 +503,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) { @@ -484,11 +518,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)) @@ -555,7 +605,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; @@ -609,7 +659,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 @@ -620,23 +670,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) - { - m_MoreOptionsParams.bOnlineGame = bOnlineGame; - if (!m_MoreOptionsParams.bOnlineGame) - { - m_MoreOptionsParams.bInviteOnly = false; - m_MoreOptionsParams.bAllowFriendsOfFriends = false; - } + bool bOnlineGame = m_checkboxOnline.IsChecked(); + if (m_MoreOptionsParams.bOnlineGame != bOnlineGame) + { + m_MoreOptionsParams.bOnlineGame = bOnlineGame; + + if (!m_MoreOptionsParams.bOnlineGame) + { + m_MoreOptionsParams.bInviteOnly = false; + m_MoreOptionsParams.bAllowFriendsOfFriends = false; } } -#endif + handled = true; break; } @@ -652,16 +698,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); @@ -739,7 +795,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; } } @@ -809,13 +865,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__ @@ -825,11 +881,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 @@ -844,7 +934,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 { @@ -915,13 +1005,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; } @@ -998,17 +1084,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 { @@ -1022,7 +1108,8 @@ void UIScene_LoadMenu::LaunchGame(void) if(m_levelGen != NULL) { - LoadLevelGen(m_levelGen); + m_bIsCorrupt = false; + LoadDataComplete(this); } else { @@ -1042,7 +1129,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 @@ -1051,20 +1138,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 { @@ -1083,7 +1171,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 } @@ -1123,7 +1211,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 { @@ -1142,9 +1231,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 @@ -1193,7 +1282,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 { @@ -1201,14 +1290,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 } @@ -1267,6 +1356,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(); @@ -1327,6 +1425,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(); @@ -1367,7 +1474,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); } @@ -1379,6 +1486,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); @@ -1392,8 +1507,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 } @@ -1437,9 +1553,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__ @@ -1456,7 +1581,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; param->levelName = pClass->m_levelName; @@ -1478,12 +1604,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); @@ -1519,7 +1659,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 { @@ -1527,113 +1667,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; @@ -1681,7 +1714,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 { @@ -1689,14 +1722,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 } @@ -1717,7 +1750,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 { @@ -1725,7 +1758,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 @@ -1765,13 +1798,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 e245e3be..085cb67f 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; @@ -105,7 +102,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 e3749dcb..a5cb9aa2 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 @@ -121,6 +121,7 @@ static wstring ReadLevelNameFromSaveFile(const wstring& filePath) #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 @@ -195,9 +196,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 ); @@ -375,13 +376,8 @@ UIScene_LoadOrJoinMenu::~UIScene_LoadOrJoinMenu() g_NetworkManager.SetSessionsUpdatedCallback( NULL, NULL ); app.SetLiveLinkRequired( false ); - if(m_currentSessions) - { - for(AUTO_VAR(it, m_currentSessions->begin()); it < m_currentSessions->end(); ++it) - { - delete (*it); - } - } + delete m_currentSessions; + m_currentSessions = NULL; #if TO_BE_IMPLEMENTED // Reset the background downloading, in case we changed it by attempting to download a texture pack @@ -400,6 +396,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 @@ -640,6 +644,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 { @@ -652,6 +658,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) { @@ -917,7 +928,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 @@ -1038,7 +1049,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; @@ -1061,8 +1072,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) { @@ -1147,7 +1160,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; } @@ -1160,7 +1173,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 { @@ -1203,7 +1216,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 { @@ -1225,7 +1238,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 { @@ -1234,7 +1247,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); @@ -1435,7 +1448,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 @@ -1466,7 +1479,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 @@ -1553,7 +1566,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 ); @@ -1582,16 +1595,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 @@ -1656,10 +1679,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 ); @@ -2267,7 +2299,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; @@ -2278,7 +2310,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 @@ -2289,7 +2321,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 @@ -2306,6 +2338,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; @@ -2315,24 +2432,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 @@ -2350,7 +2496,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 @@ -2398,8 +2544,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 @@ -2519,9 +2664,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; @@ -2558,14 +2708,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; @@ -2588,7 +2748,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); @@ -2748,7 +2912,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); @@ -2810,7 +2976,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; @@ -2851,19 +3017,19 @@ 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; + // 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 - { - app.DebugPrintf("StorageManager.DeleteSaveData failed!!\n"); - pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; - } - } } else { @@ -2885,7 +3051,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. @@ -2897,14 +3081,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; } @@ -3029,7 +3215,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; @@ -3046,7 +3232,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; } } @@ -3069,7 +3255,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 @@ -3196,8 +3382,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: { @@ -3220,7 +3416,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; } @@ -3610,12 +3827,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 c909fbc6..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) { @@ -335,12 +360,15 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) signInReturnedFunc = &UIScene_MainMenu::UnlockFullGame_SignInReturned; break; case eControl_Exit: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + if( ProfileManager.IsFullVersion() ) - { + { UINT uiIDA[2]; uiIDA[0]=IDS_CANCEL; uiIDA[1]=IDS_OK; - ui.RequestMessageBox(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); + ui.RequestErrorMessage(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); } else { @@ -387,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); } } } @@ -554,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 @@ -601,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; @@ -618,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 @@ -659,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; @@ -682,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 { @@ -720,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 { @@ -738,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 { @@ -801,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 } } @@ -815,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 } } @@ -866,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; @@ -881,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 { @@ -897,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 @@ -910,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); } } } @@ -932,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; @@ -962,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; @@ -992,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; @@ -1093,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; } @@ -1120,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); } } } @@ -1185,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; } @@ -1210,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); } } } @@ -1254,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 { @@ -1305,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 { @@ -1327,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__ @@ -1346,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 { @@ -1355,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 @@ -1363,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 @@ -1435,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 } } @@ -1479,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)) { @@ -1488,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__ @@ -1519,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 @@ -1548,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 @@ -1564,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); } } } @@ -1623,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; } @@ -1634,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 { @@ -1653,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 @@ -1666,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 @@ -1707,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" @@ -1719,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 } } @@ -1742,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)) { @@ -1751,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" @@ -1763,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 } @@ -1802,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) { @@ -1820,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 { @@ -1848,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); } } @@ -1856,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 @@ -1879,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; @@ -1904,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 { @@ -1919,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 { @@ -1935,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 @@ -1973,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); @@ -2018,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_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp index 1234121e..9bf3b983 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp @@ -1,11 +1,14 @@ #include "stdafx.h" #include "UI.h" #include "UIScene_SettingsGraphicsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\GameRenderer.h" UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { // Setup all the Iggy references we need for this scene initialiseMovie(); + Minecraft* pMinecraft = Minecraft::GetInstance(); m_bNotInGame=(Minecraft::GetInstance()->level==NULL); @@ -18,6 +21,9 @@ UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initD swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),app.GetGameSettings(m_iPad,eGameSetting_Gamma)); m_sliderGamma.init(TempString,eControl_Gamma,0,100,app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + + swprintf((WCHAR*)TempString, 256, L"FOV: %d%%", (int)pMinecraft->gameRenderer->GetFovVal()); + m_sliderFOV.init(TempString, eControl_FOV, 70, 110, (int)pMinecraft->gameRenderer->GetFovVal()); swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); m_sliderInterfaceOpacity.init(TempString,eControl_InterfaceOpacity,0,100,app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); @@ -141,6 +147,17 @@ void UIScene_SettingsGraphicsMenu::handleSliderMove(F64 sliderId, F64 currentVal m_sliderGamma.setLabel(TempString); break; + + case eControl_FOV: + { + Minecraft* pMinecraft = Minecraft::GetInstance(); + pMinecraft->gameRenderer->SetFovVal((float)currentValue); + WCHAR TempString[256]; + swprintf((WCHAR*)TempString, 256, L"FOV: %d%%", (int)currentValue); + m_sliderFOV.setLabel(TempString); + } + break; + case eControl_InterfaceOpacity: m_sliderInterfaceOpacity.handleSliderMove(value); diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h index e9c4905c..c6e1e394 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h @@ -11,16 +11,18 @@ private: eControl_BedrockFog, eControl_CustomSkinAnim, eControl_Gamma, + eControl_FOV, eControl_InterfaceOpacity }; UIControl_CheckBox m_checkboxClouds, m_checkboxBedrockFog, m_checkboxCustomSkinAnim; // Checkboxes - UIControl_Slider m_sliderGamma, m_sliderInterfaceOpacity; // Sliders + UIControl_Slider m_sliderGamma, m_sliderFOV, m_sliderInterfaceOpacity; // Sliders UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) UI_MAP_ELEMENT( m_checkboxClouds, "Clouds") UI_MAP_ELEMENT( m_checkboxBedrockFog, "BedrockFog") UI_MAP_ELEMENT( m_checkboxCustomSkinAnim, "CustomSkinAnim") UI_MAP_ELEMENT( m_sliderGamma, "Gamma") + UI_MAP_ELEMENT(m_sliderFOV, "FOV") UI_MAP_ELEMENT( m_sliderInterfaceOpacity, "InterfaceOpacity") UI_END_MAP_ELEMENTS_AND_NAMES() 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 bOnlineSettingChangedBySystem; + bool bMobGriefing; + bool bKeepInventory; + bool bDoMobSpawning; + bool bDoMobLoot; + bool bDoTileDrops; + bool bNaturalRegeneration; + bool bDoDaylightCycle; + + 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..4119e5b9 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) @@ -75,12 +77,7 @@ void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float w glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1, 0, 0, 0.5f); -#ifdef __PSVITA__ - // AP - not sure that the usecompiled flag is supposed to be false. This makes it really slow on vita. Making it true still seems to look the same model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); -#else - model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, false); -#endif glEnable(GL_TEXTURE_2D); glDisable(GL_BLEND); glDepthFunc(GL_LEQUAL); @@ -91,12 +88,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 +127,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 +159,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 +224,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 +235,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); + 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; + 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); + 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; + // 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->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)); + 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, 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->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(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->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) + 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/Extrax64Stubs.cpp b/Minecraft.Client/Extrax64Stubs.cpp index f6ad76c1..5a3c5279 100644 --- a/Minecraft.Client/Extrax64Stubs.cpp +++ b/Minecraft.Client/Extrax64Stubs.cpp @@ -20,6 +20,7 @@ #include "StatsCounter.h" #include "Windows64\Social\SocialManager.h" #include "Windows64\Sentient\DynamicConfigurations.h" +#include "Windows64\Network\WinsockNetLayer.h" #elif defined __PSVITA__ #include "PSVita\Sentient\SentientManager.h" #include "StatsCounter.h" @@ -46,63 +47,63 @@ CXuiStringTable StringTable; #ifndef _XBOX_ONE ATG::XMLParser::XMLParser() {} ATG::XMLParser::~XMLParser() {} -HRESULT ATG::XMLParser::ParseXMLBuffer( CONST CHAR* strBuffer, UINT uBufferSize ) { return S_OK; } -VOID ATG::XMLParser::RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ) {} +HRESULT ATG::XMLParser::ParseXMLBuffer(CONST CHAR* strBuffer, UINT uBufferSize) { return S_OK; } +VOID ATG::XMLParser::RegisterSAXCallbackInterface(ISAXCallback* pISAXCallback) {} #endif bool CSocialManager::IsTitleAllowedToPostAnything() { return false; } bool CSocialManager::AreAllUsersAllowedToPostImages() { return false; } bool CSocialManager::IsTitleAllowedToPostImages() { return false; } -bool CSocialManager::PostLinkToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ) { return false; } -bool CSocialManager::PostImageToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ) { return false; } -CSocialManager *CSocialManager::Instance() { return NULL; } +bool CSocialManager::PostLinkToSocialNetwork(ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect) { return false; } +bool CSocialManager::PostImageToSocialNetwork(ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect) { return false; } +CSocialManager* CSocialManager::Instance() { return NULL; } void CSocialManager::SetSocialPostText(LPCWSTR Title, LPCWSTR Caption, LPCWSTR Desc) {}; DWORD XShowPartyUI(DWORD dwUserIndex) { return 0; } DWORD XShowFriendsUI(DWORD dwUserIndex) { return 0; } -HRESULT XPartyGetUserList(XPARTY_USER_LIST *pUserList) { return S_OK; } -DWORD XContentGetThumbnail(DWORD dwUserIndex, const XCONTENT_DATA *pContentData, PBYTE pbThumbnail, PDWORD pcbThumbnail, PXOVERLAPPED *pOverlapped) { return 0; } +HRESULT XPartyGetUserList(XPARTY_USER_LIST* pUserList) { return S_OK; } +DWORD XContentGetThumbnail(DWORD dwUserIndex, const XCONTENT_DATA* pContentData, PBYTE pbThumbnail, PDWORD pcbThumbnail, PXOVERLAPPED* pOverlapped) { return 0; } void XShowAchievementsUI(int i) {} DWORD XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE Mode) { return 0; } #ifndef _DURANGO -void PIXAddNamedCounter(int a, char *b, ...) {} +void PIXAddNamedCounter(int a, char* b, ...) {} //#define PS3_USE_PIX_EVENTS //#define PS4_USE_PIX_EVENTS -void PIXBeginNamedEvent(int a, char *b, ...) +void PIXBeginNamedEvent(int a, char* b, ...) { #ifdef PS4_USE_PIX_EVENTS char buf[512]; - va_list args; - va_start(args,b); - vsprintf(buf,b,args); + va_list args; + va_start(args, b); + vsprintf(buf, b, args); sceRazorCpuPushMarker(buf, 0xffffffff, SCE_RAZOR_MARKER_ENABLE_HUD); #endif #ifdef PS3_USE_PIX_EVENTS char buf[256]; wchar_t wbuf[256]; - va_list args; - va_start(args,b); - vsprintf(buf,b,args); + va_list args; + va_start(args, b); + vsprintf(buf, b, args); snPushMarker(buf); -// mbstowcs(wbuf,buf,256); -// RenderManager.BeginEvent(wbuf); - va_end(args); + // mbstowcs(wbuf,buf,256); + // RenderManager.BeginEvent(wbuf); + va_end(args); #endif } #if 0//__PSVITA__ - if( PixDepth < 64 ) - { - char buf[512]; - va_list args; - va_start(args,b); - vsprintf(buf,b,args); - sceRazorCpuPushMarkerWithHud(buf, 0xffffffff, SCE_RAZOR_MARKER_ENABLE_HUD); - } - PixDepth += 1; +if (PixDepth < 64) +{ + char buf[512]; + va_list args; + va_start(args, b); + vsprintf(buf, b, args); + sceRazorCpuPushMarkerWithHud(buf, 0xffffffff, SCE_RAZOR_MARKER_ENABLE_HUD); +} +PixDepth += 1; #endif @@ -113,17 +114,17 @@ void PIXEndNamedEvent() #endif #ifdef PS3_USE_PIX_EVENTS snPopMarker(); -// RenderManager.EndEvent(); + // RenderManager.EndEvent(); #endif #if 0//__PSVITA__ - if( PixDepth <= 64 ) + if (PixDepth <= 64) { sceRazorCpuPopMarker(); } PixDepth -= 1; #endif } -void PIXSetMarkerDeprecated(int a, char *b, ...) {} +void PIXSetMarkerDeprecated(int a, char* b, ...) {} #else // 4J Stu - Removed this implementation in favour of a macro that will convert our string format // conversion at compile time rather than at runtime @@ -175,38 +176,33 @@ bool IsEqualXUID(PlayerUID a, PlayerUID b) #endif } -void XMemCpy(void *a, const void *b, size_t s) { memcpy(a, b, s); } -void XMemSet(void *a, int t, size_t s) { memset(a, t, s); } -void XMemSet128(void *a, int t, size_t s) { memset(a, t, s); } -void *XPhysicalAlloc(SIZE_T a, ULONG_PTR b, ULONG_PTR c, DWORD d) { return malloc(a); } -void XPhysicalFree(void *a) { free(a); } +void XMemCpy(void* a, const void* b, size_t s) { memcpy(a, b, s); } +void XMemSet(void* a, int t, size_t s) { memset(a, t, s); } +void XMemSet128(void* a, int t, size_t s) { memset(a, t, s); } +void* XPhysicalAlloc(SIZE_T a, ULONG_PTR b, ULONG_PTR c, DWORD d) { return malloc(a); } +void XPhysicalFree(void* a) { free(a); } D3DXVECTOR3::D3DXVECTOR3() {} -D3DXVECTOR3::D3DXVECTOR3(float x,float y,float z) : x(x), y(y), z(z) {} -D3DXVECTOR3& D3DXVECTOR3::operator += ( CONST D3DXVECTOR3& add ) { x += add.x; y += add.y; z += add.z; return *this; } +D3DXVECTOR3::D3DXVECTOR3(float x, float y, float z) : x(x), y(y), z(z) {} +D3DXVECTOR3& D3DXVECTOR3::operator += (CONST D3DXVECTOR3 & add) { x += add.x; y += add.y; z += add.z; return *this; } -BYTE IQNetPlayer::GetSmallId() { return 0; } -void IQNetPlayer::SendData(IQNetPlayer *player, const void *pvData, DWORD dwDataSize, DWORD dwFlags) +BYTE IQNetPlayer::GetSmallId() { return m_smallId; } +void IQNetPlayer::SendData(IQNetPlayer * player, const void* pvData, DWORD dwDataSize, DWORD dwFlags) { - app.DebugPrintf("Sending from 0x%x to 0x%x %d bytes\n",this,player,dwDataSize); + if (WinsockNetLayer::IsActive()) + { + WinsockNetLayer::SendToSmallId(player->m_smallId, pvData, dwDataSize); + } } -bool IQNetPlayer::IsSameSystem(IQNetPlayer *player) { return true; } -DWORD IQNetPlayer::GetSendQueueSize( IQNetPlayer *player, DWORD dwFlags ) { return 0; } +bool IQNetPlayer::IsSameSystem(IQNetPlayer * player) { return (this == player) || (!m_isRemote && !player->m_isRemote); } +DWORD IQNetPlayer::GetSendQueueSize(IQNetPlayer * player, DWORD dwFlags) { return 0; } DWORD IQNetPlayer::GetCurrentRtt() { return 0; } -bool IQNetPlayer::IsHost() { return this == &IQNet::m_player[0]; } +bool IQNetPlayer::IsHost() { return m_isHostPlayer; } bool IQNetPlayer::IsGuest() { return false; } -bool IQNetPlayer::IsLocal() { return true; } -PlayerUID IQNetPlayer::GetXuid() { return INVALID_XUID; } -LPCWSTR IQNetPlayer::GetGamertag() -{ - static wchar_t tags[4][16]; - int idx = GetUserIndex(); - if(idx < 0 || idx >= 4) idx = 0; - mbstowcs(tags[idx], ProfileManager.GetGamertag(idx), 15); - tags[idx][15] = L'\0'; - return tags[idx]; -} -int IQNetPlayer::GetSessionIndex() { return 0; } +bool IQNetPlayer::IsLocal() { return !m_isRemote; } +PlayerUID IQNetPlayer::GetXuid() { return (PlayerUID)(0xe000d45248242f2e + m_smallId); } // todo: restore to INVALID_XUID once saves support this +LPCWSTR IQNetPlayer::GetGamertag() { return m_gamertag; } +int IQNetPlayer::GetSessionIndex() { return m_smallId; } bool IQNetPlayer::IsTalking() { return false; } bool IQNetPlayer::IsMutedByLocalUser(DWORD dwUserIndex) { return false; } bool IQNetPlayer::HasVoice() { return false; } @@ -219,22 +215,121 @@ ULONG_PTR IQNetPlayer::GetCustomDataValue() { return m_customData; } -IQNetPlayer IQNet::m_player[4]; +IQNetPlayer IQNet::m_player[MINECRAFT_NET_MAX_PLAYERS]; +DWORD IQNet::s_playerCount = 1; +bool IQNet::s_isHosting = true; -bool _bQNetStubGameRunning = false; +QNET_STATE _iQNetStubState = QNET_STATE_IDLE; -HRESULT IQNet::AddLocalPlayerByUserIndex(DWORD dwUserIndex){ return S_OK; } -IQNetPlayer *IQNet::GetHostPlayer() { return &m_player[0]; } -IQNetPlayer *IQNet::GetLocalPlayerByUserIndex(DWORD dwUserIndex) { return &m_player[dwUserIndex]; } -IQNetPlayer *IQNet::GetPlayerByIndex(DWORD dwPlayerIndex) { return &m_player[0]; } -IQNetPlayer *IQNet::GetPlayerBySmallId(BYTE SmallId){ return &m_player[0]; } -IQNetPlayer *IQNet::GetPlayerByXuid(PlayerUID xuid){ return &m_player[0]; } -DWORD IQNet::GetPlayerCount() { return 1; } -QNET_STATE IQNet::GetState() { return _bQNetStubGameRunning ? QNET_STATE_GAME_PLAY : QNET_STATE_IDLE; } -bool IQNet::IsHost() { return true; } -HRESULT IQNet::JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO *pInviteInfo) { return S_OK; } -void IQNet::HostGame() { _bQNetStubGameRunning = true; } -void IQNet::EndGame() { _bQNetStubGameRunning = false; } +void Win64_SetupRemoteQNetPlayer(IQNetPlayer * player, BYTE smallId, bool isHost, bool isLocal) +{ + player->m_smallId = smallId; + player->m_isRemote = !isLocal; + player->m_isHostPlayer = isHost; + swprintf_s(player->m_gamertag, 32, L"Player%d", smallId); + if (smallId >= IQNet::s_playerCount) + IQNet::s_playerCount = smallId + 1; +} + +static bool Win64_IsActivePlayer(IQNetPlayer* p, DWORD index); + +HRESULT IQNet::AddLocalPlayerByUserIndex(DWORD dwUserIndex) { return S_OK; } +IQNetPlayer* IQNet::GetHostPlayer() { return &m_player[0]; } +IQNetPlayer* IQNet::GetLocalPlayerByUserIndex(DWORD dwUserIndex) +{ + if (s_isHosting) + { + if (dwUserIndex < MINECRAFT_NET_MAX_PLAYERS && + !m_player[dwUserIndex].m_isRemote && + Win64_IsActivePlayer(&m_player[dwUserIndex], dwUserIndex)) + return &m_player[dwUserIndex]; + return NULL; + } + if (dwUserIndex != 0) + return NULL; + for (DWORD i = 0; i < s_playerCount; i++) + { + if (!m_player[i].m_isRemote && Win64_IsActivePlayer(&m_player[i], i)) + return &m_player[i]; + } + return NULL; +} +static bool Win64_IsActivePlayer(IQNetPlayer * p, DWORD index) +{ + if (index == 0) return true; + return (p->GetCustomDataValue() != 0); +} + +IQNetPlayer* IQNet::GetPlayerByIndex(DWORD dwPlayerIndex) +{ + DWORD found = 0; + for (DWORD i = 0; i < s_playerCount; i++) + { + if (Win64_IsActivePlayer(&m_player[i], i)) + { + if (found == dwPlayerIndex) return &m_player[i]; + found++; + } + } + return &m_player[0]; +} +IQNetPlayer* IQNet::GetPlayerBySmallId(BYTE SmallId) +{ + for (DWORD i = 0; i < s_playerCount; i++) + { + if (m_player[i].m_smallId == SmallId && Win64_IsActivePlayer(&m_player[i], i)) return &m_player[i]; + } + return NULL; +} +IQNetPlayer* IQNet::GetPlayerByXuid(PlayerUID xuid) +{ + for (DWORD i = 0; i < s_playerCount; i++) + { + if (Win64_IsActivePlayer(&m_player[i], i) && m_player[i].GetXuid() == xuid) return &m_player[i]; + } + return &m_player[0]; +} +DWORD IQNet::GetPlayerCount() +{ + DWORD count = 0; + for (DWORD i = 0; i < s_playerCount; i++) + { + if (Win64_IsActivePlayer(&m_player[i], i)) count++; + } + return count; +} +QNET_STATE IQNet::GetState() { return _iQNetStubState; } +bool IQNet::IsHost() { return s_isHosting; } +HRESULT IQNet::JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO * pInviteInfo) { return S_OK; } +void IQNet::HostGame() { _iQNetStubState = QNET_STATE_SESSION_STARTING; s_isHosting = true; } +void IQNet::ClientJoinGame() +{ + _iQNetStubState = QNET_STATE_SESSION_STARTING; + s_isHosting = false; + + for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++) + { + m_player[i].m_smallId = (BYTE)i; + m_player[i].m_isRemote = true; + m_player[i].m_isHostPlayer = false; + m_player[i].m_gamertag[0] = 0; + m_player[i].SetCustomDataValue(0); + } +} +void IQNet::EndGame() +{ + _iQNetStubState = QNET_STATE_IDLE; + s_isHosting = false; + s_playerCount = 1; + for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++) + { + m_player[i].m_smallId = (BYTE)i; + m_player[i].m_isRemote = false; + m_player[i].m_isHostPlayer = false; + m_player[i].m_gamertag[0] = 0; + m_player[i].SetCustomDataValue(0); + } +} DWORD MinecraftDynamicConfigurations::GetTrialTime() { return DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; } @@ -244,9 +339,9 @@ void XSetThreadProcessor(HANDLE a, int b) {} // #endif // __PS3__ DWORD XUserGetSigninInfo( - DWORD dwUserIndex, - DWORD dwFlags, - PXUSER_SIGNIN_INFO pSigninInfo + DWORD dwUserIndex, + DWORD dwFlags, + PXUSER_SIGNIN_INFO pSigninInfo ) { return 0; @@ -257,16 +352,16 @@ LPCWSTR CXuiStringTable::Lookup(UINT nIndex) { return L"String"; } void CXuiStringTable::Clear() {} HRESULT CXuiStringTable::Load(LPCWSTR szId) { return S_OK; } -DWORD XUserAreUsersFriends( DWORD dwUserIndex, PPlayerUID pXuids, DWORD dwXuidCount, PBOOL pfResult, void *pOverlapped) { return 0; } +DWORD XUserAreUsersFriends(DWORD dwUserIndex, PPlayerUID pXuids, DWORD dwXuidCount, PBOOL pfResult, void* pOverlapped) { return 0; } #if defined __ORBIS__ || defined __PS3__ || defined _XBOX_ONE #else HRESULT XMemDecompress( - XMEMDECOMPRESSION_CONTEXT Context, - VOID *pDestination, - SIZE_T *pDestSize, - CONST VOID *pSource, - SIZE_T SrcSize + XMEMDECOMPRESSION_CONTEXT Context, + VOID * pDestination, + SIZE_T * pDestSize, + CONST VOID * pSource, + SIZE_T SrcSize ) { memcpy(pDestination, pSource, SrcSize); @@ -276,12 +371,12 @@ HRESULT XMemDecompress( /* DECOMPRESSOR_HANDLE Decompressor = (DECOMPRESSOR_HANDLE)Context; if( Decompress( - Decompressor, // Decompressor handle - (void *)pSource, // Compressed data - SrcSize, // Compressed data size - pDestination, // Decompressed buffer - *pDestSize, // Decompressed buffer size - pDestSize) ) // Decompressed data size + Decompressor, // Decompressor handle + (void *)pSource, // Compressed data + SrcSize, // Compressed data size + pDestination, // Decompressed buffer + *pDestSize, // Decompressed buffer size + pDestSize) ) // Decompressed data size { return S_OK; } @@ -293,11 +388,11 @@ HRESULT XMemDecompress( } HRESULT XMemCompress( - XMEMCOMPRESSION_CONTEXT Context, - VOID *pDestination, - SIZE_T *pDestSize, - CONST VOID *pSource, - SIZE_T SrcSize + XMEMCOMPRESSION_CONTEXT Context, + VOID * pDestination, + SIZE_T * pDestSize, + CONST VOID * pSource, + SIZE_T SrcSize ) { memcpy(pDestination, pSource, SrcSize); @@ -324,10 +419,10 @@ HRESULT XMemCompress( } HRESULT XMemCreateCompressionContext( - XMEMCODEC_TYPE CodecType, - CONST VOID *pCodecParams, - DWORD Flags, - XMEMCOMPRESSION_CONTEXT *pContext + XMEMCODEC_TYPE CodecType, + CONST VOID * pCodecParams, + DWORD Flags, + XMEMCOMPRESSION_CONTEXT * pContext ) { /* @@ -345,10 +440,10 @@ HRESULT XMemCreateCompressionContext( } HRESULT XMemCreateDecompressionContext( - XMEMCODEC_TYPE CodecType, - CONST VOID *pCodecParams, - DWORD Flags, - XMEMDECOMPRESSION_CONTEXT *pContext + XMEMCODEC_TYPE CodecType, + CONST VOID * pCodecParams, + DWORD Flags, + XMEMDECOMPRESSION_CONTEXT * pContext ) { /* @@ -367,14 +462,14 @@ HRESULT XMemCreateDecompressionContext( void XMemDestroyCompressionContext(XMEMCOMPRESSION_CONTEXT Context) { -// COMPRESSOR_HANDLE Compressor = (COMPRESSOR_HANDLE)Context; -// CloseCompressor(Compressor); + // COMPRESSOR_HANDLE Compressor = (COMPRESSOR_HANDLE)Context; + // CloseCompressor(Compressor); } void XMemDestroyDecompressionContext(XMEMDECOMPRESSION_CONTEXT Context) { -// DECOMPRESSOR_HANDLE Decompressor = (DECOMPRESSOR_HANDLE)Context; -// CloseDecompressor(Decompressor); + // DECOMPRESSOR_HANDLE Decompressor = (DECOMPRESSOR_HANDLE)Context; + // CloseDecompressor(Decompressor); } #endif @@ -389,62 +484,62 @@ DWORD XEnableGuestSignin(BOOL fEnable) { return 0; } /////////////////////////////////////////////// Profile library #ifdef _WINDOWS64 -static void *profileData[4]; +static void* profileData[4]; static bool s_bProfileIsFullVersion; -void C_4JProfile::Initialise( DWORD dwTitleID, - DWORD dwOfferID, - unsigned short usProfileVersion, - UINT uiProfileValuesC, - UINT uiProfileSettingsC, - DWORD *pdwProfileSettingsA, - int iGameDefinedDataSizeX4, - unsigned int *puiGameDefinedDataChangedBitmask) +void C_4JProfile::Initialise(DWORD dwTitleID, + DWORD dwOfferID, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD * pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int* puiGameDefinedDataChangedBitmask) { - for( int i = 0; i < 4; i++ ) + for (int i = 0; i < 4; i++) { - profileData[i] = new byte[iGameDefinedDataSizeX4/4]; - ZeroMemory(profileData[i],sizeof(byte)*iGameDefinedDataSizeX4/4); + profileData[i] = new byte[iGameDefinedDataSizeX4 / 4]; + ZeroMemory(profileData[i], sizeof(byte) * iGameDefinedDataSizeX4 / 4); // Set some sane initial values! - GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)profileData[i]; - pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu - pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu - pGameSettings->usBitmaskValues|=0x0200; //eGameSetting_DisplaySplitscreenGamertags - on - pGameSettings->usBitmaskValues|=0x0400; //eGameSetting_Hints - on - pGameSettings->usBitmaskValues|=0x1000; //eGameSetting_Autosave - 2 - pGameSettings->usBitmaskValues|=0x8000; //eGameSetting_Tooltips - on - pGameSettings->uiBitmaskValues=0L; // reset - pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on - pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on - pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on - pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) - pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off - pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on - pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on - pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on - pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on - pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 - pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 - pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + GAME_SETTINGS* pGameSettings = (GAME_SETTINGS*)profileData[i]; + pGameSettings->ucMenuSensitivity = 100; //eGameSetting_Sensitivity_InMenu + pGameSettings->ucInterfaceOpacity = 80; //eGameSetting_Sensitivity_InMenu + pGameSettings->usBitmaskValues |= 0x0200; //eGameSetting_DisplaySplitscreenGamertags - on + pGameSettings->usBitmaskValues |= 0x0400; //eGameSetting_Hints - on + pGameSettings->usBitmaskValues |= 0x1000; //eGameSetting_Autosave - 2 + pGameSettings->usBitmaskValues |= 0x8000; //eGameSetting_Tooltips - on + pGameSettings->uiBitmaskValues = 0L; // reset + pGameSettings->uiBitmaskValues |= GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues |= GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + pGameSettings->uiBitmaskValues |= GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues |= GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + pGameSettings->uiBitmaskValues &= ~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues |= GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues |= GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + pGameSettings->uiBitmaskValues |= GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + pGameSettings->uiBitmaskValues |= GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues |= (GAMESETTING_UISIZE & 0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues |= (GAMESETTING_UISIZE_SPLITSCREEN & 0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues |= GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on // TU12 // favorite skins added, but only set in TU12 - set to FFs - for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + pGameSettings->uiFavoriteSkinA[i] = 0xFFFFFFFF; } - pGameSettings->ucCurrentFavoriteSkinPos=0; + pGameSettings->ucCurrentFavoriteSkinPos = 0; // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; // PS3DEC13 - pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + pGameSettings->uiBitmaskValues &= ~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off // PS3 1.05 - added Greek pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language // PS Vita - network mode added - pGameSettings->uiBitmaskValues&=~GAMESETTING_PSVITANETWORKMODEADHOC; //eGameSetting_PSVita_NetworkModeAdhoc - off + pGameSettings->uiBitmaskValues &= ~GAMESETTING_PSVITANETWORKMODEADHOC; //eGameSetting_PSVita_NetworkModeAdhoc - off // Tutorials for most menus, and a few other things @@ -453,90 +548,90 @@ void C_4JProfile::Initialise( DWORD dwTitleID, pGameSettings->ucTutorialCompletion[2] = 0xF; // Has gone halfway through the tutorial - pGameSettings->ucTutorialCompletion[28] |= 1<<0; + pGameSettings->ucTutorialCompletion[28] |= 1 << 0; } } -void C_4JProfile::SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject) {} -void C_4JProfile::SetTrialAwardText(eAwardType AwardType,int iTitle,int iText) {} +void C_4JProfile::SetTrialTextStringTable(CXuiStringTable * pStringTable, int iAccept, int iReject) {} +void C_4JProfile::SetTrialAwardText(eAwardType AwardType, int iTitle, int iText) {} int C_4JProfile::GetLockedProfile() { return 0; } void C_4JProfile::SetLockedProfile(int iProf) {} -bool C_4JProfile::IsSignedIn(int iQuadrant) { return ( iQuadrant == 0); } +bool C_4JProfile::IsSignedIn(int iQuadrant) { return (iQuadrant == 0); } bool C_4JProfile::IsSignedInLive(int iProf) { return true; } bool C_4JProfile::IsGuest(int iQuadrant) { return false; } -UINT C_4JProfile::RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant) { return 0; } -UINT C_4JProfile::DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant) { return 0; } -UINT C_4JProfile::RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant) { return 0; } +UINT C_4JProfile::RequestSignInUI(bool bFromInvite, bool bLocalGame, bool bNoGuestsAllowed, bool bMultiplayerSignIn, bool bAddUser, int(*Func)(LPVOID, const bool, const int iPad), LPVOID lpParam, int iQuadrant) { return 0; } +UINT C_4JProfile::DisplayOfflineProfile(int(*Func)(LPVOID, const bool, const int iPad), LPVOID lpParam, int iQuadrant) { return 0; } +UINT C_4JProfile::RequestConvertOfflineToGuestUI(int(*Func)(LPVOID, const bool, const int iPad), LPVOID lpParam, int iQuadrant) { return 0; } void C_4JProfile::SetPrimaryPlayerChanged(bool bVal) {} bool C_4JProfile::QuerySigninStatus(void) { return true; } -void C_4JProfile::GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid) {*pXuid = 0xe000d45248242f2e; } -BOOL C_4JProfile::AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2) { return false; } +void C_4JProfile::GetXUID(int iPad, PlayerUID * pXuid, bool bOnlineXuid) +{ +#ifdef _WINDOWS64 + if (iPad != 0) + { + *pXuid = INVALID_XUID; + return; + } + if (IQNet::s_isHosting) + *pXuid = 0xe000d45248242f2e; + else + *pXuid = 0xe000d45248242f2e + WinsockNetLayer::GetLocalSmallId(); +#else + * pXuid = 0xe000d45248242f2e + iPad; +#endif +} +BOOL C_4JProfile::AreXUIDSEqual(PlayerUID xuid1, PlayerUID xuid2) { return xuid1 == xuid2; } BOOL C_4JProfile::XUIDIsGuest(PlayerUID xuid) { return false; } bool C_4JProfile::AllowedToPlayMultiplayer(int iProf) { return true; } #if defined(__ORBIS__) -bool C_4JProfile::GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly, bool *pbChatRestricted,bool *pbContentRestricted,int *piAge) +bool C_4JProfile::GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly, bool* pbChatRestricted, bool* pbContentRestricted, int* piAge) { - if(pbChatRestricted) *pbChatRestricted = false; - if(pbContentRestricted) *pbContentRestricted = false; - if(piAge) *piAge = 100; + if (pbChatRestricted) *pbChatRestricted = false; + if (pbContentRestricted) *pbContentRestricted = false; + if (piAge) *piAge = 100; return true; } #endif void C_4JProfile::StartTrialGame() {} -void C_4JProfile::AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed) {} -BOOL C_4JProfile::CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ) { return true; } -bool C_4JProfile::GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam) { return false; } +void C_4JProfile::AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL * allAllowed, BOOL * friendsAllowed) {} +BOOL C_4JProfile::CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount) { return true; } +bool C_4JProfile::GetProfileAvatar(int iPad, int(*Func)(LPVOID lpParam, PBYTE pbThumbnail, DWORD dwThumbnailBytes), LPVOID lpParam) { return false; } void C_4JProfile::CancelProfileAvatarRequest() {} int C_4JProfile::GetPrimaryPad() { return 0; } void C_4JProfile::SetPrimaryPad(int iPad) {} #ifdef _DURANGO char fakeGamerTag[32] = "PlayerName"; -void SetFakeGamertag(char *name){ strcpy_s(fakeGamerTag, name); } -char* C_4JProfile::GetGamertag(int iPad){ return fakeGamerTag; } +void SetFakeGamertag(char* name) { strcpy_s(fakeGamerTag, name); } #else -char* C_4JProfile::GetGamertag(int iPad) -{ - static char tags[4][16] = { "Player 1", "Player 2", "Player 3", "Player 4" }; - if(iPad >= 0 && iPad < 4) return tags[iPad]; - return tags[0]; -} -wstring C_4JProfile::GetDisplayName(int iPad) -{ - switch(iPad) - { - case 1: return L"Player 2"; - case 2: return L"Player 3"; - case 3: return L"Player 4"; - default: return L"Player 1"; - } -} +char* C_4JProfile::GetGamertag(int iPad) { extern char g_Win64Username[17]; return g_Win64Username; } +wstring C_4JProfile::GetDisplayName(int iPad) { extern wchar_t g_Win64UsernameW[17]; return g_Win64UsernameW; } #endif bool C_4JProfile::IsFullVersion() { return s_bProfileIsFullVersion; } -void C_4JProfile::SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam) {} -void C_4JProfile::SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam) {} +void C_4JProfile::SetSignInChangeCallback(void (*Func)(LPVOID, bool, unsigned int), LPVOID lpParam) {} +void C_4JProfile::SetNotificationsCallback(void (*Func)(LPVOID, DWORD, unsigned int), LPVOID lpParam) {} bool C_4JProfile::RegionIsNorthAmerica(void) { return false; } bool C_4JProfile::LocaleIsUSorCanada(void) { return false; } HRESULT C_4JProfile::GetLiveConnectionStatus() { return S_OK; } bool C_4JProfile::IsSystemUIDisplayed() { return false; } -void C_4JProfile::SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam) {} -int( *defaultOptionsCallback)(LPVOID,C_4JProfile::PROFILESETTINGS *, const int iPad) = NULL; +void C_4JProfile::SetProfileReadErrorCallback(void (*Func)(LPVOID), LPVOID lpParam) {} +int(*defaultOptionsCallback)(LPVOID, C_4JProfile::PROFILESETTINGS*, const int iPad) = NULL; LPVOID lpProfileParam = NULL; -int C_4JProfile::SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam) +int C_4JProfile::SetDefaultOptionsCallback(int(*Func)(LPVOID, PROFILESETTINGS*, const int iPad), LPVOID lpParam) { defaultOptionsCallback = Func; lpProfileParam = lpParam; return 0; } -int C_4JProfile::SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam) { return 0; } +int C_4JProfile::SetOldProfileVersionCallback(int(*Func)(LPVOID, unsigned char*, const unsigned short, const int), LPVOID lpParam) { return 0; } // To store the dashboard preferences for controller flipped, etc. C_4JProfile::PROFILESETTINGS ProfileSettingsA[XUSER_MAX_COUNT]; -C_4JProfile::PROFILESETTINGS * C_4JProfile::GetDashboardProfileSettings(int iPad) { return &ProfileSettingsA[iPad]; } +C_4JProfile::PROFILESETTINGS* C_4JProfile::GetDashboardProfileSettings(int iPad) { return &ProfileSettingsA[iPad]; } void C_4JProfile::WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged, bool bOverride5MinuteLimitOnProfileWrites) {} void C_4JProfile::ForceQueuedProfileWrites(int iPad) {} -void *C_4JProfile::GetGameDefinedProfileData(int iQuadrant) +void* C_4JProfile::GetGameDefinedProfileData(int iQuadrant) { // 4J Stu - Don't reset the options when we call this!! //defaultOptionsCallback(lpProfileParam, (C_4JProfile::PROFILESETTINGS *)profileData[iQuadrant], iQuadrant); @@ -545,9 +640,10 @@ void *C_4JProfile::GetGameDefinedProfileData(int iQuadrant) return profileData[iQuadrant]; } void C_4JProfile::ResetProfileProcessState() {} -void C_4JProfile::Tick( void ) {} -void C_4JProfile::RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected, - CXuiStringTable*pStringTable, int iTitleStr, int iTextStr, int iAcceptStr, char *pszThemeName, unsigned int ulThemeSize) {} +void C_4JProfile::Tick(void) {} +void C_4JProfile::RegisterAward(int iAwardNumber, int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected, + CXuiStringTable * pStringTable, int iTitleStr, int iTextStr, int iAcceptStr, char* pszThemeName, unsigned int ulThemeSize) { +} int C_4JProfile::GetAwardId(int iAwardNumber) { return 0; } eAwardType C_4JProfile::GetAwardType(int iAwardNumber) { return eAwardType_Achievement; } bool C_4JProfile::CanBeAwarded(int iQuadrant, int iAwardNumber) { return false; } @@ -555,11 +651,11 @@ void C_4JProfile::Award(int iQuadrant, int iAwardNumber, bool bForce) {} bool C_4JProfile::IsAwardsFlagSet(int iQuadrant, int iAward) { return false; } void C_4JProfile::RichPresenceInit(int iPresenceCount, int iContextCount) {} void C_4JProfile::RegisterRichPresenceContext(int iGameConfigContextID) {} -void C_4JProfile::SetRichPresenceContextValue(int iPad,int iContextID, int iVal) {} -void C_4JProfile::SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle) {} +void C_4JProfile::SetRichPresenceContextValue(int iPad, int iContextID, int iVal) {} +void C_4JProfile::SetCurrentGameActivity(int iPad, int iNewPresence, bool bSetOthersToIdle) {} void C_4JProfile::DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam) {} -void C_4JProfile::SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam) {} -void C_4JProfile::SetDebugFullOverride(bool bVal) {s_bProfileIsFullVersion = bVal;} +void C_4JProfile::SetUpsellCallback(void (*Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData), LPVOID lpParam) {} +void C_4JProfile::SetDebugFullOverride(bool bVal) { s_bProfileIsFullVersion = bVal; } void C_4JProfile::ShowProfileCard(int iPad, PlayerUID targetUid) {} /////////////////////////////////////////////// Storage library @@ -567,60 +663,60 @@ void C_4JProfile::ShowProfileCard(int iPad, PlayerUID targetUid) {} #if 0 C4JStorage::C4JStorage() {} void C4JStorage::Tick() {} -C4JStorage::EMessageResult C4JStorage::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) { return C4JStorage::EMessage_Undefined; } -C4JStorage::EMessageResult C4JStorage::GetMessageBoxResult() { return C4JStorage::EMessage_Undefined; } -bool C4JStorage::SetSaveDevice(int( *Func)(LPVOID,const bool),LPVOID lpParam, bool bForceResetOfSaveDevice) { return true; } -void C4JStorage::Init(LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam) {} +C4JStorage::EMessageResult C4JStorage::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) { return C4JStorage::EMessage_Undefined; } +C4JStorage::EMessageResult C4JStorage::GetMessageBoxResult() { return C4JStorage::EMessage_Undefined; } +bool C4JStorage::SetSaveDevice(int(*Func)(LPVOID, const bool), LPVOID lpParam, bool bForceResetOfSaveDevice) { return true; } +void C4JStorage::Init(LPCWSTR pwchDefaultSaveName, char* pszSavePackName, int iMinimumSaveSize, int(*Func)(LPVOID, const ESavingMessage, int), LPVOID lpParam) {} void C4JStorage::ResetSaveData() {} void C4JStorage::SetDefaultSaveNameForKeyboardDisplay(LPCWSTR pwchDefaultSaveName) {} void C4JStorage::SetSaveTitle(LPCWSTR pwchDefaultSaveName) {} LPCWSTR C4JStorage::GetSaveTitle() { return L""; } -bool C4JStorage::GetSaveUniqueNumber(INT *piVal) { return true; } -bool C4JStorage::GetSaveUniqueFilename(char *pszName) { return true; } -void C4JStorage::SetSaveUniqueFilename(char *szFilename) { } -void C4JStorage::SetState(ESaveGameControlState eControlState,int( *Func)(LPVOID,const bool),LPVOID lpParam) {} +bool C4JStorage::GetSaveUniqueNumber(INT * piVal) { return true; } +bool C4JStorage::GetSaveUniqueFilename(char* pszName) { return true; } +void C4JStorage::SetSaveUniqueFilename(char* szFilename) {} +void C4JStorage::SetState(ESaveGameControlState eControlState, int(*Func)(LPVOID, const bool), LPVOID lpParam) {} void C4JStorage::SetSaveDisabled(bool bDisable) {} bool C4JStorage::GetSaveDisabled(void) { return false; } unsigned int C4JStorage::GetSaveSize() { return 0; } -void C4JStorage::GetSaveData(void *pvData,unsigned int *pulBytes) {} +void C4JStorage::GetSaveData(void* pvData, unsigned int* pulBytes) {} PVOID C4JStorage::AllocateSaveData(unsigned int ulBytes) { return new char[ulBytes]; } -void C4JStorage::SaveSaveData(unsigned int ulBytes,PBYTE pbThumbnail,DWORD cbThumbnail,PBYTE pbTextData, DWORD dwTextLen) {} -void C4JStorage::CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam) {} -void C4JStorage::SetSaveDeviceSelected(unsigned int uiPad,bool bSelected) {} +void C4JStorage::SaveSaveData(unsigned int ulBytes, PBYTE pbThumbnail, DWORD cbThumbnail, PBYTE pbTextData, DWORD dwTextLen) {} +void C4JStorage::CopySaveDataToNewSave(PBYTE pbThumbnail, DWORD cbThumbnail, WCHAR * wchNewName, int (*Func)(LPVOID lpParam, bool), LPVOID lpParam) {} +void C4JStorage::SetSaveDeviceSelected(unsigned int uiPad, bool bSelected) {} bool C4JStorage::GetSaveDeviceSelected(unsigned int iPad) { return true; } -C4JStorage::ELoadGameStatus C4JStorage::DoesSaveExist(bool *pbExists) { return C4JStorage::ELoadGame_Idle; } +C4JStorage::ELoadGameStatus C4JStorage::DoesSaveExist(bool* pbExists) { return C4JStorage::ELoadGame_Idle; } bool C4JStorage::EnoughSpaceForAMinSaveGame() { return true; } void C4JStorage::SetSaveMessageVPosition(float fY) {} //C4JStorage::ESGIStatus C4JStorage::GetSavesInfo(int iPad,bool ( *Func)(LPVOID, int, CACHEINFOSTRUCT *, int, HRESULT),LPVOID lpParam,char *pszSavePackName) { return C4JStorage::ESGIStatus_Idle; } -C4JStorage::ESaveGameState C4JStorage::GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName) { return C4JStorage::ESaveGame_Idle; } +C4JStorage::ESaveGameState C4JStorage::GetSavesInfo(int iPad, int (*Func)(LPVOID lpParam, SAVE_DETAILS * pSaveDetails, const bool), LPVOID lpParam, char* pszSavePackName) { return C4JStorage::ESaveGame_Idle; } -void C4JStorage::GetSaveCacheFileInfo(DWORD dwFile,XCONTENT_DATA &xContentData) {} -void C4JStorage::GetSaveCacheFileInfo(DWORD dwFile, PBYTE *ppbImageData, DWORD *pdwImageBytes) {} -C4JStorage::ESaveGameState C4JStorage::LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam) {return C4JStorage::ESaveGame_Idle;} -C4JStorage::EDeleteGameStatus C4JStorage::DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam) { return C4JStorage::EDeleteGame_Idle; } -PSAVE_DETAILS C4JStorage::ReturnSavesInfo() {return NULL;} +void C4JStorage::GetSaveCacheFileInfo(DWORD dwFile, XCONTENT_DATA & xContentData) {} +void C4JStorage::GetSaveCacheFileInfo(DWORD dwFile, PBYTE * ppbImageData, DWORD * pdwImageBytes) {} +C4JStorage::ESaveGameState C4JStorage::LoadSaveData(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, const bool, const bool), LPVOID lpParam) { return C4JStorage::ESaveGame_Idle; } +C4JStorage::EDeleteGameStatus C4JStorage::DeleteSaveData(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, const bool), LPVOID lpParam) { return C4JStorage::EDeleteGame_Idle; } +PSAVE_DETAILS C4JStorage::ReturnSavesInfo() { return NULL; } -void C4JStorage::RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam ) {} -void C4JStorage::SetDLCPackageRoot(char *pszDLCRoot) {} -C4JStorage::EDLCStatus C4JStorage::GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } +void C4JStorage::RegisterMarketplaceCountsCallback(int (*Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS*, int), LPVOID lpParam) {} +void C4JStorage::SetDLCPackageRoot(char* pszDLCRoot) {} +C4JStorage::EDLCStatus C4JStorage::GetDLCOffers(int iPad, int(*Func)(LPVOID, int, DWORD, int), LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } DWORD C4JStorage::CancelGetDLCOffers() { return 0; } void C4JStorage::ClearDLCOffers() {} -XMARKETPLACE_CONTENTOFFER_INFO& C4JStorage::GetOffer(DWORD dw) { static XMARKETPLACE_CONTENTOFFER_INFO retval = {0}; return retval; } +XMARKETPLACE_CONTENTOFFER_INFO& C4JStorage::GetOffer(DWORD dw) { static XMARKETPLACE_CONTENTOFFER_INFO retval = { 0 }; return retval; } int C4JStorage::GetOfferCount() { return 0; } -DWORD C4JStorage::InstallOffer(int iOfferIDC,ULONGLONG *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial) { return 0; } -DWORD C4JStorage::GetAvailableDLCCount( int iPad) { return 0; } -XCONTENT_DATA& C4JStorage::GetDLC(DWORD dw) { static XCONTENT_DATA retval = {0}; return retval; } -C4JStorage::EDLCStatus C4JStorage::GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam) { return C4JStorage::EDLC_Idle; } -DWORD C4JStorage::MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive) { return 0; } +DWORD C4JStorage::InstallOffer(int iOfferIDC, ULONGLONG * ullOfferIDA, int(*Func)(LPVOID, int, int), LPVOID lpParam, bool bTrial) { return 0; } +DWORD C4JStorage::GetAvailableDLCCount(int iPad) { return 0; } +XCONTENT_DATA& C4JStorage::GetDLC(DWORD dw) { static XCONTENT_DATA retval = { 0 }; return retval; } +C4JStorage::EDLCStatus C4JStorage::GetInstalledDLC(int iPad, int(*Func)(LPVOID, int, int), LPVOID lpParam) { return C4JStorage::EDLC_Idle; } +DWORD C4JStorage::MountInstalledDLC(int iPad, DWORD dwDLC, int(*Func)(LPVOID, int, DWORD, DWORD), LPVOID lpParam, LPCSTR szMountDrive) { return 0; } DWORD C4JStorage::UnmountInstalledDLC(LPCSTR szMountDrive) { return 0; } -C4JStorage::ETMSStatus C4JStorage::ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } -bool C4JStorage::WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize) { return true; } -bool C4JStorage::DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename) { return true; } -void C4JStorage::StoreTMSPathName(WCHAR *pwchName) {} -unsigned int C4JStorage::CRC(unsigned char *buf, int len) { return 0; } +C4JStorage::ETMSStatus C4JStorage::ReadTMSFile(int iQuadrant, eGlobalStorage eStorageFacility, C4JStorage::eTMS_FileType eFileType, WCHAR * pwchFilename, BYTE * *ppBuffer, DWORD * pdwBufferSize, int(*Func)(LPVOID, WCHAR*, int, bool, int), LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } +bool C4JStorage::WriteTMSFile(int iQuadrant, eGlobalStorage eStorageFacility, WCHAR * pwchFilename, BYTE * pBuffer, DWORD dwBufferSize) { return true; } +bool C4JStorage::DeleteTMSFile(int iQuadrant, eGlobalStorage eStorageFacility, WCHAR * pwchFilename) { return true; } +void C4JStorage::StoreTMSPathName(WCHAR * pwchName) {} +unsigned int C4JStorage::CRC(unsigned char* buf, int len) { return 0; } struct PTMSPP_FILEDATA; -C4JStorage::ETMSStatus C4JStorage::TMSPP_ReadFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPCSTR szFilename,int( *Func)(LPVOID,int,int,PTMSPP_FILEDATA, LPCSTR)/*=NULL*/,LPVOID lpParam/*=NULL*/, int iUserData/*=0*/) {return C4JStorage::ETMSStatus_Idle;} +C4JStorage::ETMSStatus C4JStorage::TMSPP_ReadFile(int iPad, C4JStorage::eGlobalStorage eStorageFacility, C4JStorage::eTMS_FILETYPEVAL eFileTypeVal, LPCSTR szFilename, int(*Func)(LPVOID, int, int, PTMSPP_FILEDATA, LPCSTR)/*=NULL*/, LPVOID lpParam/*=NULL*/, int iUserData/*=0*/) { return C4JStorage::ETMSStatus_Idle; } #endif // _WINDOWS64 #endif // __PS3__ @@ -636,8 +732,8 @@ BOOL CSentientManager::RecordHeartBeat(DWORD dwUserId) { return true; } BOOL CSentientManager::RecordLevelStart(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers) { return true; } BOOL CSentientManager::RecordLevelExit(DWORD dwUserId, ESen_LevelExitStatus levelExitStatus) { return true; } BOOL CSentientManager::RecordLevelSaveOrCheckpoint(DWORD dwUserId, INT saveOrCheckPointID, INT saveSizeInBytes) { return true; } -BOOL CSentientManager::RecordLevelResume(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers, INT saveOrCheckPointID) { return true; } -BOOL CSentientManager::RecordPauseOrInactive(DWORD dwUserId) { return true; } +BOOL CSentientManager::RecordLevelResume(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers, INT saveOrCheckPointID) { return true; } +BOOL CSentientManager::RecordPauseOrInactive(DWORD dwUserId) { return true; } BOOL CSentientManager::RecordUnpauseOrActive(DWORD dwUserId) { return true; } BOOL CSentientManager::RecordMenuShown(DWORD dwUserId, INT menuID, INT optionalMenuSubID) { return true; } BOOL CSentientManager::RecordAchievementUnlocked(DWORD dwUserId, INT achievementID, INT achievementGamerscore) { return true; } 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) + if (level->getTile(floor(tile->x), floor(tile->y), floor(tile->z)) != tile->tile) { - 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(); + 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(); } - 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(); +} + +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..d3c5e8d3 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; + // 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 (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; - } - - 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; @@ -552,6 +516,11 @@ void GameRenderer::moveCameraToPlayer(float a) double zd = Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI) * cameraDist; double yd = -Mth::sin(xRot / 180 * PI) * cameraDist; + if (localplayer->ThirdPersonView() == 2) + { + yd = Mth::sin(xRot / 180 * PI) * cameraDist; + } + for (int i = 0; i < 8; i++) { float xo = (float)((i & 1) * 2 - 1); @@ -572,13 +541,7 @@ 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); glTranslatef(0, 0, (float) -cameraDist); -// glRotatef(yRot - player->yRot, 0, 1, 0); -// glRotatef(xRot - player->xRot, 1, 0, 0); } } else @@ -588,10 +551,15 @@ void GameRenderer::moveCameraToPlayer(float a) if (!mc->options->fixedCamera) { - glRotatef(player->xRotO + (player->xRot - player->xRotO) * a, 1, 0, 0); - if( localplayer->ThirdPersonView() == 2 ) + float pitch = player->xRotO + (player->xRot - player->xRotO) * a; + if (localplayer->ThirdPersonView() == 2) + { + pitch = -pitch; + } + + glRotatef(pitch, 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 @@ -613,9 +581,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 +633,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 +647,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 +672,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); - } + float s = 1 / 1.5f; + glScalef(1, s, 1); + } - glMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); - - glLoadIdentity(); + glLoadIdentity(); if (mc->options->anaglyph3d) glTranslatef((eye * 2 - 1) * 0.10f, 0, 0); glPushMatrix(); @@ -766,20 +735,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 +761,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 +771,14 @@ void GameRenderer::renderItemInHand(float a, int eye) void GameRenderer::turnOffLightLayer(double alpha) { // 4J - TODO #if 0 - if (SharedConstants::TEXTURE_LIGHTING) + if (SharedConstants::TEXTURE_LIGHTING) { - glClientActiveTexture(GL_TEXTURE1); - glActiveTexture(GL_TEXTURE1); - glDisable(GL_TEXTURE_2D); - glClientActiveTexture(GL_TEXTURE0); - glActiveTexture(GL_TEXTURE0); - } + glClientActiveTexture(GL_TEXTURE1); + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glClientActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); + } #endif RenderManager.TextureBindVertex(-1); } @@ -812,49 +787,49 @@ void GameRenderer::turnOffLightLayer(double alpha) void GameRenderer::turnOnLightLayer(double alpha) { // 4J - TODO #if 0 - if (SharedConstants::TEXTURE_LIGHTING) + 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); + 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); + 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); - } + 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 +843,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 +851,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 +872,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 +906,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 = mc->options->gamma; + float ir = 1 - _r; float ig = 1 - _g; float ib = 1 - _b; @@ -938,12 +922,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 +933,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 +994,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 +1005,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 +1134,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 +1149,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 +1180,8 @@ int GameRenderer::runUpdate(LPVOID lpParam) } m_deleteStackSparseDataStorage.clear(); LeaveCriticalSection(&m_csDeleteStack); - -// PIXEndNamedEvent(); + + // PIXEndNamedEvent(); AABB::resetPool(); Vec3::resetPool(); @@ -1226,9 +1196,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 +1210,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 +1224,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 +1233,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 +1281,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 +1312,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 +1354,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 +1412,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 +1451,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 +1480,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 +1506,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 +1520,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 +1586,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 +1621,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 +1635,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 +1677,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 +1688,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 +1702,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 +1727,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 +1790,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 +1805,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 +1855,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 +1883,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 +1955,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 +2029,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 +2064,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 +2107,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; - - - int texBaseX = 16; - int bg = 0; - if (minecraft->player->hasEffect(MobEffect::hunger)) + // render food + for (int i = 0; i < FoodConstants::MAX_FOOD / 2; i++) { - texBaseX += 4 * 9; - bg = 13; - } + int yo = yLine1; - if (minecraft->player->getFoodData()->getSaturationLevel() <= 0) - { - if ((tickCount % (food * 3 + 1)) == 0) + + int texBaseX = 16; + int bg = 0; + if (minecraft->player->hasEffect(MobEffect::hunger)) { - yo += random->nextInt(3) - 1; + texBaseX += 4 * 9; + bg = 13; } + + 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) + { + 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(); + + 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 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 c1a3bb31..1639d09b 100644 --- a/Minecraft.Client/Input.cpp +++ b/Minecraft.Client/Input.cpp @@ -47,7 +47,7 @@ void Input::tick(LocalPlayer *player) #ifdef _WINDOWS64 // WASD movement (combine with gamepad) - if (iPad == 0) + if (iPad == 0 && KMInput.IsCaptured()) { float kbX = 0.0f, kbY = 0.0f; if (KMInput.IsKeyDown('W')) { kbY += 1.0f; sprintForward += 1.0f; usingKeyboardMovement = true; } @@ -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)) { @@ -95,7 +95,7 @@ void Input::tick(LocalPlayer *player) #ifdef _WINDOWS64 // Keyboard hold-to-sneak (overrides gamepad toggle) - if (iPad == 0 && KMInput.IsKeyDown(VK_SHIFT) && !player->abilities.flying) + if (iPad == 0 && KMInput.IsCaptured() && KMInput.IsKeyDown(VK_SHIFT) && !player->abilities.flying) sneaking = true; #endif @@ -145,7 +145,7 @@ void Input::tick(LocalPlayer *player) // Delta should normally be 0 since applyFrameMouseLook() already consumed it if (rawDx != 0.0f || rawDy != 0.0f) { - float mouseSensitivity = 0.5f; + float mouseSensitivity = ((float)app.GetGameSettings(iPad, eGameSetting_Sensitivity_InGame)) / 100.0f; float mdx = rawDx * mouseSensitivity; float mdy = -rawDy * mouseSensitivity; if (app.GetGameSettings(iPad, eGameSetting_ControlInvertLook)) @@ -166,7 +166,7 @@ void Input::tick(LocalPlayer *player) #ifdef _WINDOWS64 // Keyboard jump (Space) - if (iPad == 0 && KMInput.IsKeyDown(VK_SPACE) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP)) + if (iPad == 0 && KMInput.IsCaptured() && KMInput.IsKeyDown(VK_SPACE) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP)) jumping = true; #endif 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..222a5c18 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; @@ -1941,8 +1964,8 @@ bool LevelRenderer::updateDirtyChunks() { if( (!onlyRebuild) || globalChunkFlags[ pClipChunk->globalIdx ] & CHUNK_FLAG_COMPILED || - ( distSq < 20 * 20 ) ) // Always rebuild really near things or else building (say) at tower up into empty blocks when we are low on memory will not create render data - { + ( distSq < 96 * 96 ) ) // Always rebuild really near things or else building (say) at tower up into empty blocks when we are low on memory will not create render data + { // distSq adjusted from 20 * 20 to 96 * 96 - updated by detectiveren considered++; // Is this chunk nearer than our nearest? #ifdef _LARGE_WORLDS @@ -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) @@ -2535,13 +2557,19 @@ void LevelRenderer::cull(Culler *culler, float a) { unsigned char flags = pClipChunk->globalIdx == -1 ? 0 : globalChunkFlags[ pClipChunk->globalIdx ]; + // Always perform frustum cull test + bool clipres = clip(pClipChunk->aabb, fdraw); + if ( (flags & CHUNK_FLAG_COMPILED ) && ( ( flags & CHUNK_FLAG_EMPTYBOTH ) != CHUNK_FLAG_EMPTYBOTH ) ) { - bool clipres = clip(pClipChunk->aabb, fdraw); pClipChunk->visible = clipres; if( pClipChunk->visible ) vis++; total++; } + else if (clipres) + { + pClipChunk->visible = true; + } else { pClipChunk->visible = false; @@ -2550,6 +2578,7 @@ void LevelRenderer::cull(Culler *culler, float a) } } + void LevelRenderer::playStreamingMusic(const wstring& name, int x, int y, int z) { if (name != L"") @@ -2590,6 +2619,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 +2749,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 +2820,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 +2927,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"") + if(entity->instanceof(eTYPE_PLAYER)) { - textures->addMemTexture(entity->customTextureUrl, new MobSkinMemTextureProcessor()); + 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()); + } } - if (entity->customTextureUrl2 != L"") - { - textures->addMemTexture(entity->customTextureUrl2, new MobSkinMemTextureProcessor()); - } - - // if (entity->customTextureUrl2 != L"") textures->addHttpTexture(entity->customTextureUrl2, new MobSkinTextureProcessor()); - - } 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 +2981,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 +3056,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 +3109,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 +3144,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 +3199,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 +3242,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 +3256,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 +3273,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 +3741,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..bb2c0d13 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 @@ -43,14 +52,16 @@ public: static const int CHUNK_SIZE = 16; #endif static const int CHUNK_Y_COUNT = Level::maxBuildHeight / CHUNK_SIZE; -#if defined _XBOX_ONE - static const int MAX_COMMANDBUFFER_ALLOCATIONS = 2047 * 1024 * 1024; // Changed to 2047. 4J had set to 512. +#if defined _WINDOWS64 + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 2047 * 1024 * 1024; // Changed to 2047. 4J had set to 512. +#elif defined _XBOX_ONE + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 512 * 1024 * 1024; // 4J - added #elif defined __ORBIS__ static const int MAX_COMMANDBUFFER_ALLOCATIONS = 448 * 1024 * 1024; // 4J - added - hard limit is 512 so giving a lot of headroom here for fragmentation (have seen 16MB lost to fragmentation in multiplayer crash dump before) #elif defined __PS3__ static const int MAX_COMMANDBUFFER_ALLOCATIONS = 110 * 1024 * 1024; // 4J - added #else - static const int MAX_COMMANDBUFFER_ALLOCATIONS = 55 * 1024 * 1024; // 4J - added + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 55 * 1024 * 1024; // 4J - added #endif public: LevelRenderer(Minecraft *mc, Textures *textures); @@ -71,7 +82,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 +100,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 +118,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 +126,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); @@ -259,10 +272,10 @@ public: bool dirtyChunkPresent; __int64 lastDirtyChunkFound; - static const int FORCE_DIRTY_CHUNK_CHECK_PERIOD_MS = 250; + static const int FORCE_DIRTY_CHUNK_CHECK_PERIOD_MS = 125; // decreased from 250 to 125 - updated by detectiveren #ifdef _LARGE_WORLDS - static const int MAX_CONCURRENT_CHUNK_REBUILDS = 4; + static const int MAX_CONCURRENT_CHUNK_REBUILDS = 8; // increased from 4 to 8 - updated by detectiveren static const int MAX_CHUNK_REBUILD_THREADS = MAX_CONCURRENT_CHUNK_REBUILDS - 1; static Chunk permaChunk[MAX_CONCURRENT_CHUNK_REBUILDS]; static C4JThread *rebuildThreads[MAX_CHUNK_REBUILD_THREADS]; @@ -274,4 +287,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 ed286cd9..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; @@ -365,7 +342,7 @@ void LocalPlayer::aiStep() { if (jumpTriggerTime == 0) { - jumpTriggerTime = 10; // was 7 + jumpTriggerTime = 7; // the 4J team changed it to 10 because of additional requirements to initiate flight twoJumpsRegistered = false; } else @@ -373,7 +350,7 @@ void LocalPlayer::aiStep() twoJumpsRegistered = true; } } - else if( ( !input->jumping ) && ( jumpTriggerTime > 0 ) && twoJumpsRegistered ) + else if(jumpTriggerTime > 0 && twoJumpsRegistered) //the 4J team checked if the player was NOT jumping after the two jumps, aka had let go of the jump button { #ifndef _CONTENT_PACKAGE printf("flying was %s\n", abilities.flying ? "on" : "off"); @@ -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.LoadEnchantingMenu(GetXboxPad(), inventory, x, y, z, level ); + 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, 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); + 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) + int dir = -1; + double closest = 9999; + if (west && xd < closest) { - closest = xd; - dir = 0; - } - if (east && 1 - xd < closest) + closest = xd; + dir = 0; + } + if (east && 1 - xd < closest) { - closest = 1 - xd; - dir = 1; - } - if (north && zd < closest) + closest = 1 - xd; + dir = 1; + } + if (north && zd < closest) { - closest = zd; - dir = 4; - } - if (south && 1 - zd < closest) + closest = zd; + dir = 4; + } + if (south && 1 - zd < closest) { - closest = 1 - zd; - dir = 5; - } + 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; - } + 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; + 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); + 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(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); + } - if (cart->type != Minecart::RIDEABLE) + int yOffset = cart->getDisplayOffset(); + Tile *tile = cart->getDisplayTile(); + int tileData = cart->getDisplayData(); + + 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 5e448ab6..d7c49acf 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -1,6 +1,10 @@  + + ContentPackage_NO_TU + ARM64EC + ContentPackage_NO_TU Durango @@ -17,6 +21,10 @@ ContentPackage_NO_TU PSVita + + ContentPackage_NO_TU + Win32 + ContentPackage_NO_TU x64 @@ -25,6 +33,10 @@ ContentPackage_NO_TU Xbox 360 + + CONTENTPACKAGE_SYMBOLS + ARM64EC + CONTENTPACKAGE_SYMBOLS Durango @@ -41,6 +53,10 @@ CONTENTPACKAGE_SYMBOLS PSVita + + CONTENTPACKAGE_SYMBOLS + Win32 + CONTENTPACKAGE_SYMBOLS x64 @@ -49,6 +65,10 @@ CONTENTPACKAGE_SYMBOLS Xbox 360 + + ContentPackage_Vita + ARM64EC + ContentPackage_Vita Durango @@ -65,6 +85,10 @@ ContentPackage_Vita PSVita + + ContentPackage_Vita + Win32 + ContentPackage_Vita x64 @@ -73,6 +97,10 @@ ContentPackage_Vita Xbox 360 + + ContentPackage + ARM64EC + ContentPackage Durango @@ -89,6 +117,10 @@ ContentPackage PSVita + + ContentPackage + Win32 + ContentPackage x64 @@ -97,6 +129,10 @@ ContentPackage Xbox 360 + + Debug + ARM64EC + Debug Durango @@ -113,6 +149,10 @@ Debug PSVita + + Debug + Win32 + Debug x64 @@ -121,6 +161,10 @@ Debug Xbox 360 + + ReleaseForArt + ARM64EC + ReleaseForArt Durango @@ -137,6 +181,10 @@ ReleaseForArt PSVita + + ReleaseForArt + Win32 + ReleaseForArt x64 @@ -145,6 +193,10 @@ ReleaseForArt Xbox 360 + + Release + ARM64EC + Release Durango @@ -161,6 +213,10 @@ Release PSVita + + Release + Win32 + Release x64 @@ -179,7 +235,6 @@ SAK Xbox360Proj title - 10.0 @@ -234,7 +289,16 @@ Application MultiByte v143 - 10.0 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 Application @@ -246,13 +310,33 @@ Application MultiByte v143 - 10.0 + true + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 Application MultiByte v143 + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + Application Unicode @@ -340,24 +424,72 @@ 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 + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + Application Unicode @@ -386,7 +518,7 @@ Application MultiByte true - v110 + v143 Clang @@ -411,6 +543,7 @@ + @@ -442,15 +575,33 @@ + + + + + + + + + + + + + + + + + + @@ -496,15 +647,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -545,7 +720,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 +736,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 +748,16 @@ $(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 @@ -590,6 +775,16 @@ + false + $(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) @@ -599,6 +794,16 @@ $(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 +862,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 +889,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 +910,72 @@ $(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) + $(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) @@ -1276,6 +1529,99 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" + + Use + Level3 + ProgramDatabase + Disabled + Sync + false + $(OutDir)$(ProjectName).pch + 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 + /FS %(AdditionalOptions) + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;wsock32.lib + 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 + + + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" + + + Run post-build script + + + + + Use + Level3 + ProgramDatabase + Disabled + Sync + false + $(OutDir)$(ProjectName).pch + 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 + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\ARM64EC_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;wsock32.lib + 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 + + + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" + + + Run post-build script + + + Use Level3 @@ -1299,17 +1645,10 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib NotSet false - MultiplyDefinedSymbolOnly - Copying sound assets to output directory - xcopy /q /y /i /s /e "$(ProjectDir)Durango\Sound" "$(OutDir)Durango\Sound" -xcopy /q /y /i /s /e "$(ProjectDir)music" "$(OutDir)music" -xcopy /q /y /i /s /e "$(ProjectDir)Windows64\GameHDD" "$(OutDir)Windows64\GameHDD" -xcopy /q /y /i /s /e "$(ProjectDir)Common\Media" "$(OutDir)Common\Media" -xcopy /q /y /i /s /e "$(ProjectDir)Common\res" "$(OutDir)Common\res" -xcopy /q /y /i /s /e "$(ProjectDir)Common\Trial" "$(OutDir)Common\Trial" -xcopy /q /y /i /s /e "$(ProjectDir)Common\Tutorial" "$(OutDir)Common\Tutorial" + Run postbuild script + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" $(ProjectDir)xbox\xex-dev.xml @@ -1336,7 +1675,7 @@ xcopy /q /y /i /s /e "$(ProjectDir)Common\Tutorial" "$(OutDir)Common\Tutorial"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) + 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 @@ -1387,11 +1726,12 @@ 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 @@ -1414,6 +1754,101 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + Use + TurnOffAllWarnings + ProgramDatabase + MaxSpeed + 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 + true + true + /FS /Ob3 %(AdditionalOptions) + + + 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 + UseLinkTimeCodeGeneration + + + 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 + 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 @@ -1439,27 +1874,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUNotSet false - - Copying game assets to output directory - mkdir "$(OutDir)music" 2>nul -mkdir "$(OutDir)Windows64\GameHDD" 2>nul -mkdir "$(OutDir)Common\Media" 2>nul -mkdir "$(OutDir)Common\res" 2>nul -mkdir "$(OutDir)Common\Trial" 2>nul -mkdir "$(OutDir)Common\Tutorial" 2>nul -mkdir "$(OutDir)Windows64Media" 2>nul - -xcopy /q /y /i /s /e "$(ProjectDir)music" "$(OutDir)music" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Windows64\GameHDD" "$(OutDir)Windows64\GameHDD" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\Media" "$(OutDir)Common\Media" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\res" "$(OutDir)Common\res" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\Trial" "$(OutDir)Common\Trial" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\Tutorial" "$(OutDir)Common\Tutorial" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)DurangoMedia" "$(OutDir)Windows64Media" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Windows64Media" "$(OutDir)Windows64Media" || exit /b 0 - -exit /b 0 - $(ProjectDir)xbox\xex-dev.xml @@ -1516,6 +1930,88 @@ exit /b 0 $(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;..\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;..\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 @@ -1578,11 +2074,12 @@ 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 @@ -2111,18 +2608,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 @@ -2130,7 +2628,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 @@ -2138,6 +2636,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" None --strip-duplicates StripFuncsAndData + StripSymsAndDebug $(ProjectDir)xbox\xex.xml @@ -2277,6 +2776,86 @@ 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 + 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 @@ -2317,6 +2896,86 @@ 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 + 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 @@ -2357,6 +3016,86 @@ 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 + 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 @@ -2397,6 +3136,86 @@ 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 + 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 @@ -2452,7 +3271,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 @@ -2776,7 +3596,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 @@ -2859,12 +3679,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -2904,12 +3738,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -2949,12 +3797,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -2970,6 +3832,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + Document + true @@ -3002,12 +3867,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3047,12 +3926,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3091,12 +3984,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3136,12 +4043,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3181,12 +4102,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3226,12 +4161,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3263,12 +4212,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3297,12 +4260,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3339,12 +4316,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3356,7 +4347,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -3364,6 +4359,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -3378,8 +4375,14 @@ 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 @@ -3396,7 +4399,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -3404,6 +4411,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -3418,8 +4427,14 @@ 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 @@ -3428,12 +4443,26 @@ xcopy /q /y /i /s /e $(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 @@ -3466,12 +4495,26 @@ xcopy /q /y /i /s /e $(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 @@ -3504,12 +4547,26 @@ xcopy /q /y /i /s /e $(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 @@ -3542,12 +4599,26 @@ xcopy /q /y /i /s /e $(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 @@ -3580,12 +4651,26 @@ xcopy /q /y /i /s /e $(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 @@ -3618,12 +4703,26 @@ xcopy /q /y /i /s /e $(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 @@ -3656,12 +4755,26 @@ xcopy /q /y /i /s /e $(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 @@ -3694,12 +4807,26 @@ xcopy /q /y /i /s /e $(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 @@ -3732,12 +4859,26 @@ xcopy /q /y /i /s /e $(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 @@ -3770,12 +4911,26 @@ xcopy /q /y /i /s /e $(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 @@ -3808,12 +4963,26 @@ xcopy /q /y /i /s /e $(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 @@ -3869,12 +5038,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3906,12 +5089,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -3938,12 +5135,26 @@ 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 + false false + false + false true true true @@ -3969,12 +5180,26 @@ 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 + false false + false + false true true true @@ -3990,18 +5215,32 @@ xcopy /q /y /i /s /e $(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 @@ -4028,18 +5267,32 @@ xcopy /q /y /i /s /e $(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 @@ -4147,9 +5400,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU Designer true + true + true true true + true + true true + true + true true true true @@ -4201,18 +5460,32 @@ xcopy /q /y /i /s /e $(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 @@ -4239,18 +5512,32 @@ xcopy /q /y /i /s /e $(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 @@ -4287,7 +5574,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -4295,7 +5586,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -4311,16 +5636,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + + + + @@ -4329,9 +5659,15 @@ 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 @@ -4386,7 +5722,82 @@ xcopy /q /y /i /s /e $(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 + true + true + true + true + true + true + true + true + true + true + true + true + @@ -4428,15 +5839,23 @@ xcopy /q /y /i /s /e $(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 false @@ -4450,15 +5869,23 @@ xcopy /q /y /i /s /e $(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 false @@ -4472,15 +5899,23 @@ xcopy /q /y /i /s /e $(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 false @@ -4494,15 +5929,23 @@ xcopy /q /y /i /s /e $(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 false @@ -4529,12 +5972,26 @@ 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 @@ -4546,15 +6003,23 @@ xcopy /q /y /i /s /e $(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 false @@ -4568,15 +6033,23 @@ xcopy /q /y /i /s /e $(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 false @@ -4603,6 +6076,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -4610,6 +6084,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -4632,13 +6107,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + + + @@ -4667,6 +6148,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 @@ -4717,7 +6252,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4733,7 +6268,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4749,7 +6284,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4765,7 +6300,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4781,7 +6316,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4797,7 +6332,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4813,7 +6348,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4829,7 +6364,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4845,7 +6380,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4861,7 +6396,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4877,7 +6412,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4891,6 +6426,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false true @@ -4902,7 +6438,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4931,12 +6467,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -5206,12 +6756,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 + true + true + true + true + true true @@ -5383,7 +6956,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5406,12 +6979,18 @@ 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 false false false @@ -5425,8 +7004,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false + false false + false + false false + false + false false @@ -5439,7 +7024,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5455,7 +7040,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5471,7 +7056,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5487,7 +7072,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5503,7 +7088,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5519,7 +7104,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5535,7 +7120,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5551,7 +7136,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5567,7 +7152,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5583,7 +7168,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -6030,6 +7615,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true true @@ -6285,6 +7879,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + true @@ -6302,10 +7897,132 @@ 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 + 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 + false + false + false + false + false + false + false + true + true + true true + true + true true + true + true true true true @@ -6334,16 +8051,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true + true + true false false false true + true + true true + true + true true + true + true true true true @@ -6372,20 +8101,40 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + 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 true @@ -6412,14 +8161,260 @@ xcopy /q /y /i /s /e $(ProjectDir)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 + 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 + 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 + 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 + 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 @@ -6448,8 +8443,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -6478,8 +8479,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true + true + true false false false @@ -6507,12 +8514,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -6528,7 +8549,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true false false true @@ -6536,18 +8561,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true false true true true true true + true + true false true true true true true + true + true true true @@ -6815,9 +8846,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true @@ -6833,7 +8870,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -6841,7 +8882,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -6856,7 +8931,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -6864,7 +8943,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -6882,12 +8995,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true + @@ -6916,12 +9036,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -6953,12 +9087,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -6990,12 +9138,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7027,12 +9189,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7073,12 +9249,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7113,11 +9303,23 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7197,12 +9399,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7255,12 +9471,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7292,12 +9522,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7329,12 +9573,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7366,12 +9624,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7396,12 +9668,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7440,12 +9726,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7484,12 +9784,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7516,9 +9830,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 @@ -7547,9 +9869,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 @@ -7584,9 +9914,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 @@ -7619,9 +9957,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 @@ -7654,9 +10000,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 @@ -7688,12 +10042,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7733,12 +10101,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7756,12 +10138,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7786,12 +10182,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7816,12 +10226,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7846,12 +10270,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7876,12 +10314,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7906,12 +10358,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7937,12 +10403,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -7960,18 +10440,32 @@ xcopy /q /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 false false false true + true + true false true + true + true true + true + true false false true @@ -8012,12 +10506,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false @@ -8049,12 +10557,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8084,6 +10606,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -8102,7 +10625,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -8110,7 +10637,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8122,6 +10683,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -8140,7 +10702,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -8148,7 +10714,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8160,47 +10760,82 @@ 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 + false false false false + false + false false false + false + false false + false + false false false @@ -8240,12 +10875,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8277,12 +10926,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8311,12 +10974,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8345,12 +11022,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8379,12 +11070,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8413,12 +11118,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8447,12 +11166,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8481,61 +11214,31 @@ xcopy /q /y /i /s /e $(ProjectDir)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 - 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 @@ -8567,12 +11270,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8612,12 +11329,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8650,12 +11381,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8688,12 +11433,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8732,12 +11491,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8751,6 +11524,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -8759,13 +11534,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true true true true + true + true true true true @@ -8780,6 +11561,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -8796,11 +11579,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 @@ -8827,12 +11616,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8871,12 +11674,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8890,6 +11707,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -8906,11 +11725,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 @@ -8920,7 +11745,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -8934,10 +11763,20 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -8954,6 +11793,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true false false @@ -8963,6 +11804,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -8992,12 +11835,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9041,12 +11898,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9086,12 +11957,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9131,12 +12016,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9162,12 +12061,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9210,12 +12123,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9238,9 +12165,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 @@ -9263,7 +12198,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -9271,6 +12210,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -9285,8 +12226,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 @@ -9323,12 +12270,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9368,12 +12329,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9413,12 +12388,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9458,12 +12447,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9503,12 +12506,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9548,12 +12565,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9593,12 +12624,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9638,12 +12683,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9652,17 +12711,23 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - + + true + true + true true true + true + true true + true + true true true @@ -9670,18 +12735,32 @@ xcopy /q /y /i /s /e $(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 @@ -9694,18 +12773,32 @@ xcopy /q /y /i /s /e $(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 @@ -9718,18 +12811,32 @@ xcopy /q /y /i /s /e $(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 @@ -9742,18 +12849,32 @@ xcopy /q /y /i /s /e $(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 @@ -9776,10 +12897,20 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -9805,7 +12936,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -9813,6 +12948,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -9827,8 +12964,14 @@ 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 @@ -9889,46 +13032,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 @@ -9939,7 +13042,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -9947,6 +13054,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -9961,8 +13070,14 @@ 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 @@ -9971,12 +13086,26 @@ xcopy /q /y /i /s /e $(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 @@ -10009,12 +13138,26 @@ xcopy /q /y /i /s /e $(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 @@ -10047,18 +13190,32 @@ xcopy /q /y /i /s /e $(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 @@ -10085,8 +13242,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -10122,12 +13285,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -10169,12 +13346,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -10185,8 +13376,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -10217,18 +13414,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -10243,8 +13448,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -10272,12 +13483,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -10296,12 +13521,26 @@ xcopy /q /y /i /s /e $(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 @@ -10341,12 +13580,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -10383,7 +13636,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -10391,6 +13648,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -10405,8 +13664,14 @@ 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 @@ -10423,7 +13688,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -10431,6 +13700,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -10445,8 +13716,14 @@ 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 @@ -10455,18 +13732,32 @@ xcopy /q /y /i /s /e $(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 @@ -10493,18 +13784,32 @@ xcopy /q /y /i /s /e $(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 @@ -10555,11 +13860,23 @@ 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 + false false false false @@ -10572,18 +13889,32 @@ xcopy /q /y /i /s /e $(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 @@ -10626,18 +13957,32 @@ xcopy /q /y /i /s /e $(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 @@ -10669,9 +14014,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 @@ -10700,7 +14053,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -10708,6 +14065,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -10722,8 +14081,14 @@ 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 @@ -10732,18 +14097,32 @@ xcopy /q /y /i /s /e $(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 @@ -10770,18 +14149,32 @@ xcopy /q /y /i /s /e $(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 @@ -10801,18 +14194,32 @@ xcopy /q /y /i /s /e $(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 @@ -10839,18 +14246,32 @@ xcopy /q /y /i /s /e $(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 @@ -10877,18 +14298,32 @@ xcopy /q /y /i /s /e $(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 @@ -10915,18 +14350,32 @@ xcopy /q /y /i /s /e $(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 @@ -10953,18 +14402,32 @@ xcopy /q /y /i /s /e $(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 @@ -10991,12 +14454,26 @@ xcopy /q /y /i /s /e $(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 @@ -11029,12 +14506,26 @@ xcopy /q /y /i /s /e $(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 @@ -11067,12 +14558,26 @@ xcopy /q /y /i /s /e $(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 @@ -11105,12 +14610,26 @@ xcopy /q /y /i /s /e $(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 @@ -11143,12 +14662,26 @@ xcopy /q /y /i /s /e $(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 @@ -11181,12 +14714,26 @@ xcopy /q /y /i /s /e $(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 @@ -11219,12 +14766,26 @@ xcopy /q /y /i /s /e $(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 @@ -11257,12 +14818,26 @@ xcopy /q /y /i /s /e $(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 @@ -11295,12 +14870,26 @@ xcopy /q /y /i /s /e $(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 @@ -11333,12 +14922,26 @@ xcopy /q /y /i /s /e $(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 @@ -11371,12 +14974,26 @@ xcopy /q /y /i /s /e $(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 @@ -11409,12 +15026,26 @@ xcopy /q /y /i /s /e $(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 @@ -11447,12 +15078,26 @@ xcopy /q /y /i /s /e $(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 @@ -11485,12 +15130,26 @@ xcopy /q /y /i /s /e $(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 @@ -11523,12 +15182,26 @@ xcopy /q /y /i /s /e $(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 @@ -11561,12 +15234,26 @@ xcopy /q /y /i /s /e $(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 @@ -11599,12 +15286,26 @@ xcopy /q /y /i /s /e $(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 @@ -11637,12 +15338,26 @@ xcopy /q /y /i /s /e $(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 @@ -11675,12 +15390,26 @@ xcopy /q /y /i /s /e $(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 @@ -11713,12 +15442,26 @@ xcopy /q /y /i /s /e $(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 @@ -11751,12 +15494,26 @@ xcopy /q /y /i /s /e $(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 @@ -11789,12 +15546,26 @@ xcopy /q /y /i /s /e $(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 @@ -11827,12 +15598,26 @@ xcopy /q /y /i /s /e $(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 @@ -11865,12 +15650,26 @@ xcopy /q /y /i /s /e $(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 @@ -11903,12 +15702,26 @@ xcopy /q /y /i /s /e $(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 @@ -11941,12 +15754,26 @@ xcopy /q /y /i /s /e $(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 @@ -11979,12 +15806,26 @@ xcopy /q /y /i /s /e $(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 @@ -12017,12 +15858,26 @@ xcopy /q /y /i /s /e $(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 @@ -12055,12 +15910,26 @@ xcopy /q /y /i /s /e $(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 @@ -12093,12 +15962,26 @@ xcopy /q /y /i /s /e $(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 @@ -12131,12 +16014,26 @@ xcopy /q /y /i /s /e $(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 @@ -12169,12 +16066,26 @@ xcopy /q /y /i /s /e $(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 @@ -12207,12 +16118,26 @@ xcopy /q /y /i /s /e $(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 @@ -12245,12 +16170,26 @@ xcopy /q /y /i /s /e $(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 @@ -12283,12 +16222,26 @@ xcopy /q /y /i /s /e $(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 @@ -12321,12 +16274,26 @@ xcopy /q /y /i /s /e $(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 @@ -12359,12 +16326,26 @@ xcopy /q /y /i /s /e $(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 @@ -12397,12 +16378,26 @@ xcopy /q /y /i /s /e $(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 @@ -12435,12 +16430,26 @@ xcopy /q /y /i /s /e $(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 @@ -12473,12 +16482,26 @@ xcopy /q /y /i /s /e $(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 @@ -12511,12 +16534,26 @@ xcopy /q /y /i /s /e $(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 @@ -12549,12 +16586,26 @@ xcopy /q /y /i /s /e $(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 @@ -12587,12 +16638,26 @@ xcopy /q /y /i /s /e $(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 @@ -12625,12 +16690,26 @@ xcopy /q /y /i /s /e $(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 @@ -12663,12 +16742,26 @@ xcopy /q /y /i /s /e $(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 @@ -12701,12 +16794,26 @@ xcopy /q /y /i /s /e $(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 @@ -12739,12 +16846,26 @@ xcopy /q /y /i /s /e $(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 @@ -12777,12 +16898,26 @@ xcopy /q /y /i /s /e $(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 @@ -12815,12 +16950,26 @@ xcopy /q /y /i /s /e $(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 @@ -12853,12 +17002,26 @@ xcopy /q /y /i /s /e $(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 @@ -12891,12 +17054,26 @@ xcopy /q /y /i /s /e $(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 @@ -12929,12 +17106,26 @@ xcopy /q /y /i /s /e $(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 @@ -12967,12 +17158,26 @@ xcopy /q /y /i /s /e $(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 @@ -13005,12 +17210,26 @@ xcopy /q /y /i /s /e $(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 @@ -13043,12 +17262,26 @@ xcopy /q /y /i /s /e $(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 @@ -13081,12 +17314,26 @@ xcopy /q /y /i /s /e $(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 @@ -13119,12 +17366,26 @@ xcopy /q /y /i /s /e $(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 @@ -13157,12 +17418,26 @@ xcopy /q /y /i /s /e $(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 @@ -13195,12 +17470,26 @@ xcopy /q /y /i /s /e $(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 @@ -13233,12 +17522,26 @@ xcopy /q /y /i /s /e $(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 @@ -13271,12 +17574,26 @@ xcopy /q /y /i /s /e $(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 @@ -13309,12 +17626,26 @@ xcopy /q /y /i /s /e $(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 @@ -13347,12 +17678,26 @@ xcopy /q /y /i /s /e $(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 @@ -13385,12 +17730,26 @@ xcopy /q /y /i /s /e $(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 @@ -13423,12 +17782,26 @@ xcopy /q /y /i /s /e $(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 @@ -13461,12 +17834,26 @@ xcopy /q /y /i /s /e $(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 @@ -13499,12 +17886,26 @@ xcopy /q /y /i /s /e $(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 @@ -13537,12 +17938,26 @@ xcopy /q /y /i /s /e $(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 @@ -13575,12 +17990,26 @@ xcopy /q /y /i /s /e $(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 @@ -13613,12 +18042,26 @@ xcopy /q /y /i /s /e $(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 @@ -13651,12 +18094,26 @@ xcopy /q /y /i /s /e $(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 @@ -13689,12 +18146,26 @@ xcopy /q /y /i /s /e $(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 @@ -13727,12 +18198,26 @@ xcopy /q /y /i /s /e $(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 @@ -13765,12 +18250,26 @@ xcopy /q /y /i /s /e $(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 @@ -13803,12 +18302,26 @@ xcopy /q /y /i /s /e $(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 @@ -13841,12 +18354,26 @@ xcopy /q /y /i /s /e $(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 @@ -13879,12 +18406,26 @@ xcopy /q /y /i /s /e $(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 @@ -13917,12 +18458,26 @@ xcopy /q /y /i /s /e $(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 @@ -13955,12 +18510,26 @@ xcopy /q /y /i /s /e $(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 @@ -13993,12 +18562,26 @@ xcopy /q /y /i /s /e $(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 @@ -14031,12 +18614,26 @@ xcopy /q /y /i /s /e $(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 @@ -14076,7 +18673,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -14084,6 +18685,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true false @@ -14091,7 +18694,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true false @@ -14125,12 +18732,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14162,12 +18783,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14199,12 +18834,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14236,12 +18885,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14274,12 +18937,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14311,12 +18988,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14348,12 +19039,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14385,12 +19090,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14422,12 +19141,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14459,12 +19192,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14496,49 +19243,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14570,12 +19294,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14607,12 +19345,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14651,12 +19403,26 @@ 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 @@ -14688,12 +19454,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14725,12 +19505,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14764,12 +19558,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14801,12 +19609,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14838,12 +19660,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14875,12 +19711,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14919,12 +19769,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14956,12 +19820,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -14986,12 +19864,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15023,12 +19915,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15060,12 +19966,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15097,12 +20017,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15134,12 +20068,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15171,12 +20119,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15208,12 +20170,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15245,12 +20221,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15282,12 +20272,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15297,50 +20301,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 @@ -15371,12 +20331,26 @@ 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 @@ -15408,12 +20382,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15445,12 +20433,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15482,12 +20484,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15519,12 +20535,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15556,12 +20586,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15593,12 +20637,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15611,13 +20669,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 + @@ -15628,9 +20693,15 @@ 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 @@ -15639,9 +20710,15 @@ 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 @@ -15677,6 +20754,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -15688,6 +20766,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -15706,9 +20786,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false + false true false + false + false false + false + false true true false @@ -15758,7 +20844,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -15766,9 +20856,44 @@ xcopy /q /y /i /s /e $(ProjectDir)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 + @@ -15781,6 +20906,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -15793,7 +20919,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -15801,7 +20931,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -15830,12 +20994,26 @@ 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 + false false + false + false true @@ -15854,12 +21032,26 @@ 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 + false false + false + false true @@ -15878,12 +21070,26 @@ 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 + false false + false + false true @@ -15902,12 +21108,26 @@ 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 + false false + false + false true @@ -15926,12 +21146,26 @@ 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 + false false + false + false true true true @@ -16185,12 +21419,26 @@ 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 + false false + false + false true true true @@ -16264,12 +21512,26 @@ 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 + false false + false + false true true true @@ -16292,6 +21554,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -16309,12 +21572,26 @@ 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 + false false + false + false true true true @@ -16340,12 +21617,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 @@ -16385,12 +21669,26 @@ 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 + false false + false + false true true true @@ -16430,12 +21728,26 @@ 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 + false false + false + false true true true @@ -16475,12 +21787,26 @@ 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 + false false + false + false true true true @@ -16520,12 +21846,26 @@ 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 + false false + false + false true true true @@ -16565,12 +21905,26 @@ 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 + false false + false + false true true true @@ -16610,12 +21964,26 @@ 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 + false false + false + false true true true @@ -16655,12 +22023,26 @@ 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 + false false + false + false true true true @@ -16700,12 +22082,26 @@ 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 + false false + false + false true true true @@ -16769,12 +22165,26 @@ 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 + false false + false + false true true true @@ -16783,23 +22193,42 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -16826,18 +22255,32 @@ xcopy /q /y /i /s /e $(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 @@ -16864,18 +22307,32 @@ xcopy /q /y /i /s /e $(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 @@ -16902,18 +22359,32 @@ xcopy /q /y /i /s /e $(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 @@ -16944,9 +22415,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -16974,9 +22451,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17004,9 +22487,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17034,18 +22523,32 @@ xcopy /q /y /i /s /e $(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 @@ -17090,12 +22593,18 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true false false true true true + true + true false true true @@ -17104,8 +22613,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true + true + true false false false @@ -17141,12 +22656,26 @@ 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 + false false + false + false false false false @@ -17163,11 +22692,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 @@ -17178,8 +22713,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 @@ -17197,9 +22738,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17707,9 +23254,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17737,9 +23290,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17767,9 +23326,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17797,9 +23362,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17827,9 +23398,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -17857,15 +23434,29 @@ xcopy /q /y /i /s /e $(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 @@ -17912,18 +23503,32 @@ xcopy /q /y /i /s /e $(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 @@ -17958,7 +23563,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true false false true @@ -17966,6 +23575,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true false true true @@ -17980,26 +23591,46 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + 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 + true true + true + true true true true @@ -18026,18 +23657,32 @@ xcopy /q /y /i /s /e $(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 @@ -18064,15 +23709,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18106,15 +23765,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18148,15 +23821,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18190,15 +23877,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18232,15 +23933,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18274,15 +23989,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18316,15 +24045,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18358,15 +24101,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18400,15 +24157,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18442,15 +24213,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18484,15 +24269,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18526,15 +24325,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18568,15 +24381,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18610,15 +24437,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18652,15 +24493,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18694,15 +24549,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18736,15 +24605,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18778,15 +24661,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18820,15 +24717,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18862,15 +24773,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18904,15 +24829,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18946,15 +24885,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -18988,15 +24941,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19030,15 +24997,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19072,15 +25053,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19114,15 +25109,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19156,15 +25165,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19198,15 +25221,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19240,15 +25277,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19282,15 +25333,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19324,15 +25389,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19366,15 +25445,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19408,15 +25501,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19450,15 +25557,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19492,15 +25613,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19534,15 +25669,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19576,15 +25725,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19618,15 +25781,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19660,15 +25837,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19702,15 +25893,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19744,15 +25949,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19786,15 +26005,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19828,15 +26061,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19870,15 +26117,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19912,15 +26173,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19954,15 +26229,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -19996,15 +26285,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20038,15 +26341,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20080,15 +26397,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20122,15 +26453,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20164,15 +26509,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20206,15 +26565,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20248,15 +26621,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20290,15 +26677,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20332,15 +26733,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20374,15 +26789,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20416,15 +26845,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20458,15 +26901,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20500,15 +26957,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20542,15 +27013,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20584,15 +27069,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20626,15 +27125,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20668,15 +27181,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20710,15 +27237,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20752,15 +27293,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20794,15 +27349,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20836,15 +27405,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20878,15 +27461,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20920,15 +27517,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -20962,15 +27573,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21004,15 +27629,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21046,15 +27685,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21088,15 +27741,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21130,15 +27797,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21172,15 +27853,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21214,15 +27909,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21256,15 +27965,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21298,15 +28021,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21340,8 +28077,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -21370,23 +28113,43 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + 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 false + false + false true true true @@ -21420,15 +28183,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21462,15 +28239,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -21516,7 +28307,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -21524,13 +28319,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 - NotUsing - @@ -21544,16 +28369,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + + + + @@ -21562,9 +28392,15 @@ 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 @@ -21594,6 +28430,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false + false @@ -21634,7 +28472,82 @@ xcopy /q /y /i /s /e $(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 + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -21673,15 +28586,23 @@ xcopy /q /y /i /s /e $(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 false @@ -21695,15 +28616,23 @@ xcopy /q /y /i /s /e $(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 false @@ -21717,15 +28646,23 @@ xcopy /q /y /i /s /e $(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 false @@ -21752,12 +28689,26 @@ 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 @@ -21796,12 +28747,26 @@ 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 @@ -21813,15 +28778,23 @@ xcopy /q /y /i /s /e $(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 false @@ -21847,6 +28820,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -21854,6 +28828,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -21868,13 +28843,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + + + @@ -21909,6 +28890,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 @@ -21959,7 +28994,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21975,7 +29010,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21991,7 +29026,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22007,7 +29042,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22023,7 +29058,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22039,7 +29074,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22055,7 +29090,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22071,7 +29106,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22087,7 +29122,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22103,7 +29138,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22119,7 +29154,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22133,6 +29168,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false true @@ -22144,7 +29180,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22173,12 +29209,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -22448,12 +29498,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 + true + true + true + true + true true @@ -22609,7 +29682,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22632,12 +29705,18 @@ 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 false false false @@ -22651,8 +29730,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false + false false + false + false false + false + false false @@ -22665,7 +29750,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22681,7 +29766,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22697,7 +29782,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22713,7 +29798,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22729,7 +29814,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22745,7 +29830,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22761,7 +29846,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22777,7 +29862,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22793,7 +29878,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22809,7 +29894,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -23247,6 +30332,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true true @@ -23502,6 +30596,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + true true @@ -23518,10 +30613,132 @@ 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 + 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 + false + false + false + false + false + false + false + true + true + true true + true + true true + true + true true true true @@ -23550,16 +30767,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true + true + true false false false true + true + true true + true + true true + true + true true true true @@ -23588,20 +30817,40 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + 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 true @@ -23628,14 +30877,260 @@ xcopy /q /y /i /s /e $(ProjectDir)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 + 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 + 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 + 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 + 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 @@ -23664,8 +31159,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -23694,8 +31195,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true + true + true false false false @@ -23723,12 +31230,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -23744,7 +31265,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -23752,18 +31277,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 @@ -23794,12 +31325,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23841,12 +31386,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23886,12 +31445,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23931,12 +31504,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23976,12 +31563,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24028,12 +31629,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24080,12 +31695,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24132,12 +31761,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24184,12 +31827,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24229,12 +31886,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24274,12 +31945,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24319,12 +32004,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24364,12 +32063,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24409,12 +32122,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24454,12 +32181,26 @@ 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 + NotUsing NotUsing + NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24477,12 +32218,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + NotUsing + true + true + true true true + true + true true + true + true true true @@ -24497,7 +32247,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -24505,7 +32259,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24520,7 +32308,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -24528,7 +32320,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24539,18 +32365,82 @@ xcopy /q /y /i /s /e $(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 + true true true + true + true true + true + true true true + @@ -24586,12 +32476,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24624,12 +32528,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24664,11 +32582,23 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24687,7 +32617,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true false @@ -24695,6 +32629,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true false false @@ -24709,8 +32645,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 @@ -24726,7 +32668,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true false @@ -24734,6 +32680,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true false false @@ -24748,8 +32696,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 @@ -24778,12 +32732,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24801,18 +32769,32 @@ xcopy /q /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 false false false true + true + true false true + true + true true + true + true false false true @@ -24860,12 +32842,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24904,12 +32900,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -24941,12 +32951,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false @@ -24978,12 +33002,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25022,12 +33060,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25054,9 +33106,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 @@ -25102,12 +33162,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25146,12 +33220,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25190,12 +33278,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25234,12 +33336,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25262,9 +33378,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 @@ -25299,9 +33423,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 @@ -25334,9 +33466,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 @@ -25369,9 +33509,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 @@ -25416,12 +33564,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false @@ -25453,12 +33615,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25496,6 +33672,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -25514,7 +33691,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -25522,7 +33703,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25539,6 +33754,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -25556,7 +33772,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -25564,7 +33784,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25576,6 +33830,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + Disabled Disabled @@ -25586,23 +33842,37 @@ 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 @@ -25612,36 +33882,61 @@ 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 + false false false @@ -25674,61 +33969,31 @@ xcopy /q /y /i /s /e $(ProjectDir)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 - 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 @@ -25760,12 +34025,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25804,12 +34083,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25823,6 +34116,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -25831,13 +34126,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true true true true + true + true true true true @@ -25852,6 +34153,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -25868,11 +34171,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 @@ -25899,12 +34208,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25943,12 +34266,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -25962,6 +34299,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -25978,11 +34317,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 @@ -25991,13 +34336,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true true true true + true + true true + true + true true true true @@ -26009,9 +34360,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 @@ -26051,12 +34410,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26096,12 +34469,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26141,12 +34528,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26186,12 +34587,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26214,9 +34629,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 @@ -26239,7 +34662,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -26247,6 +34674,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true true true @@ -26261,8 +34690,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 @@ -26291,12 +34726,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26328,12 +34777,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26365,12 +34828,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26379,8 +34856,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - + + @@ -26390,9 +34867,15 @@ 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 @@ -26415,10 +34898,20 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26458,12 +34951,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false false true @@ -26485,7 +34992,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -26493,6 +35004,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -26507,48 +35020,14 @@ 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 - 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 @@ -26565,7 +35044,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -26573,6 +35056,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -26587,8 +35072,14 @@ 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 @@ -26597,8 +35088,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -26634,12 +35131,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26681,12 +35192,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26697,8 +35222,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -26729,18 +35260,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26777,12 +35316,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false true true @@ -26794,12 +35347,26 @@ xcopy /q /y /i /s /e $(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 @@ -26839,12 +35406,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -26881,7 +35462,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -26889,6 +35474,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true true @@ -26903,8 +35490,14 @@ 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 @@ -26913,18 +35506,32 @@ xcopy /q /y /i /s /e $(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 @@ -26975,11 +35582,23 @@ 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 + false false false false @@ -26992,18 +35611,32 @@ xcopy /q /y /i /s /e $(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 @@ -27030,18 +35663,32 @@ xcopy /q /y /i /s /e $(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 @@ -27068,18 +35715,32 @@ xcopy /q /y /i /s /e $(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 @@ -27111,9 +35772,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 @@ -27142,7 +35811,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -27158,8 +35831,14 @@ 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 @@ -27168,18 +35847,34 @@ 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 + true + true true + true + true true true true @@ -27212,50 +35907,26 @@ xcopy /q /y /i /s /e $(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 true true @@ -27288,12 +35959,26 @@ xcopy /q /y /i /s /e $(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 @@ -27326,12 +36011,26 @@ xcopy /q /y /i /s /e $(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 @@ -27364,12 +36063,26 @@ xcopy /q /y /i /s /e $(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 @@ -27402,12 +36115,26 @@ xcopy /q /y /i /s /e $(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 @@ -27440,12 +36167,26 @@ xcopy /q /y /i /s /e $(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 @@ -27478,12 +36219,26 @@ xcopy /q /y /i /s /e $(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 @@ -27516,12 +36271,26 @@ xcopy /q /y /i /s /e $(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 @@ -27554,12 +36323,26 @@ xcopy /q /y /i /s /e $(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 @@ -27592,12 +36375,26 @@ xcopy /q /y /i /s /e $(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 @@ -27630,12 +36427,26 @@ xcopy /q /y /i /s /e $(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 @@ -27668,12 +36479,26 @@ xcopy /q /y /i /s /e $(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 @@ -27706,12 +36531,26 @@ xcopy /q /y /i /s /e $(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 @@ -27744,12 +36583,26 @@ xcopy /q /y /i /s /e $(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 @@ -27782,12 +36635,26 @@ xcopy /q /y /i /s /e $(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 @@ -27820,12 +36687,26 @@ xcopy /q /y /i /s /e $(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 @@ -27865,7 +36746,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -27873,6 +36758,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true + true true true false @@ -27880,7 +36767,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true false @@ -27914,49 +36805,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -27988,12 +36856,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28025,12 +36907,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28069,12 +36965,26 @@ 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 @@ -28106,12 +37016,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28143,12 +37067,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28180,12 +37118,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28217,12 +37169,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28254,12 +37220,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28298,12 +37278,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28335,12 +37329,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28365,12 +37373,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28409,12 +37431,26 @@ 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 @@ -28446,12 +37482,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28483,12 +37533,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28520,12 +37584,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28557,12 +37635,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28594,12 +37686,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28638,12 +37744,26 @@ 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 @@ -28668,12 +37788,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -28689,50 +37823,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 - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -28763,12 +37853,26 @@ 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 @@ -28779,9 +37883,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true @@ -28804,6 +37914,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -28815,6 +37926,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -28832,9 +37945,15 @@ 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 @@ -28874,9 +37993,15 @@ 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 @@ -28892,18 +38017,32 @@ 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 Create Create Create Create false + false + false false false + false + false false + false + false false false Create @@ -28952,7 +38091,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -28960,9 +38103,44 @@ xcopy /q /y /i /s /e $(ProjectDir)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 + @@ -28975,6 +38153,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -28987,7 +38166,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -28995,7 +38178,41 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -29047,12 +38264,26 @@ 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 true true true @@ -29087,6 +38318,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + true true @@ -29104,12 +38336,26 @@ 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 + false false + false + false true true true @@ -29149,12 +38395,26 @@ 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 + false false + false + false true true true @@ -29194,12 +38454,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 @@ -29260,17 +38527,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 @@ -29303,9 +38589,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -29333,9 +38625,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -29363,9 +38661,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -29411,12 +38715,18 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true false false true true true + true + true false true true @@ -29425,8 +38735,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true + true + true false false false @@ -29461,12 +38777,26 @@ 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 + false false + false + false false false false @@ -29483,11 +38813,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 @@ -29498,8 +38834,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 @@ -29507,9 +38849,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -29537,9 +38885,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true true true true @@ -29576,9 +38930,15 @@ 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 @@ -29594,18 +38954,32 @@ 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 NotUsing NotUsing NotUsing NotUsing true + true + true true true + true + true true + true + true true true true @@ -29633,15 +39007,29 @@ xcopy /q /y /i /s /e $(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 @@ -29671,15 +39059,29 @@ xcopy /q /y /i /s /e $(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 @@ -29709,15 +39111,29 @@ xcopy /q /y /i /s /e $(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 @@ -29755,7 +39171,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true false false true @@ -29763,6 +39183,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true false true true @@ -29777,26 +39199,46 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + 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 + true true + true + true true true true @@ -29823,15 +39265,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -29865,15 +39321,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -29907,15 +39377,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -29949,15 +39433,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -29991,15 +39489,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30033,15 +39545,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30075,15 +39601,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30117,15 +39657,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30159,15 +39713,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30201,15 +39769,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30243,15 +39825,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30285,15 +39881,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30327,15 +39937,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30369,15 +39993,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30411,15 +40049,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30453,15 +40105,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30495,15 +40161,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30537,15 +40217,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30579,15 +40273,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30621,15 +40329,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30663,15 +40385,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30705,15 +40441,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30747,15 +40497,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30789,15 +40553,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30831,15 +40609,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30873,15 +40665,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30915,15 +40721,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30957,15 +40777,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -30999,15 +40833,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31041,15 +40889,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31083,15 +40945,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31125,15 +41001,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31181,15 +41071,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31223,15 +41127,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31265,15 +41183,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31307,15 +41239,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31349,15 +41295,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31391,15 +41351,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31433,15 +41407,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31475,15 +41463,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31517,15 +41519,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31559,15 +41575,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31601,15 +41631,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31643,15 +41687,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31685,15 +41743,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31727,15 +41799,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31769,15 +41855,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31811,15 +41911,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31853,15 +41967,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31895,15 +42023,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31937,15 +42079,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -31979,15 +42135,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32021,15 +42191,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32063,15 +42247,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32105,15 +42303,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32147,15 +42359,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32189,15 +42415,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32231,15 +42471,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32273,15 +42527,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32315,15 +42583,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32357,15 +42639,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32399,15 +42695,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32441,15 +42751,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32483,15 +42807,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32525,15 +42863,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32567,15 +42919,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32609,15 +42975,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32651,15 +43031,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32693,15 +43087,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32735,15 +43143,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32777,15 +43199,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32819,15 +43255,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32861,15 +43311,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32903,15 +43367,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32945,15 +43423,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -32987,15 +43479,29 @@ xcopy /q /y /i /s /e $(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 false + false + false true true true @@ -33033,13 +43539,27 @@ xcopy /q /y /i /s /e $(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 @@ -33053,14 +43573,28 @@ xcopy /q /y /i /s /e $(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 @@ -33101,12 +43635,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33138,12 +43686,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33176,12 +43738,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33221,12 +43797,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33237,9 +43827,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true true + true + true true + true + true false false true @@ -33257,9 +43853,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 @@ -33291,14 +43895,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 + true true true true @@ -33318,7 +43936,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true false @@ -33326,12 +43948,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 @@ -33344,7 +43970,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -33352,12 +43982,16 @@ 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 @@ -33370,7 +44004,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -33378,19 +44016,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 + true + true true + true + true true true true @@ -33400,8 +44048,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true + true true + true + true true + true + true true true true @@ -33412,8 +44066,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true + true true + true + true true + true + true true true true @@ -33423,8 +44083,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true + true true + true + true true + true + true true true true @@ -33434,13 +44100,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 @@ -33472,12 +44150,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33516,12 +44208,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33560,12 +44266,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33586,8 +44306,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 @@ -33606,8 +44332,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 @@ -33626,8 +44358,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 @@ -33657,12 +44395,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33691,12 +44443,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -33704,12 +44470,26 @@ xcopy /q /y /i /s /e $(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 @@ -33738,12 +44518,26 @@ xcopy /q /y /i /s /e $(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 @@ -33784,8 +44578,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 @@ -33793,12 +44593,26 @@ xcopy /q /y /i /s /e $(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 @@ -33827,12 +44641,26 @@ xcopy /q /y /i /s /e $(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 @@ -33873,8 +44701,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 @@ -33882,12 +44716,26 @@ xcopy /q /y /i /s /e $(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 @@ -33916,12 +44764,26 @@ xcopy /q /y /i /s /e $(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 @@ -33962,8 +44824,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 @@ -33971,12 +44839,26 @@ xcopy /q /y /i /s /e $(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 @@ -34005,12 +44887,26 @@ xcopy /q /y /i /s /e $(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 @@ -34051,8 +44947,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 @@ -34068,7 +44970,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -34076,6 +44982,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true @@ -34088,7 +44996,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -34096,6 +45008,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true @@ -34108,7 +45022,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -34116,12 +45034,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true false true - true + false true false true @@ -34148,12 +45068,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34192,12 +45126,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34236,12 +45184,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34253,7 +45215,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34280,12 +45242,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34324,12 +45300,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34368,12 +45358,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34385,7 +45389,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34412,12 +45416,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34456,12 +45474,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34500,12 +45532,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34517,7 +45563,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34544,12 +45590,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34588,12 +45648,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34632,12 +45706,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34646,24 +45734,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true @@ -34687,12 +45765,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34724,12 +45816,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -34738,22 +45844,10 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - - - true - true - - - true - true - - - true - true - + true true @@ -34764,12 +45858,26 @@ xcopy /q /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 + false false + false + false true + true + true true true true @@ -34795,12 +45903,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false + false + false true true true @@ -34833,12 +45955,26 @@ xcopy /q /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 + false false + false + false true + true + true true true true @@ -34878,12 +46014,26 @@ 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 true + true + true true + true + true false + false + false true true true @@ -34902,7 +46052,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false + false false + false + false true true true @@ -34910,20 +46064,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 + true true @@ -34936,7 +46098,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true true + true + true true true true @@ -34944,20 +46110,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue 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 @@ -35093,18 +46267,32 @@ xcopy /q /y /i /s /e $(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 @@ -35136,18 +46324,32 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35176,8 +46378,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true + true + true true true true @@ -35191,18 +46399,32 @@ 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 @@ -35233,18 +46455,32 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35273,10 +46509,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true true true + true + true true @@ -35290,15 +46532,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 + true true + true + true true + true + true true true true @@ -35334,18 +46590,32 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35369,18 +46639,32 @@ 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 @@ -35411,18 +46695,32 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35451,10 +46749,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true true + true + true true true true + true + true true @@ -35487,12 +46791,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35531,12 +46849,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 false true true @@ -35549,18 +46881,32 @@ xcopy /q /y /i /s /e $(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 @@ -35604,9 +46950,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 @@ -35622,9 +46976,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 @@ -35680,12 +47040,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35720,12 +47094,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35760,12 +47148,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35814,12 +47216,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35847,12 +47263,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35887,12 +47317,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35927,12 +47371,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -35967,12 +47425,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36007,12 +47479,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36047,12 +47533,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36089,12 +47589,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36129,12 +47643,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36169,12 +47697,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36221,12 +47763,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36256,12 +47812,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36296,12 +47866,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36336,12 +47920,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36376,12 +47974,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36416,12 +48028,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36456,12 +48082,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36494,12 +48134,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36533,12 +48187,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36572,12 +48240,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36629,12 +48311,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36656,12 +48352,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36695,12 +48405,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36734,12 +48458,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36773,12 +48511,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36812,12 +48564,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36851,12 +48617,26 @@ xcopy /q /y /i /s /e $(ProjectDir)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 @@ -36883,20 +48663,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..2be7710a 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -723,6 +723,12 @@ {0061db22-43de-4b54-a161-c43958cdcd7e} + + {889a84db-3009-4a7c-8234-4bf93d412690} + + + {e5d7fb24-25b8-413c-84ec-974bf0d4a3d1} + @@ -2434,15 +2440,9 @@ Common - - net\minecraft\client\model - net\minecraft\client\model - - net\minecraft\client\renderer\entity - net\minecraft\client\renderer\entity @@ -3193,9 +3193,6 @@ PS3\Source Files\Leaderboards - - PS3\Source Files\Leaderboards - Common\Source Files\Leaderboards @@ -3466,18 +3463,12 @@ PSVita - - PSVita\Source Files - PSVita\GameConfig Orbis\Network - - Orbis\Source Files\Leaderboards - Common\Source Files\UI\Scenes\Debug @@ -3574,9 +3565,6 @@ PSVita\Source Files\Network - - PSVita\Source Files\Leaderboards - PSVita\Source Files\Leaderboards @@ -3628,6 +3616,165 @@ 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 + + + Windows64\Source Files\Network + @@ -4812,15 +4959,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 +4980,6 @@ PS3\ChunkRebuild_SPU - - PS3\ChunkRebuild_SPU - PS3\ChunkRebuild_SPU @@ -5268,9 +5406,6 @@ PS3\Source Files\Leaderboards - - PS3\Source Files\Leaderboards - Common\Source Files\Leaderboards @@ -5490,9 +5625,6 @@ PSVita - - PSVita\Source Files - PSVita\Source Files @@ -5505,9 +5637,6 @@ Common\Source Files\Network\Sony - - Orbis\Source Files\Leaderboards - Common\Source Files\UI\Scenes\Debug @@ -5598,9 +5727,6 @@ PSVita\Source Files\Network - - PSVita\Source Files\Leaderboards - PSVita\Source Files\Leaderboards @@ -5640,9 +5766,165 @@ 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 + + Windows64\Source Files\Network + @@ -5870,25 +6152,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 +6287,12 @@ + + + Source Files + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.user b/Minecraft.Client/Minecraft.Client.vcxproj.user index cf9782cd..09a7ebc4 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.user +++ b/Minecraft.Client/Minecraft.Client.vcxproj.user @@ -3,4 +3,20 @@ Debug + + $(SolutionDir)$(Platform)\$(Configuration)\ + WindowsLocalDebugger + + + $(SolutionDir)$(Platform)\$(Configuration)\ + WindowsLocalDebugger + + + $(SolutionDir)$(Platform)\$(Configuration)\ + WindowsLocalDebugger + + + $(SolutionDir)$(Platform)\$(Configuration)\ + WindowsLocalDebugger + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index 3192410d..bd75a61a 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 } @@ -1244,7 +1191,7 @@ void Minecraft::applyFrameMouseLook() KMInput.ConsumeMouseDelta(rawDx, rawDy); if (rawDx == 0.0f && rawDy == 0.0f) continue; - float mouseSensitivity = 0.5f; + float mouseSensitivity = ((float)app.GetGameSettings(iPad, eGameSetting_Sensitivity_InGame)) / 100.0f; float mdx = rawDx * mouseSensitivity; float mdy = -rawDy * mouseSensitivity; if (app.GetGameSettings(iPad, eGameSetting_ControlInvertLook)) @@ -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 @@ -1509,7 +1456,7 @@ void Minecraft::run_middle() if (KMInput.ConsumeKeyPress('C')) localplayers[i]->ullButtonsPressed |= 1LL<ullButtonsPressed |= 1LL<abilities.flying && KMInput.IsKeyDown(VK_SHIFT)) + if (localplayers[i]->abilities.flying && KMInput.IsKeyDown(VK_SHIFT) && !ui.GetMenuDisplayed(i)) localplayers[i]->ullButtonsPressed |= 1LL<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,10 +2635,25 @@ 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::chest_Id: + *piAction = IDS_TOOLTIPS_MINE; + *piUse = (Tile::chest->getContainer(level,x,y,z) != NULL) ? IDS_TOOLTIPS_OPEN : -1; + break; + + 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: @@ -2673,18 +2661,12 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piAction=IDS_TOOLTIPS_MINE; break; - case Tile::chest_Id: - case Tile::enderChest_Id: - *piUse=IDS_TOOLTIPS_OPEN; - *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; - switch(iID) + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + + if (animal->isLeashed() && animal->getLeashHolder() == player) { + *piUse=IDS_TOOLTIPS_UNLEASH; + break; + } + + 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; - 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; - } - } + *piUse=IDS_TOOLTIPS_UNLEASH; break; } + + 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: + { + 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_MUSHROOMCOW: - // is there an object in hand? - if(player->inventory->IsHeldItem()) - { - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; - - // It's an item - switch(iID) - { - // 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; - 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; - } - 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; - } - } - 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; + + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + + if (animal->isLeashed() && animal->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + break; + } + + // It's an item + 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::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: + { + 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_BOAT: *piAction=IDS_TOOLTIPS_MINE; - - // are we in the boat already? - if (dynamic_pointer_cast( player->riding ) != NULL) - { - *piUse=IDS_TOOLTIPS_EXIT; - } - else - { - *piUse=IDS_TOOLTIPS_SAIL; - } + *piUse=IDS_TOOLTIPS_SAIL; 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; - } - } + 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_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; + + shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); + + if (sheep->isLeashed() && sheep->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; break; } - } - 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; - - 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; - } - } - 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()) - { - *piUse=IDS_TOOLTIPS_RIDE; + case -1: break; // 4J-JEV: Empty hand. } - else if (!dynamic_pointer_cast(hitResult->entity)->isBaby()) + } + break; + + case eTYPE_PIG: + { + // 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) + { + if (!pig->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + } + 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()) - { - heldItem=player->inventory->getSelected(); - iID=heldItem->getItem()->id; - } - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - switch(iID) + if (wolf->isLeashed() && wolf->getLeashHolder() == player) { + *piUse=IDS_TOOLTIPS_UNLEASH; + break; + } + + 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; - if(player->inventory->IsHeldItem()) - { - heldItem=player->inventory->getSelected(); - } - - if ( zomb->isVillager() && zomb->isWeakened() //zomb->hasEffect(MobEffect::weakness) - not present on client. - && heldItem != NULL && heldItem->getItem()->id == Item::apple_gold_Id ) + //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; - default: - *piAction=IDS_TOOLTIPS_HIT; + + case eTYPE_HORSE: + { + shared_ptr horse = dynamic_pointer_cast(hitResult->entity); + + bool heldItemIsFood = false, heldItemIsLove = false, heldItemIsArmour = false; + + switch( heldItemId ) + { + 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 (horse->isLeashed() && horse->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + } + 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; } } } - 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) ) @@ -3457,8 +3618,6 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if((player->ullButtonsPressed&(1LL<renderDebug = !options->renderDebug; #ifdef _XBOX app.EnableDebugOverlay(options->renderDebug,iPad); #else @@ -3468,13 +3627,11 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) #endif } - if((player->ullButtonsPressed&(1LL< mob = dynamic_pointer_cast(Creeper::_class->newInstance( level )); - //shared_ptr mob = dynamic_pointer_cast(Wolf::_class->newInstance( level )); - shared_ptr mob = dynamic_pointer_cast(shared_ptr(new Spider( level ))); - mob->moveTo(player->x+1, player->y, player->z+1, level->random->nextFloat() * 360, 0); - level->addEntity(mob); + if((player->ullButtonsPressed&(1LL<renderDebug = !options->renderDebug; +#endif } } @@ -3502,14 +3659,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 +3726,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 +3988,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 +4007,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 +4273,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 +4392,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 +4403,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 +4436,6 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) if (localPlayer != NULL) { - level->removeEntity(localPlayer); } @@ -4321,7 +4456,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 +4655,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 +4714,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 +4724,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 +4948,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 +4976,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 +5009,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 +5053,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 +5120,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 5e7ce794..a81bce59 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" @@ -25,6 +27,11 @@ #include "..\Minecraft.World\Pos.h" #include "..\Minecraft.World\System.h" #include "..\Minecraft.World\StringHelpers.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "..\Minecraft.World\net.minecraft.world.damagesource.h" +#include #ifdef SPLIT_SAVES #include "..\Minecraft.World\ConsoleSaveFileSplit.h" #endif @@ -48,6 +55,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,25 +71,463 @@ __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; +static void PrintConsoleLine(const wchar_t *prefix, const wstring &message) +{ + wprintf(L"%ls%ls\n", prefix, message.c_str()); + fflush(stdout); +} + +static bool TryParseIntValue(const wstring &text, int &value) +{ + std::wistringstream stream(text); + stream >> value; + return !stream.fail() && stream.eof(); +} + +static vector SplitConsoleCommand(const wstring &command) +{ + vector tokens; + std::wistringstream stream(command); + wstring token; + while (stream >> token) + { + tokens.push_back(token); + } + return tokens; +} + +static wstring JoinConsoleCommandTokens(const vector &tokens, size_t startIndex) +{ + wstring joined; + for (size_t i = startIndex; i < tokens.size(); ++i) + { + if (!joined.empty()) joined += L" "; + joined += tokens[i]; + } + return joined; +} + +static shared_ptr FindPlayerByName(PlayerList *playerList, const wstring &name) +{ + if (playerList == NULL) return nullptr; + + for (size_t i = 0; i < playerList->players.size(); ++i) + { + shared_ptr player = playerList->players[i]; + if (player != NULL && equalsIgnoreCase(player->getName(), name)) + { + return player; + } + } + + return nullptr; +} + +static void SetAllLevelTimes(MinecraftServer *server, int value) +{ + for (unsigned int i = 0; i < server->levels.length; ++i) + { + if (server->levels[i] != NULL) + { + server->levels[i]->setDayTime(value); + } + } +} + +static bool ExecuteConsoleCommand(MinecraftServer *server, const wstring &rawCommand) +{ + if (server == NULL) + return false; + + wstring command = trimString(rawCommand); + if (command.empty()) + return true; + + if (command[0] == L'/') + { + command = trimString(command.substr(1)); + } + + vector tokens = SplitConsoleCommand(command); + if (tokens.empty()) + return true; + + const wstring action = toLower(tokens[0]); + PlayerList *playerList = server->getPlayers(); + + if (action == L"help" || action == L"?") + { + server->info(L"Commands: help, stop, list, say , save-all, time , weather [seconds], tp , give [amount] [aux], enchant [level], kill "); + return true; + } + + if (action == L"stop") + { + server->info(L"Stopping server..."); + MinecraftServer::HaltServer(); + return true; + } + + if (action == L"list") + { + wstring playerNames = (playerList != NULL) ? playerList->getPlayerNames() : L""; + if (playerNames.empty()) playerNames = L"(none)"; + server->info(L"Players (" + _toString((playerList != NULL) ? playerList->getPlayerCount() : 0) + L"): " + playerNames); + return true; + } + + if (action == L"say") + { + if (tokens.size() < 2) + { + server->warn(L"Usage: say "); + return false; + } + + wstring message = L"[Server] " + JoinConsoleCommandTokens(tokens, 1); + if (playerList != NULL) + { + playerList->broadcastAll(shared_ptr(new ChatPacket(message))); + } + server->info(message); + return true; + } + + if (action == L"save-all") + { + if (playerList != NULL) + { + playerList->saveAll(NULL, false); + } + server->info(L"World saved."); + return true; + } + + if (action == L"time") + { + if (tokens.size() < 2) + { + server->warn(L"Usage: time set | time add "); + return false; + } + + if (toLower(tokens[1]) == L"add") + { + if (tokens.size() < 3) + { + server->warn(L"Usage: time add "); + return false; + } + + int delta = 0; + if (!TryParseIntValue(tokens[2], delta)) + { + server->warn(L"Invalid tick value: " + tokens[2]); + return false; + } + + for (unsigned int i = 0; i < server->levels.length; ++i) + { + if (server->levels[i] != NULL) + { + server->levels[i]->setDayTime(server->levels[i]->getDayTime() + delta); + } + } + + server->info(L"Added " + _toString(delta) + L" ticks."); + return true; + } + + wstring timeValue = toLower(tokens[1]); + if (timeValue == L"set") + { + if (tokens.size() < 3) + { + server->warn(L"Usage: time set "); + return false; + } + timeValue = toLower(tokens[2]); + } + + int targetTime = 0; + if (timeValue == L"day") + { + targetTime = 0; + } + else if (timeValue == L"night") + { + targetTime = 12500; + } + else if (!TryParseIntValue(timeValue, targetTime)) + { + server->warn(L"Invalid time value: " + timeValue); + return false; + } + + SetAllLevelTimes(server, targetTime); + server->info(L"Time set to " + _toString(targetTime) + L"."); + return true; + } + + if (action == L"weather") + { + if (tokens.size() < 2) + { + server->warn(L"Usage: weather [seconds]"); + return false; + } + + int durationSeconds = 600; + if (tokens.size() >= 3 && !TryParseIntValue(tokens[2], durationSeconds)) + { + server->warn(L"Invalid duration: " + tokens[2]); + return false; + } + + if (server->levels[0] == NULL) + { + server->warn(L"The overworld is not loaded."); + return false; + } + + LevelData *levelData = server->levels[0]->getLevelData(); + int duration = durationSeconds * SharedConstants::TICKS_PER_SECOND; + levelData->setRainTime(duration); + levelData->setThunderTime(duration); + + wstring weather = toLower(tokens[1]); + if (weather == L"clear") + { + levelData->setRaining(false); + levelData->setThundering(false); + } + else if (weather == L"rain") + { + levelData->setRaining(true); + levelData->setThundering(false); + } + else if (weather == L"thunder") + { + levelData->setRaining(true); + levelData->setThundering(true); + } + else + { + server->warn(L"Usage: weather [seconds]"); + return false; + } + + server->info(L"Weather set to " + weather + L"."); + return true; + } + + if (action == L"tp" || action == L"teleport") + { + if (tokens.size() < 3) + { + server->warn(L"Usage: tp "); + return false; + } + + shared_ptr subject = FindPlayerByName(playerList, tokens[1]); + shared_ptr destination = FindPlayerByName(playerList, tokens[2]); + if (subject == NULL) + { + server->warn(L"Unknown player: " + tokens[1]); + return false; + } + if (destination == NULL) + { + server->warn(L"Unknown player: " + tokens[2]); + return false; + } + if (subject->level->dimension->id != destination->level->dimension->id || !subject->isAlive()) + { + server->warn(L"Teleport failed because the players are not in the same dimension or the source player is dead."); + return false; + } + + subject->ride(nullptr); + subject->connection->teleport(destination->x, destination->y, destination->z, destination->yRot, destination->xRot); + server->info(L"Teleported " + subject->getName() + L" to " + destination->getName() + L"."); + return true; + } + + if (action == L"give") + { + if (tokens.size() < 3) + { + server->warn(L"Usage: give [amount] [aux]"); + return false; + } + + shared_ptr player = FindPlayerByName(playerList, tokens[1]); + if (player == NULL) + { + server->warn(L"Unknown player: " + tokens[1]); + return false; + } + + int itemId = 0; + int amount = 1; + int aux = 0; + if (!TryParseIntValue(tokens[2], itemId)) + { + server->warn(L"Invalid item id: " + tokens[2]); + return false; + } + if (tokens.size() >= 4 && !TryParseIntValue(tokens[3], amount)) + { + server->warn(L"Invalid amount: " + tokens[3]); + return false; + } + if (tokens.size() >= 5 && !TryParseIntValue(tokens[4], aux)) + { + server->warn(L"Invalid aux value: " + tokens[4]); + return false; + } + if (itemId <= 0 || Item::items[itemId] == NULL) + { + server->warn(L"Unknown item id: " + _toString(itemId)); + return false; + } + if (amount <= 0) + { + server->warn(L"Amount must be positive."); + return false; + } + + shared_ptr itemInstance(new ItemInstance(itemId, amount, aux)); + shared_ptr drop = player->drop(itemInstance); + if (drop != NULL) + { + drop->throwTime = 0; + } + server->info(L"Gave item " + _toString(itemId) + L" x" + _toString(amount) + L" to " + player->getName() + L"."); + return true; + } + + if (action == L"enchant") + { + if (tokens.size() < 3) + { + server->warn(L"Usage: enchant [level]"); + return false; + } + + shared_ptr player = FindPlayerByName(playerList, tokens[1]); + if (player == NULL) + { + server->warn(L"Unknown player: " + tokens[1]); + return false; + } + + int enchantmentId = 0; + int enchantmentLevel = 1; + if (!TryParseIntValue(tokens[2], enchantmentId)) + { + server->warn(L"Invalid enchantment id: " + tokens[2]); + return false; + } + if (tokens.size() >= 4 && !TryParseIntValue(tokens[3], enchantmentLevel)) + { + server->warn(L"Invalid enchantment level: " + tokens[3]); + return false; + } + + shared_ptr selectedItem = player->getSelectedItem(); + if (selectedItem == NULL) + { + server->warn(L"The player is not holding an item."); + return false; + } + + Enchantment *enchantment = Enchantment::enchantments[enchantmentId]; + if (enchantment == NULL) + { + server->warn(L"Unknown enchantment id: " + _toString(enchantmentId)); + return false; + } + if (!enchantment->canEnchant(selectedItem)) + { + server->warn(L"That enchantment cannot be applied to the selected item."); + return false; + } + + if (enchantmentLevel < enchantment->getMinLevel()) enchantmentLevel = enchantment->getMinLevel(); + if (enchantmentLevel > enchantment->getMaxLevel()) enchantmentLevel = enchantment->getMaxLevel(); + + if (selectedItem->hasTag()) + { + ListTag *enchantmentTags = selectedItem->getEnchantmentTags(); + if (enchantmentTags != NULL) + { + for (int i = 0; i < enchantmentTags->size(); i++) + { + int type = enchantmentTags->get(i)->getShort((wchar_t *)ItemInstance::TAG_ENCH_ID); + if (Enchantment::enchantments[type] != NULL && !Enchantment::enchantments[type]->isCompatibleWith(enchantment)) + { + server->warn(L"That enchantment conflicts with an existing enchantment on the selected item."); + return false; + } + } + } + } + + selectedItem->enchant(enchantment, enchantmentLevel); + server->info(L"Enchanted " + player->getName() + L"'s held item with " + _toString(enchantmentId) + L" " + _toString(enchantmentLevel) + L"."); + return true; + } + + if (action == L"kill") + { + if (tokens.size() < 2) + { + server->warn(L"Usage: kill "); + return false; + } + + shared_ptr player = FindPlayerByName(playerList, tokens[1]); + if (player == NULL) + { + server->warn(L"Unknown player: " + tokens[1]); + return false; + } + + player->hurt(DamageSource::outOfWorld, 3.4e38f); + server->info(L"Killed " + player->getName() + L"."); + return true; + } + + server->warn(L"Unknown command: " + command); + return false; +} + 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,184 +539,199 @@ MinecraftServer::MinecraftServer() m_ugcPlayersVersion = 0; m_texturePackId = 0; maxBuildHeight = Level::maxBuildHeight; + playerIdleTimeout = 0; m_postUpdateThread = NULL; + forceGameType = false; commandDispatcher = new ServerCommandDispatcher(); + InitializeCriticalSection(&m_consoleInputCS); + + DispenserBootstrap::bootStrap(); } MinecraftServer::~MinecraftServer() { + DeleteCriticalSection(&m_consoleInputCS); } bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed) { // 4J - removed #if 0 - commands = new ConsoleCommands(this); + 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(); + 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); + 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\""); - } + 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"); + logger.info("Loading properties"); #endif - settings = new Settings(new File(L"server.properties")); + 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"); + app.SetGameHostOption(eGameHostOption_Difficulty, settings->getInt(L"difficulty", app.GetGameHostOption(eGameHostOption_Difficulty))); + app.SetGameHostOption(eGameHostOption_GameType, settings->getInt(L"gamemode", app.GetGameHostOption(eGameHostOption_GameType))); + app.SetGameHostOption(eGameHostOption_Structures, settings->getBoolean(L"generate-structures", app.GetGameHostOption(eGameHostOption_Structures) > 0) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_BonusChest, settings->getBoolean(L"bonus-chest", app.GetGameHostOption(eGameHostOption_BonusChest) > 0) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_PvP, settings->getBoolean(L"pvp", app.GetGameHostOption(eGameHostOption_PvP) > 0) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_TrustPlayers, settings->getBoolean(L"trust-players", app.GetGameHostOption(eGameHostOption_TrustPlayers) > 0) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_FireSpreads, settings->getBoolean(L"fire-spreads", app.GetGameHostOption(eGameHostOption_FireSpreads) > 0) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_TNT, settings->getBoolean(L"tnt", app.GetGameHostOption(eGameHostOption_TNT) > 0) ? 1 : 0); - // 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) ); + 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"); - // 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('�', '$'); + // 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) ); - 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 - 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('�', '$'); - // 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); + setAnimals(settings->getBoolean(L"spawn-animals", true)); + setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); + setPvpAllowed(app.GetGameHostOption( eGameHostOption_PvP )>0?true:false); - // 4J Stu - Enabling flight to stop it kicking us when we use it + // 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(settings->getBoolean(L"allow-flight", true)); + + // 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); + // 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; - } + 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."); - } + 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 = (initData && !initData->levelName.empty()) ? initData->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; - } - } -#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 \"?\""); - - // 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; + 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 \"?\""); - g_NetworkManager.ServerReady(); // 4J added - return m_bLoaded; + // 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; } @@ -305,7 +769,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 +789,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 +841,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 +868,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 +908,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 +937,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 +1019,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 +1071,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 +1086,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 +1109,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 +1128,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 +1169,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 +1193,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 +1208,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 +1317,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 +1329,7 @@ void MinecraftServer::saveAllChunks() level->closeLevelStorage(); } } - } + } } // 4J-JEV: Added @@ -863,7 +1418,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 +1432,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 +1447,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 +1462,7 @@ void MinecraftServer::stopServer() // ServerLevel *level = levels[i]; // if (level != NULL) // { - saveAllChunks(); + saveAllChunks(); // } //} @@ -1028,6 +1583,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 +1598,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 +1676,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 +1697,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 +1733,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 +1766,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 +1853,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 +1864,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 +1878,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 +1927,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 +1962,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 +1977,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 +2036,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(); - - tickCount++; + AABB::resetPool(); + Vec3::resetPool(); + + 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 +2083,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,48 +2125,54 @@ 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) { + EnterCriticalSection(&m_consoleInputCS); consoleInput.push_back(new ConsoleInput(msg, source)); + LeaveCriticalSection(&m_consoleInputCS); } void MinecraftServer::handleConsoleInputs() { - while (consoleInput.size() > 0) + vector pendingInputs; + EnterCriticalSection(&m_consoleInputCS); + pendingInputs.swap(consoleInput); + LeaveCriticalSection(&m_consoleInputCS); + + for (size_t i = 0; i < pendingInputs.size(); ++i) { - AUTO_VAR(it, consoleInput.begin()); - ConsoleInput *input = *it; - consoleInput.erase(it); -// commands->handleCommand(input); // 4J - removed - TODO - do we want equivalent of console commands? - } + ConsoleInput *input = pendingInputs[i]; + ExecuteConsoleCommand(this, input->msg); + delete input; + } } void MinecraftServer::main(__int64 seed, void *lpParameter) @@ -1593,10 +2204,12 @@ File *MinecraftServer::getFile(const wstring& name) void MinecraftServer::info(const wstring& string) { + PrintConsoleLine(L"[INFO] ", string); } void MinecraftServer::warn(const wstring& string) { + PrintConsoleLine(L"[WARN] ", string); } wstring MinecraftServer::getConsoleName() @@ -1606,21 +2219,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 +2331,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 +2389,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 +2406,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 ac99a415..7fa8c752 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; @@ -100,6 +104,7 @@ private: // vector tickables = new ArrayList(); // 4J - removed CommandDispatcher *commandDispatcher; vector consoleInput; // 4J - was synchronizedList - TODO - investigate + CRITICAL_SECTION m_consoleInputCS; public: bool onlineMode; bool animals; @@ -108,6 +113,8 @@ public: bool allowFlight; wstring motd; int maxBuildHeight; + int playerIdleTimeout; + bool forceGameType; private: // 4J Added @@ -133,8 +140,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(); @@ -149,9 +160,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(); @@ -221,10 +243,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; } @@ -234,9 +262,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) -{ - this->armor = armor; -} - -float MobRenderer::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 MobRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { - // 4J - added - this used to use generics so the input parameter could be a mob (or derived type), but we aren't - // able to do that so dynamically casting to get the more specific type here. 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; + LivingEntityRenderer::render(mob, x, y, z, rot, a); + renderLeash(mob, x, y, z, rot, a); +} - // 4J - removed try/catch -// try -// { - float bodyRot = rotlerp(mob->yBodyRotO, mob->yBodyRot, a); - float headRot = rotlerp(mob->yHeadRotO, mob->yHeadRot, a); +bool MobRenderer::shouldShowName(shared_ptr mob) +{ + return LivingEntityRenderer::shouldShowName(mob) && (mob->shouldShowName() || dynamic_pointer_cast(mob)->hasCustomName() && mob == entityRenderDispatcher->crosshairPickMob); +} - if (mob->isRiding() && dynamic_pointer_cast(mob->riding)) +void MobRenderer::renderLeash(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + 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)) { - 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()) - { - 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++) - { - int armorType = prepareArmor(mob, i, a); - if (armorType > 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); - } + 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); - glDepthMask(true); + 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; - additionalRendering(mob, a); - float br = mob->getBrightness(a); - int overlayColor = getOverlayColor(mob, br, a); - glActiveTexture(GL_TEXTURE1); - glDisable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); + double dx = (float) (endX - startX); + double dy = (float) (endY - startY); + double dz = (float) (endZ - startZ); - if (((overlayColor >> 24) & 0xff) > 0 || mob->hurtTime > 0 || mob->deathTime > 0) + 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++) { - 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), 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)); } - 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); + tessellator->end(); - glEnable(GL_CULL_FACE); + tessellator->begin(GL_TRIANGLE_STRIP); + for (int k = 0; k <= steps; k++) + { + if (k % 2 == 0) + { + 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) + 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); + } + tessellator->end(); - 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); -} - -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) +double MobRenderer::lerp(double prev, double next, double 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) -{ - 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..e7611b37 100644 --- a/Minecraft.Client/MultiPlayerGameMode.cpp +++ b/Minecraft.Client/MultiPlayerGameMode.cpp @@ -6,6 +6,7 @@ #include "Minecraft.h" #include "ClientConnection.h" #include "LevelRenderer.h" +#include "Common\Network\GameNetworkManager.h" #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" @@ -19,8 +20,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,24 +67,42 @@ 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)]; if (oldTile == NULL) return false; +#ifdef _WINDOWS64 + if (g_NetworkManager.IsHost()) + { + level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, oldTile->id + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); + return true; + } +#endif + 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 +123,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 +138,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 +202,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 +232,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 +257,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 +297,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 )) + switch(t) { - 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; + 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 +363,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 +404,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 +487,7 @@ void MultiPlayerGameMode::releaseUsingItem(shared_ptr player) bool MultiPlayerGameMode::hasExperience() { - return true; + return localPlayerMode->isSurvival(); } bool MultiPlayerGameMode::hasMissTime() @@ -462,6 +505,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) -{ - 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::setDataNoUpdate(x, y, z, data)) - { - //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::setTileAndDataNoUpdate(int x, int y, int z, int tile, int data) +bool MultiPlayerLevel::setData(int x, int y, int z, int data, int updateFlags, bool forceUpdate/*=false*/) // 4J added forceUpdate) { // 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 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::setData(x, y, z, data, updateFlags, forceUpdate)) + { + //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::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); 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*/) } } +Tickable *MultiPlayerLevel::makeSoundUpdater(shared_ptr minecart) +{ + return NULL; //new MinecartSoundUpdater(minecraft->soundEngine, minecart, minecraft->player); +} + void MultiPlayerLevel::tickWeather() { - if (dimension->hasCeiling) return; + if (dimension->hasCeiling) return; - if (lightningTime > 0) + oRainLevel = rainLevel; + if (levelData->isRaining()) { - lightningTime--; - } - - 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() +PSVitaLeaderboardManager::PSVitaLeaderboardManager() : SonyLeaderboardManager() {} + +HRESULT PSVitaLeaderboardManager::initialiseScoreUtility() { - m_eStatsState = eStatsState_Idle; - - m_titleContext = -1; - - m_myXUID = INVALID_XUID; - - 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; + return sceNpScoreInit( SCE_KERNEL_DEFAULT_PRIORITY_USER, SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, NULL); } -PSVitaLeaderboardManager::~PSVitaLeaderboardManager() -{ - 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); +bool PSVitaLeaderboardManager::scoreUtilityAlreadyInitialised(HRESULT hr) +{ + return hr == SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED; } -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; +HRESULT PSVitaLeaderboardManager::createTitleContext(const SceNpId &npId) +{ + return sceNpScoreCreateTitleCtx(&s_npCommunicationId, &s_npCommunicationPassphrase, &npId); } -void PSVitaLeaderboardManager::scoreboardThreadInternal() +HRESULT PSVitaLeaderboardManager::destroyTitleContext(int titleContext) { - // 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; - } + return sceNpScoreDestroyTitleCtx(titleContext); } -bool PSVitaLeaderboardManager::getScoreByIds() +HRESULT PSVitaLeaderboardManager::createTransactionContext(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 sceNpScoreCreateRequest(titleContext); } -bool PSVitaLeaderboardManager::getScoreByRange() +HRESULT PSVitaLeaderboardManager::abortTransactionContext(int transactionContext) { - 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 &friendsList) { - ReadView view; - - switch( m_eStatsState ) - { - case eStatsState_Ready: - { - assert(m_scores != NULL || m_readCount == 0); - - view.m_numQueries = m_readCount; - view.m_queries = m_scores; - - // 4J-JEV: Debugging. - //LeaderboardManager::printStats(view); - - eStatsReturn ret = eStatsReturn_NoResults; - if (view.m_numQueries > 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; - } + return sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendsList, false); } -bool PSVitaLeaderboardManager::OpenSession() +char *PSVitaLeaderboardManager::getComment(SceNpScoreComment *comment) { - 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); -} - -void PSVitaLeaderboardManager::fromBase32(void *out, SceNpScoreComment *in) -{ - 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); - } -} - -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) -{ - 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; - } -} - -bool PSVitaLeaderboardManager::SortByRank(const ReadScore &lhs, const ReadScore &rhs) -{ - 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; +protected: - C4JThread *m_threadScoreboard; - bool m_running; + virtual HRESULT initialiseScoreUtility(); - int m_titleContext; - int32_t m_requestId; + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr); - //SceNpId m_myNpId; + virtual HRESULT createTitleContext(const SceNpId &npId); - static int scoreboardThreadEntry(LPVOID lpParam); - void scoreboardThreadInternal(); + virtual HRESULT destroyTitleContext(int titleContext); - bool getScoreByIds(); - bool getScoreByRange(); + virtual HRESULT createTransactionContext(int titleContext); - bool setScore(); - queue m_views; + virtual HRESULT abortTransactionContext(int transactionContext); - CRITICAL_SECTION m_csViewsLock; + virtual HRESULT destroyTransactionContext(int transactionContext); - EStatsState m_eStatsState; //State of the stats read - // EFilterMode m_eFilterMode; + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList); - 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); - - //LeaderboardManager::ReadScore *filterJustScorers(unsigned int &num, LeaderboardManager::ReadScore *friendsData); - - 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); + 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 ) + unsigned char *data = new unsigned char [ dataSize ]; + int bytesRead = playerIncomingData->ReadDataPacket( data, dataSize ); + if( bytesRead > 0 ) { - // 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, 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" - - - Spillet er blevet afbrudt, fordi du loggede ud af "PSN" - - - Ikke logget ind. - - - Dette spil har funktioner, der kræver, at du skal have forbindelse til "PSN", men du er offline i øjeblikket. - - - Ad hoc-netværk offline. - - - 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 - - - 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. + + Det lykkedes ikke at gemme indstillingerne til din Sony Entertainment Network-konto. Sony Entertainment Network-kontoproblem - - Det lykkedes ikke at gemme indstillingerne til din Sony Entertainment Network-konto. + + Der opstod et problem i forsøget på at tilgå din Sony Entertainment Network-konto. Du kan ikke få dit trophy 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? + + 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. + + + Ad hoc-netværk offline. + + + Trophy-problem + + + Spillet er blevet afbrudt, fordi du loggede ud af "PSN" + + + Du er blevet sendt tilbage til startskærmen, fordi du loggede ud af "PSN" + + + Der er ikke nok plads på dit systemlager til at oprette et gemt 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,3281 +1,744 @@  - - 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! - - - Ikke alle svenskere har lyst hår. Der er endda nogle, ligesom Jens fra Mojang, der har rødt hår! - - - Der kommer en opdatering til spillet før eller siden! - - - Hvem er Notch? - - - Mojang har vundet flere priser, end de har medarbejdere! - - - Visse berømtheder spiller Minecraft! - - - deadmau5 er vild med Minecraft! - - - Kig aldrig direkte på en programfejl. - - - Snigerne blev født af en programfejl. - - - Er det en kylling, eller er det en and? - - - Var du på Minecon? - - - Ingen hos Mojang har nogensinde set Junkboys ansigt. - - - Vidste du, at der er en wiki for Minecraft? - - - Mojangs nye kontorer er så seje! - - - Minecon 2013 blev afholdt i Orlando, Florida, USA! - - - .party() var alt for fedt! - - - Antag altid, at rygter er falske, snarere end at tro, at de er sande! - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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*} - - - {*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: 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. - - - {*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. - - - Næste side - - - Forrige side - - - Det grundlæggende - - - Display - - - Lager - - - Kister - - - Fremstilling - - - Ovn - - - Automat - - - Husdyr - - - Dyreavl - - + Brygning - - Fortryllelse + + Redskaber, våben og rustninger - - Portal til Afgrunden + + Materialer - - Multiplayer + + Byggeblokke - - Sådan deler du billeder + + Rødsten og transport - - Blokér baner + + Diverse - + + Placeringer: + + + Afslut uden at gemme + + + Er du sikker på, at du vil afslutte til hovedmenuen? Alle fremskridt, der ikke er gemt, går tabt. + + + Er du sikker på, at du vil afslutte til hovedmenuen? Dine fremskridt går tabt! + + + Det gemte spil er ødelagt. Vil du slette det? + + + 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. + + + Afslut og gem + + + Skab ny verden + + + Indtast et navn til din verden + + + Indtast seed til skabelsen af din verden + + + Indlæs gemt verden + + + Spil introduktion + + + Introduktion + + + Giv din verden et navn + + + Ødelagt gemt spil + + + OK + + + Annullér + + + Minecraft-butikken + + + Rotér + + + Skjul + + + Ryd alle pladser + + + 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. + + + Er du sikker på, at du vil overskrive de tidligere gemte spil fra denne verden med den nuværende version af denne verden? + + + Er du sikker på, at du vil afslutte uden at gemme? Du mister alle dine fremskridt i denne verden! + + + Start spil + + + Afslut spil + + + Gem spil + + + Afslut uden at gemme + + + Tryk på START-knappen for at deltage i spillet + + + 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 kan ikke deltage i dette spil, da værten spiller en nyere version af spillet. + + + Ny verden + + + Belønning oplåst! + + + 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? + + + Venner + + + Mine point + + + Sammenlagt + + + Vent venligst + + + Ingen resultater + + + Filter: + + + Du kan ikke deltage i dette spil, da værten spiller en ældre version af spillet. + + + Forbindelsen blev afbrudt + + + Forbindelsen til serveren blev afbrudt. Afslutter til hovedmenuen. + + + Serveren afbrød forbindelsen + + + Afslutter spillet + + + Der opstod en fejl. Afslutter til hovedmenuen. + + + Kunne ikke oprette forbindelse + + + Du blev smidt ud af spillet + + + Værten har forladt spillet. + + + Du kan ikke deltage i dette spil, fordi du ikke er venner med nogen i spillet. + + + Du kan ikke deltage i dette spil, fordi du tidligere er blevet smidt ud af værten. + + + Du blev smidt ud af spillet, fordi du fløj + + + Det tog for lang tid at oprette forbindelse + + + Serveren er fyldt + + + 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! + + + Temaer + + + Overfladepakker + + + Tillad venner af venner + + + Smid spiller ud + + + Er du sikker på, at du vil smide spilleren ud? Vedkommende kan ikke oprette forbindelse til dit spil igen, før du genstarter verdenen. + + + Pakker med spillerbilleder + + + Du kan ikke tilslutte til spillet, fordi det er begrænset til spillere, der er venner med værten. + + + Indholdet, der kan hentes, er ødelagt + + + Indholdet, der kan hentes, er ødelagt og kan ikke bruges. Du skal slette det og geninstallere det fra menuen i Minecraft-butikken. + + + 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. + + + Kan ikke tilslutte til spil + + + Valgt + + + Valgt overflade: + + + Hent den komplette version + + + Lås op for teksturpakke + + + Du skal låse op for denne teksturpakke for at bruge den i din verden. +Vil du låse op for den nu? + + + Prøveversion af teksturpakke + + + Seed + + + Lås op for overfladepakke + + + Du skal låse op for denne overfladepakke for at bruge den valgte overflade. +Vil du låse op for overfladepakken nu? + + + 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? + + + Download komplet version + + + Denne verden bruger en mash-up-pakke eller teksturpakke, som du mangler! +Vil du installere mash-up-pakken eller teksturpakken nu? + + + Hent prøveversion + + + Teksturpakken er ikke tilgængelig + + + Lås op for den komplette version + + + Download prøveversion + + + Spiltypen er blevet ændret + + + Når denne funktion er slået til, er det kun inviterede spillere, der kan deltage. + + + Når denne funktion er slået til, kan spillere, der er venner med personer på din venneliste, deltage i spillet. + + + Når denne funktion er slået til, kan spillerne skade hinanden. Gælder kun i Overlevelse. + + + Normal + + + Meget flad + + + Når denne funktion er slået til, bliver spillet til et onlinespil. + + + 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. + + + Når denne funktion er slået til, bliver strukturer som landsbyer og fæstninger skabt i verdenen. + + + Når denne funktion er slået til, bliver der skabt en helt flad verden i Oververdenen og Afgrunden. + + + Når denne funktion er slået til, bliver der skabt en kiste med nyttige genstande i nærheden af spillerens gendannelsespunkt. + + + Når denne funktion er slået til, kan ilden sprede sig til brandbare blokke i nærheden. + + + Når denne funktion er slået til, eksploderer TNT, når det aktiveres. + + + 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. + + + Fra + + + Spiltype: Kreativ + + + Overlevelse + + Kreativ - - Indstillinger for vært og spiller + + Omdøb din verden - - Handel + + Indtast et nyt navn til din verden - - Ambolt + + Spiltype: Overlevelse - - Mørket + + Oprettet i Overlevelse - - {*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. + + Omdøb gemte spil - - Spurt + + Gemmer automatisk om %d ... - - Nyt + + Til - - {*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*} - + + Oprettet i Kreativ - - {*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*} + + Vis skyer - - Gør mere skade end næver. + + Hvad vil du gøre med det gemte spil? - - Grav i jord, græs, sand, grus og sne hurtigere end med hænderne. Der skal bruges skovle for at grave snebolde op. + + Display-størrelse (delt skærm) - - Kræves for at udvinde forskellige former for stenblokke og malm. + + Ingrediens - - Hug forskellige former for træ hurtigere end med hænderne. + + Brændsel - - Opdyrk blokke med græs og jord for at gøre plads til afgrøder. - - - Åbn og luk trædøre ved at slå på dem, aktivere dem eller ved hjælp af rødsten. - - - Jerndøre kan kun åbnes ved hjælp af rødsten, knapper eller kontakter. - - - BRUGES IKKE - - - BRUGES IKKE - - - BRUGES IKKE - - - BRUGES IKKE - - - Giver dig 1 rustning, når du har den på. - - - Giver dig 3 rustning, når du har den på. - - - Giver dig 2 rustning, når du har den på. - - - Giver dig 1 rustning, når du har den på. - - - Giver dig 2 rustning, når du har den på. - - - Giver dig 5 rustning, når du har den på. - - - Giver dig 4 rustning, når du har den på. - - - Giver dig 1 rustning, når du har den på. - - - Giver dig 2 rustning, når du har den på. - - - Giver dig 6 rustning, når du har den på. - - - Giver dig 5 rustning, når du har den på. - - - Giver dig 2 rustning, når du har den på. - - - Giver dig 2 rustning, når du har den på. - - - Giver dig 5 rustning, når du har den på. - - - Giver dig 3 rustning, når du har den på. - - - Giver dig 1 rustning, når du har den på. - - - Giver dig 3 rustning, når du har den på. - - - Giver dig 8 rustning, når du har den på. - - - Giver dig 6 rustning, når du har den på. - - - Giver dig 3 rustning, når du har den på. - - - En funklende barre, som du kan lave redskaber ud af. Fremstillet ved bearbejdning af malm i ovnen. - - - 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. - - - 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. - - - Kan bruges til at bygge kompakte trapper med. - - - Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. - - - Kan bruges til at bygge lange trapper med. To fliser placeret ovenpå hinanden skaber en blok af normal størrelse. - - - Giver lys. Fakler kan også smelte sne og is. - - - Bruges som byggemateriale og kan også anvendes til fremstilling af mange genstande. Kan fremstilles af enhver slags træ. - - - Bruges som byggemateriale. Påvirkes ikke af tyngdekraften som normalt sand. - - - Bruges som byggemateriale. - - - Bruges til fremstilling af fakler, pile, skilte, stiger, hegn, samt håndtag til våben og redskaber. - - - 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. - - - Giver dig mulighed for at fremstille et mere varieret udvalg af genstande end ellers. - - - Giver dig mulighed for at smelte malm, fremstille kul og glas samt stege fisk og koteletter. - - - Kan opbevare blokke og genstande. Stil to kister ved siden af hinanden for at skabe en større kiste med dobbelt så meget plads. - - - 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. - - - - Bruges til at klatre lodret med. - - - 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. - - - Viser tekst, der er skrevet af dig eller andre spillere. - - - Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. - - - Skaber eksplosioner. Stil sprængstoffet, og udløs det ved at tænde lunten med et fyrtøj eller en elektrisk ladning. - - - Til svampestuvning. Du får lov at beholde skålen, når stuvningen er spist. - - - Til opbevaring og transport af vand, lava og mælk. - - - Til opbevaring og transport af vand. - - - Til opbevaring og transport af lava. - - - Til opbevaring og transport af mælk. - - - Tænder ild, udløser sprængstof og aktiverer portaler, når rammen er færdig. - - - Bruges til at fiske med. - - - Viser solens og månens placeringer. - - - Peger mod din startposition. - - - Tegner et billede af et område, når du bruger det. Du kan bruge kortet til at finde vej med. - - - Gør det muligt at skyde med pile. - - - Bruges som ammunition til buer. - - - Gendanner 2,5 {*ICON_SHANK_01*}. - - - Gendanner 1 {*ICON_SHANK_01*}. Kan bruges seks gange. - - - Gendanner 1 {*ICON_SHANK_01*}. - - - Gendanner 1 {*ICON_SHANK_01*}. - - - Gendanner 3 {*ICON_SHANK_01*}. - - - Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Indtagelse kan forgifte dig. - - - Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kylling i en ovn. - - - Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. - - - Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege råt kød i en ovn. - - - Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. - - - Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kotelet i en ovn. - - - Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan bruges til at tæmme en ozelot med. - - - Gendanner 2,5 {*ICON_SHANK_01*}. Fremstillet ved at stege rå fisk i en ovn. - - - Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille et guldæble med. - - - Gendanner 2 {*ICON_SHANK_01*} samt energi i fire sekunder. Fremstilles af et æble og guldklumper. - - - Gendanner 2 {*ICON_SHANK_01*}. Indtagelse kan forgifte dig. - - - Bruges i kageopskriften og som ingrediens i eliksirer. - - - Sender en elektrisk ladning, når den tændes eller slukkes. Forbliver tændt eller slukket, indtil der bliver trykket på den igen. - - - 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. - - - Bruges i rødstenskredsløb som gentager, forsinker og/eller diode. - - - Sender en elektrisk strøm, når der trykkes på den. Forbliver aktiveret i cirka et sekund, inden den slukkes igen. - - - Skyder med genstande i tilfældig rækkefølge, når den modtager strøm fra rødsten. - - - 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. - - - - Bruges til at styre minevogne med. - - - 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. - - - Fungerer som en trykplade (sender rødstensstrøm, når den er aktiveret), men kan kun aktiveres af minevogne. - - - Kan transportere dig, et dyr eller et monster på skinnerne. - - - Kan transportere gods på skinnerne. - - - Kan køre på skinner og kan skubbe andre minevogne, når der er kul i den. - - - Rejs hurtigere over vand end ved at svømme. - - - Indsamlet fra får og kan farves. - - - Bruges som byggemateriale og kan farves. Denne opskrift anbefales ikke, fordi det er let at få fat i uld fra får. - - - Bruges som farve til sort uld. - - - Bruges som farve til grøn uld. - - - Bruges som farve til brun uld og ingrediens i småkager eller til dyrkning af kakaobønner. - - - Bruges som farve til sølvfarvet uld. - - - Bruges som farve til gul uld. - - - Bruges som farve til rødt uld. - - - Bruges for at få afgrøder, højt græs, kæmpesvampe og blomster til at vokse øjeblikkeligt og kan bruges i farveopskrifter. - - - Bruges som farve til lyserødt uld. - - - Bruges som farve til orange uld. - - - Bruges som farve til limegrøn uld. - - - Bruges som farve til grå uld. - - - 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.) - - - Bruges som farve til lyseblå uld. - - - Bruges som farve til cyan uld. - - - Bruges som farve til lilla uld. - - - Bruges som farve til magentafarvet uld. - - - Bruges som farve til blå uld. - - - Spiller musikplader. - - - Bruges til fremstilling af meget solide redskaber, våben og rustninger. - - - Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. - - - Bruges til fremstilling af bøger og kort. - - - Bruges til fremstilling af bogreoler eller fortryllede bøger, når de er fortryllede. - - - Skaber kraftigere fortryllelser, når de er placeret omkring et fortryllelsesbord. - - - 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 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. - - - Indeholder rødsten, der kan udvindes med en hakke af jern eller kraftigere materiale. - - - 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æ. - - - 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. - - - 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. - - - 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. - - - 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. - - - En kompakt måde at opbevare snebolde på. - - - Indeholder snebolde, der kan graves op med en skovl. - - - Giver nogle gange hvedefrø, når de graves op. - - - Kan bruges i farve. - - - 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. - - - Stilles på jorden for at lave strøm. Når den brygges i en eliksir, forlænges effekten. - - - 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. - - - 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. - - - Bremser bevægelseshastigheden på alt, der passerer hen over den. - - - 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. - - - 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! - - - Fås fra afgrøder og kan bruges til at lave mad med. - - - 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 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 udvinde glødesten og kan bruges til at fremstille glødesten med igen eller brygges i eliksirer, så effekten forøges. - - - 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. - - - 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. - - - 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 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. - - - Fungerer som en dør, men bruges ofte i et hegn. - - - Fremstilles af melonskiver. - - - Gennemsigtig blok, der kan bruges som alternativ til glasblokke. - - - Kan plantes for at få græskar. - - - 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. - - - 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. - - - Vokser med tiden, når den er blevet plantet. Kan klippes med en saks. Kan bruges som stige. - - - 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. - - - 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. - - - Har forskellige effekter alt afhængigt af, hvad den bruges til. - - - 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. - - - Bruges til eliksirbrygning eller som ingrediens i fremstilling af mørkeøjne eller magmacreme. - - - Bruges til eliksirbrygning. - - - Bruges til fremstilling af eliksirer og kasteeliksirer. - - - Fyldes med regnvand eller en spand vand, hvorefter den kan fylde glasflasker med vand. - - - 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å. - - - 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. - - - Findes i afgrundsfæstningen og efterlader afgrundsurt, når den hakkes i stykker. - - - 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. - - - 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. - - - Sætter ild til ting, eller til at sætte ild til ting automatisk, når den affyres fra en automat. - - - 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. - - - 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. - - - Giver kakaobønner. - - - Hoveder kan bruges som dekoration eller som en maske ved at blive placeret i lagerpladsen for hjelme. - - - Blæksprutte - - - Efterlader en blækpose - - - Ko - - - Efterlader læder, når den bliver dræbt. Kan malkes for mælk med en spand. - - - Får - - - Efterlader uld, når du klipper det (hvis det ikke allerede er blevet klippet). Uld kan farves. - - - Kylling - - - Efterlader fjer og indimellem også æg, når du dræber den. - - - Gris - - - 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. - - - Sniger - - - Eksploderer, hvis du kommer for tæt på! - - - Skelet - - - Skyder pile efter dig. Efterlader pile, når du dræber den. - - - Edderkop. - - - Angriber, når du kommer tæt på. Kan klatre på vægge. Efterlader snor, når du dræber den. - - - Zombie - - - Angriber, når du kommer tæt på. - - - Zombiegrisemand - - - Fredelig, men angriber i flok, hvis du angriber den. - - - Gysling - - - Skyder med ildkugler, der eksploderer, når de rammer. - - - Slim - - - Deler sig i mindre slimklumper, når den bliver skadet. - - - Mørkemand - - - 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. - - - Huleedderkop - - - Har et giftigt bid. - - - Muhsvamp - - - Kan bruges til svampestuvning i en skål. Efterlader svampe og bliver en normal ko, når du klipper den med en saks. - - - Snegolem - - - En snegolem består af sneblokke og et græskar. Den kaster snebolde efter dens skabers fjender. - - - Mørkedrage - - - En stor sort drage, der lever i Mørket. - - - Flammeånd - - - Disse fjender lever i Afgrunden og oftest inde i afgrundsfæstninger. De efterlader flammestave, når de dør. - - - Magmablokke - - - Magmablokkene lever i Afgrunden. Ligesom slim deler de sig i mindre stykker, hvis du dræber dem. - - - Landsbyboer - - - Ozelot - - - 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. - - - Jerngolem - - - Beskytter landsbyerne. Kan fremstilles med blokke af jern og græskar. - - - Sprængstofsanimator - - - Illustrator - - - Talknuser - - - Bøllekoordinator - - - Originalt design og programmering af - - - Projektkoordinator/producer - - - Resten af holdet hos Mojang - - - Lead Game Programmer på Minecraft til pc - - - Ninjaprogrammør - - - CEO - - - Flipproletar - - - Kundeservice - - - Kontorets dj - - - Designer/programmør på Minecraft – Pocket Edition - - - Udvikler - - - Chief Architect - - - Art Developer - - - Spilsmed - - - Morskabschef - - - Musik og lyde - - - Programmering - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Særlig tak til - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Træsværd - - - Stensværd - - - Jernsværd - - - Diamantsværd - - - Guldsværd - - - Træskovl - - - Stenskovl - - - Jernskovl - - - Diamantskovl - - - Guldskovl - - - Træhakke - - - Stenhakke - - - Jernhakke - - - Diamanthakke - - - Guldhakke - - - Træøkse - - - Stenøkse - - - Jernøkse - - - Diamantøkse - - - Guldøkse - - - Lugejern af træ - - - Lugejern af sten - - - Lugejern af jern - - - Diamantlugejern - - - Guldlugejern - - - Trædør - - - Jerndør - - - Ringhjelm - - - Ringbrynje - - - Ringbukser - - - Ringstøvler - - - Læderhætte - - - Jernhjelm - - - Diamanthjelm - - - Guldhjelm - - - Lædertunika - - - Brystplade af jern - - - Diamantbrystplade - - - Brystplade af guld - - - Læderbukser - - - Jernbukser - - - Diamantbukser - - - Guldbukser - - - Læderstøvler - - - Jernstøvler - - - Diamantstøvler - - - Guldstøvler - - - Jernbarre - - - Guldbarre - - - Spand - - - Vandspand - - - Lavaspand - - - Fyrtøj - - - Æble - - - Bue - - - Pil - - - Kul - - - Trækul - - - Diamant - - - Pind - - - Skål - - - Svampestuvning - - - Snor - - - Fjer - - - Krudt - - - Hvedefrø - - - Hvede - - - Brød - - - Flint - - - Rå kotelet - - - Stegt kotelet - - - Maleri - - - Guldæble - - - Skilt - - - Minevogn - - - Sadel - - - Rødsten - - - Snebold - - - Båd - - - Læder - - - Mælkespand - - - Mursten - - - Ler - - - Sukkerrør - - - Papir - - - Bog - - - Slimklat - - - Minevogn med kiste - - - Minevogn med ovn - - - Æg - - - Kompas - - - Fiskestang - - - Ur - - - Støv fra glødesten - - - Rå fisk - - - Stegt fisk - - - Farvepulver - - - Blækpose - - - Rosenrødt - - - Kaktusgrønt - - - Kakaobønner - - - Lasursten - - - Lilla farve - - - Cyan farve - - - Lysegrå farve - - - Grå farve - - - Lyserød farve - - - Limegrøn farve - - - Mælkebøttegul - - - Lyseblå farve - - - Magenta farve - - - Orange farve - - - Benmel - - - Ben - - - Sukker - - - Kage - - - Seng - - - Rødstensgentager - - - Småkage - - - Kort - - - Musikplade – "13" - - - Musikplade – "cat" - - - Musikplade – "blocks" - - - Musikplade – "chirp" - - - Musikplade – "far" - - - Musikplade – "mall" - - - Musikplade – "mellohi" - - - Musikplade – "stal" - - - Musikplade – "strad" - - - Musikplade – "ward" - - - Musikplade – "11" - - - Musikplade – "where are we now?" - - - Saks - - - Græskarfrø - - - Melonfrø - - - Rå kylling - - - Stegt kylling - - - Råt kød - - - Steak - - - Rådden fisk - - - Mørkeperle - - - Melonskive - - - Flammestav - - - Gyslingetåre - - - Guldklump - - - Afgrundsurt - - - {*splash*}{*prefix*}Eliksir {*postfix*} - - - Glasflaske - - - Vandflaske - - - Edderkoppeøje - - - Gæret edderkoppeøje - - - Pulver fra flammeånd - - - Magmacreme - - - Bryggestativ - - - Gryde - - - Mørkeøje - - - Glimmermelon - - - Erfaringseliksir - - - Ildladning - - - Ildladning (trækul) - - - Ildladning (kul) - - - Ramme - - - Fremkald {*CREATURE*} - - - Afgrundsmursten - - - Kranium - - - Kranium fra skelet - - - Kranium fra visneskelet - - - Zombiehoved - - - Hoved - - - Hoved fra %s - - - Snigerhoved - - - Sten - - - Græsblok - - - Jord - - - Brosten - - - Planker af bøgetræ - - - Planker af grantræ - - - Planker af birketræ - - - Planker af jungletræ - - - Stikling - - - Stikling fra bøgetræ - - - Stikling fra grantræ - - - Stikling fra birketræ - - - Stikling fra jungletræ - - - Grundfjeld - - - Vand - - - Lava - - - Sand - - - Sandsten - - - Grus - - - Guldmalm - - - Jernmalm - - - Kulmalm - - - Træ - - - Bøgetræ - - - Grantræ - - - Birketræ - - - Jungletræ - - - Bøg - - - Gran - - - Birk - - - Blade - - - Bøgeblade - - - Granblade - - - Birkeblade - - - Jungleblade - - - Svamp - - - Glas - - - Uld - - - Sort uld - - - Rød uld - - - Grøn uld - - - Brun uld - - - Blå uld - - - Lilla uld - - - Cyan uld - - - Lysegrå uld - - - Grå uld - - - Lyserød uld - - - Limegul uld - - - Gul uld - - - Lyseblå uld - - - Magentafarvet uld - - - Orange uld - - - Hvid uld - - - Blomst - - - Rose - - - Svamp - - - Blok af guld - - - En kompakt måde at opbevare guld på. - - - Blok af jern - - - En kompakt måde at opbevare jern på. - - - Flise af sten - - - Flise af sten - - - Sandstensflise - - - Flise af bøgetræ - - - Flise af brosten - - - Flise af mursten - - - Flise af stenmursten - - - Flise af bøgetræ - - - Flise af grantræ - - - Flise af birketræ - - - Flise af jungletræ - - - Flise af afgrundsmursten - - - Mursten - - - TNT - - - Bogreol - - - Mossten - - - Obsidian - - - Fakkel - - - Fakkel (kul) - - - Fakkel (trækul) - - - Ild - - - Monsterfremkalder - - - Trappe af bøgetræ - - - Kiste - - - Støv fra rødsten - - - Diamantmalm - - - Blok af diamant - - - En kompakt måde at opbevare diamanter på. - - - Arbejdsbord - - - Afgrøder - - - Landbrugsjord - - - Ovn - - - Skilt - - - Trædør - - - Stige - - - Skinne - - - Strømskinne - - - Kontaktskinne - - - Trappe af sten - - - Håndtag - - - Trykplade - - - Jerndør - - - Rødstensmalm - - - Rødstensfakkel - - - Knap - - - Sne - - - Is - - - Kaktus - - - Ler - - - Sukkerrør - - - Jukebox - - - Hegn - - - Græskar - - - Græskarlygte - - - Afgrundssten - - - Sjælesand - - - Glødesten - - - Portal - - - Lasurstensmalm - - - Blok af lasursten - - - En kompakt måde at opbevare lasursten på. - - + Automat - - Nodeblok + + Kiste - - Kage + + Fortryl - - Seng + + Ovn - - Spindelvæv + + Der er ikke nogen tilbud på indhold, der kan hentes, af denne type i øjeblikket. - - Højt græs + + Er du sikker på, at du vil slette det gemte spil? - - Vissen busk + + Afventer godkendelse - - Diode + + Censureret - - Låst kiste + + %s har sluttet sig til spillet. - - Faldlem + + %s har forladt spillet. - - Uld (en hvilken som helst farve) + + %s blev smidt ud af spillet. - - Stempel - - - Klistret stempel - - - Blok med sølvfisk - - - Mursten af sten - - - Mursten af mossten - - - Revnet mursten af sten - - - Tilhugget mursten af sten - - - Svamp - - - Svamp - - - Jernbarrer - - - Rude af glas - - - Melon - - - Græskarstilk - - - Melonstilk - - - Vinranke - - - Låge - - - Trappe af mursten - - - Trappe af stenmursten - - - Sølvfisk fra sten - - - Sølvfisk fra brosten - - - Sølvfisk fra mursten af sten - - - Mycelium - - - Åkandeblad - - - Afgrundsmursten - - - Hegn af afgrundsmursten - - - Trappe af afgrundsmursten - - - Afgrundsurt - - - Fortryllelsesbord - - + Bryggestativ - - Gryde + + Indtast tekst til skilt - - Portal til Mørket + + Indtast tekst til dit skilt - - Portalramme til Mørket + + Indtast en titel - - Mørkesten + + Prøveversionen er udløbet - - Drageæg + + Spillet er fyldt - - Buskads + + Kunne ikke logge ind, fordi der ikke er flere ledige pladser - - Bregne + + Indtast en titel til dit opslag - - Trappe af sandsten + + Indtast en beskrivelse til dit opslag - - Trappe af grantræ - - - Trappe af birketræ - - - Trappe af jungletræ - - - Rødstenslampe - - - Kakao - - - Kranium - - - Nuværende styring - - - Layout - - - Gå/spurt - - - Synsvinkel - - - Pause - - - Hop - - - Hop/flyv op - - + Lager - - Skift anvendt genstand + + Ingredienser - - Handling + + Indtast overskrift - - Anvend + + Indtast en overskrift til dit opslag - - Fremstilling + + Indtast beskrivelse - - Smid + + Spiller nu: - - List + + 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. - - List/flyv nedad + + Fjern fra blokeringsliste - - Skift kameravinkel + + Interval for automatisk gemte spil - - Spillere/invitér + + Blokeret bane - - Bevægelse (flyver) + + 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. - - Layout 1 + + Vil du blokere banen? - - Layout 2 + + Interval for automatisk gemte spil: FRA - - Layout 3 + + Skærmgennemsigtighed - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Gør forberedelser til at gemme banen automatisk - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Display-størrelse - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Min. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Kan ikke placeres her! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Du må ikke placere lava tæt på gendannelsespunktet, da det skaber en risiko for, at gendannede spillere dør med det samme. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Favoritoverflade - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Spil tilhørende %s - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Ukendt spilvært - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Gæst logget ud - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Gendan indstillinger - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Er du sikker på, at du vil gendanne dine indstillinger til deres standardværdier? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Indlæsningsfejl - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Alle gæstespillere er blevet logget ud, fordi en gæst forlod spillet. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Kunne ikke oprette spil - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Autovalg - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Ingen pakker: Standardskins - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Log ind - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Du er ikke logget ind. Du skal være logget ind for at kunne spille. Vil du logge ind nu? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Multiplayer er ikke tilladt - - <![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;]]> + + Drik - - {*B*}Tryk på {*CONTROLLER_VK_A*} for at fortsætte. - - - {*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. - - - 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. - - - Brug {*CONTROLLER_ACTION_LOOK*} for at kigge op, ned og rundt omkring dig. - - - Brug {*CONTROLLER_ACTION_MOVE*} for at gå. - - - 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. - - - - Tryk på {*CONTROLLER_ACTION_JUMP*} for at hoppe. - - - 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 ... - - - 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. - - - Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen. - - - Dit lager bliver fyldt, efterhånden som du fremstiller og indsamler flere genstande.{*B*} - -Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. - - - 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. - - - - 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. - - - 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. - - - 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*} - - - Du kan lave planker ud af det træ, du finder. Åbn fremstillingsskærmen for at lave dem.{*PlanksIcon*} - - - Mange fremstillingsprocesser indeholder flere trin. Nu hvor du har nogle planker, er der flere genstande, som du kan lave. Byg et arbejdsbord.{*CraftingTableIcon*} - - - 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*} - - - Brug {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for at udskifte den genstand, du har i hånden. - - - 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. - - - Vælg arbejdsbordet, og ret sigtekornet mod det sted, hvor du vil placere det. Tryk på {*CONTROLLER_ACTION_USE*} for at placere arbejdsbordet. - - - Ret sigtekornet mod arbejdsbordet, og tryk på {*CONTROLLER_ACTION_USE*} for at åbne det. - - - 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 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*} - - - 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*} - - - Åbn beholderen - - - - 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. - - - - - 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 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. - - - - 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*} - - - Du har samlet nok brosten til at bygge en ovn. Byg en på arbejdsbordet. - - - Placér ovnen i verden med {*CONTROLLER_ACTION_USE*}, og åbn den. - - - Lav kul i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. - - - Lav glas i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. - - - 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*} - - - Placér døren med {*CONTROLLER_ACTION_USE*}. Du kan åbne og lukke en trædør ved hjælp af {*CONTROLLER_ACTION_USE*}. - - - 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*} - - - - Du har gennemført den første del af introduktionen. - - - - - {*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. - - - - - 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. - - - - {*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. - - - - - 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. - - - - 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*}. - - - - Hvis du flytter markøren uden for kanten af skærmen, kan du smide en genstand. - - - - - Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren over genstanden og trykke på {*CONTROLLER_VK_BACK*}. - - - - - Tryk på {*CONTROLLER_VK_B*} for at lukke lageret. - - - - - 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. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren hen over genstanden og trykke på {*CONTROLLER_VK_BACK*}. - - - - - Tryk på {*CONTROLLER_VK_B*} for at lukke lageret i Kreativ. - - - - - Dette er fremstillingsskærmen. Her kan du fremstille nye genstande ved at kombinere de genstande, du har samlet sammen. - - - - {*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. - - - - {*B*} - Tryk på {*CONTROLLER_VK_X*} for at se beskrivelsen af genstanden. - - - - {*B*} - Tryk på {*CONTROLLER_VK_X*} for at se de ingredienser, der skal bruges for at lave denne genstand. - - - - {*B*} - Tryk på {*CONTROLLER_VK_X*} for at se lageret igen. - - - - - 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*}. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Beskrivelsen af den valgte genstand bliver vist. Den hjælper dig med at finde ud af, hvad genstanden kan bruges til. - - - - - Listen over de nødvendige ingredienser bliver vist. - - - - Du kan lave planker ud af det træ, du finder. Vælg plankeikonet, og tryk på {*CONTROLLER_VK_A*} for at lave dem.{*PlanksIcon*} - - - - 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. - - - - - 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*} - - - - - 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*} - - - - " - 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*} - " - - - - " - 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*} - " - - - - - 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. - - - - - Visse genstande kan ikke fremstilles på arbejdsbordet. Her skal du bruge en ovn. Byg en ovn.{*FurnaceIcon*} - - - - - 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. - - - - - 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. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Kul kan bruges som brændsel og som ingrediens til en fakkel sammen med en pind. - - - - - Du kan lave glas, hvis du placerer sand i ingrediensfeltet. Lav nogle glasblokke, som du kan bruge som vinduer i dit tilflugtssted. - - - - - Dette er bryggeskærmen. Her kan du brygge eliksirer med en lang række forskellige effekter. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Du kan brygge en ildmodstandseliksir ved først at putte afgrundsurt i en vandflaske og dernæst tilsætte magmacreme. - - - - - Tryk på {*CONTROLLER_VK_B*} for at lukke bryggeskærmen. - - - - - I dette område finder du et bryggestativ, en gryde og en kiste fyldt med ingredienser til brygning. - - - - {*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. - - - - - Det første trin i at brygge en eliksir er at lave en vandflaske. Tag en glasflaske fra kisten. - - - - - 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*}. - - - - - Hvis gryden løber tør for vand, kan du fylde den med en vandspand. - - - - - Brug bryggestativet til at brygge en ildmodstandseliksir med. Du skal bruge en vandflaske, afgrundsurt og magmacreme. - - - - - 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. - - - - - Brug din ildmodstandseliksir på dig selv. - - - - - 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. - - - - - Dette er fortryllelsesskærmen, hvor du kan fortrylle dine våben, rustninger og visse redskaber. - - - - {*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. - - - - - 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. - - - - - Når du placerer en genstand i fortryllelsesfeltet, viser knapperne til højre et udvalg af tilfældige fortryllelser. - - - - - 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. - - - - - Vælg en fortryllelse, og tryk på {*CONTROLLER_VK_A*} for at fortrylle genstanden. Dit erfaringsniveau bliver fratrukket omkostningerne for fortryllelsen. - - - - - 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. - - - - - Der er et fortryllelsesbord i dette område og nogle andre ting, der kan hjælpe dig med at lære om fortryllelse. - - - - {*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. - - - - - 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. - - - - - Når du stiller bogreoler rundt om fortryllelsesbordet, forøges dets kraft og giver adgang til fortryllelser, der kræver højere erfaringsniveau. - - - - - 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 også optjene erfaringsniveauer med en erfaringseliksir, der efterlader erfaringskugler på det sted, hvor du smed den. Du kan samle kuglerne op. - - - - - 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. - - - - - 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*} - - - - {*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. - - - - En minevogn kører på skinner. Du kan også fremstille en minevogn med en ovn eller kiste i. - {*RailIcon*} - - - - - 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*} - - - + - 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*} + 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. - + {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om både.{*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. - + + 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ø. + + + Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen i Kreativ. + + + Gå over på den anden side af dette hul for at fortsætte. + + + Du har nu fuldført introduktionen i Kreativ. + + + 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. + + + 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*} + + + Svampe skal plantes i svag belysning, så vil de sprede sig til andre svagt belyste blokke.{*ICON*}39{*/ICON*} + + + 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*} + + + 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*} + + + 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. + + + 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*} + + + 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. + + - I en båd kan du sejle hurtigere over vandet. Du kan styre den med {*CONTROLLER_ACTION_MOVE*} og {*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} + 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. - + - Nu bruger du en fiskestang. Tryk på {*CONTROLLER_ACTION_USE*} for at bruge den.{*FishingRodIcon*} + I dette område finder du en portal til Afgrunden! - + {*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. - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - 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*} - - - {*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. - - - - 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*} - - - - - Hvis du spiller med andre, skal I alle ligge i jeres senge på samme tid for at kunne sove. - {*ICON*}355{*/ICON*} - - - - - 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. - - - - {*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. - - - - 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. - - - - - 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. - + 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. @@ -3294,40 +757,10 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. 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*} - - - - 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. - - - - - I dette område finder du en portal til Afgrunden! - - - - {*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. 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. - - - - - 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. - - - - - 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. - - - - - 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. @@ -3347,55 +780,75 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til Kreativ. - - 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. - - - Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen i Kreativ. - - - Gå over på den anden side af dette hul for at fortsætte. - - - Du har nu fuldført introduktionen i Kreativ. - - + - 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. + 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. - - {*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. + + + 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. + - - 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ø. - - - 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. - - - 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*} - - - 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. - - - 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*} - - - 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*} - - - Svampe skal plantes i svag belysning, så vil de sprede sig til andre svagt belyste blokke.{*ICON*}39{*/ICON*} - - - 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*} + + + 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. + Du har nu fuldført introduktionen til landbrug. + + Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en økse til at fælde træer med. + + + 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. + + + Nogle redskaber er bedre til at angribe fjender med end andre. Et sværd er godt at angribe med. + + + Jerngolemmer dukker også naturligt op for at beskytte landsbyer og angriber dig, hvis du angriber landsbyboerne. + + + Du kan ikke forlade området, før du har gennemført introduktionen. + + + Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en skovl til bløde materialer som jord og sand. + + + 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 ... + + + 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. + + + 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. + + + 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. + + + 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. + + + Hold {*CONTROLLER_ACTION_JUMP*} nede for at svømme op. + + + 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. + + + Jerngolemmer skal laves af to jernblokke oven på hinanden med et græskar på toppen. Jerngolemmer angriber dine fjender. + + + 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. + + + 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. + + + Når et dyr har været elskovssygt, skal der gå op til fem minutter, inden det kan blive det igen. + I dette område er dyrene indhegnet. Du kan avle dyr for at få unger. @@ -3409,31 +862,9 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. Du skal fodre dyrene for at gøre dem elskovssyge, så de kan få unger. - - 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. - - - 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. - - - Når et dyr har været elskovssygt, skal der gå op til fem minutter, inden det kan blive det igen. - 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*} - - - 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. - - - - Du har nu fuldført introduktionen til dyr og avl. - - - - I dette områder er der græskar og blokke, så du kan lave en snegolem og en jerngolem. - - {*B*} @@ -3447,51 +878,531 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. Snegolemmer skal laves af to sneblokke oven på hinanden med et græskar på toppen. Snegolemmer kaster snebolde efter deres skabers fjender. - - Jerngolemmer skal laves af to jernblokke oven på hinanden med et græskar på toppen. Jerngolemmer angriber dine fjender. + + + 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. + - - Jerngolemmer dukker også naturligt op for at beskytte landsbyer og angriber dig, hvis du angriber landsbyboerne. + + Du har nu fuldført introduktionen til dyr og avl. - - Du kan ikke forlade området, før du har gennemført introduktionen. + + + I dette områder er der græskar og blokke, så du kan lave en snegolem og en jerngolem. + - - Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en skovl til bløde materialer som jord og sand. + + + 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. + - - Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en økse til at fælde træer med. + + + Hvis gryden løber tør for vand, kan du fylde den med en vandspand. + - - 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. + + + Brug bryggestativet til at brygge en ildmodstandseliksir med. Du skal bruge en vandflaske, afgrundsurt og magmacreme. + - - Nogle redskaber er bedre til at angribe fjender med end andre. Et sværd er godt at angribe med. + + + 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. + - - 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 ... + + {*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. + - - 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. + + + Det første trin i at brygge en eliksir er at lave en vandflaske. Tag en glasflaske fra kisten. + - - Hold {*CONTROLLER_ACTION_JUMP*} nede for at svømme op. + + + 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*}. + - - 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. + + + Brug din ildmodstandseliksir på dig selv. + - - 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. + + + 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. + - - 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. + + + Når du placerer en genstand i fortryllelsesfeltet, viser knapperne til højre et udvalg af tilfældige fortryllelser. + - - 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. + + + 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. + + + + + 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. + + + + + Dette er fortryllelsesskærmen, hvor du kan fortrylle dine våben, rustninger og visse redskaber. + + + + {*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. + + + + + I dette område finder du et bryggestativ, en gryde og en kiste fyldt med ingredienser til brygning. + + + + + Kul kan bruges som brændsel og som ingrediens til en fakkel sammen med en pind. + + + + + Du kan lave glas, hvis du placerer sand i ingrediensfeltet. Lav nogle glasblokke, som du kan bruge som vinduer i dit tilflugtssted. + + + + + Dette er bryggeskærmen. Her kan du brygge eliksirer med en lang række forskellige effekter. + + + + + 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. + + + + + 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. + + + + + 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. + + + + {*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. + + + + + 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. + + + + + Du kan brygge en ildmodstandseliksir ved først at putte afgrundsurt i en vandflaske og dernæst tilsætte magmacreme. + + + + + Tryk på {*CONTROLLER_VK_B*} for at lukke bryggeskærmen. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + Vælg en fortryllelse, og tryk på {*CONTROLLER_VK_A*} for at fortrylle genstanden. Dit erfaringsniveau bliver fratrukket omkostningerne for fortryllelsen. + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + I en båd kan du sejle hurtigere over vandet. Du kan styre den med {*CONTROLLER_ACTION_MOVE*} og {*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Nu bruger du en fiskestang. Tryk på {*CONTROLLER_ACTION_USE*} for at bruge den.{*FishingRodIcon*} + + + + {*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. + + + 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*} + + + + 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. + + + + {*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. + + + + 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. + + + + {*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. + + + + 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*} + + + + + Hvis du spiller med andre, skal I alle ligge i jeres senge på samme tid for at kunne sove. + {*ICON*}355{*/ICON*} + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om både.{*B*} + + + + 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. + + + + + Når du stiller bogreoler rundt om fortryllelsesbordet, forøges dets kraft og giver adgang til fortryllelser, der kræver højere erfaringsniveau. + + + + + 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. + + + + + 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. + + + + + Der er et fortryllelsesbord i dette område og nogle andre ting, der kan hjælpe dig med at lære om fortryllelse. + + + + {*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. + + + + + Du kan også optjene erfaringsniveauer med en erfaringseliksir, der efterlader erfaringskugler på det sted, hvor du smed den. Du kan samle kuglerne op. + + + + + En minevogn kører på skinner. Du kan også fremstille en minevogn med en ovn eller kiste i. + {*RailIcon*} + + + + + 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*} + + + + + 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*} + + + + + 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. + + + + + 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*} + + + + {*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. Hvis du flytter en genstand uden for skærmen, kan du smide den. + + Læs + + + Hæng + + + Kast + + + Åbn + + + Skift tonehøjde + + + Detonér + + + Plant + + + Lås op for det komplette spil + + + Slet gemt spil + + + Slet + + + Kultivér + + + Høst + + + Fortsæt + + + Svøm op + + + Slå + + + Malk + + + Indsaml + + + Tøm + + + Sadel + + + Placér + + + Spis + + + Rid + + + Sejl + + + Dyrk + + + Sov + + + Vågn op + + + Leg + + + Indstillinger + + + Flyt rustning + + + Flyt våben + + + Anvend + + + Flyt ingrediens + + + Flyt brændsel + + + Flyt redskab + + + Træk + + + Side op + + + Side ned + + + Elskovssyg + + + Slip + + + Privilegier + + + Blok + + + Kreativ + + + Blokér bane + + + Vælg overflade + + + Tænd + + + Invitér venner + + + Acceptér + + + Klip + + + Navigér + + + Geninstallér + + + Gem indst. + + + Udfør handling + + + Installér komplet version + + + Installér prøveversion + + + Installér + + + Smid ud + + + Opdatér oversigt over onlinespil + + + Party-spil + + + Alle spil + + + Afslut + + + Annullér + + + Annullér tilslutning + + + Skift gruppe + + + Fremstilling + + + Skab + + + Tag/placér + + + Vis lager + + + Vis beskrivelse + + + Vis ingredienser + + + Tilbage + + + Påmindelse: + + + + + + Der er blevet føjet nye funktioner til i den seneste version af spillet, heriblandt nye områder i introduktionsverdenen. + Du har ikke ingredienserne til denne genstand. Feltet nederst til venstre viser de ingredienser, der skal bruges til denne genstand. @@ -3503,29 +1414,9 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. {*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. - - Påmindelse: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Der er blevet føjet nye funktioner til i den seneste version af spillet, heriblandt nye områder i introduktionsverdenen. - {*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. - - - Her finder du forskellige områder, der lærer dig om fiskeri, både, stempler og rødsten. - - - Uden for dette område finder du eksempler på bygninger, landbrug, minevogne, skinner, fortryllelse, brygning, handel smedearbejde og meget mere! - - - - Din madbjælke er faldet til et niveau, hvor du ikke længere får ny energi. - @@ -3540,102 +1431,20 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. Anvend - - Tilbage + + Her finder du forskellige områder, der lærer dig om fiskeri, både, stempler og rødsten. - - Afslut + + Uden for dette område finder du eksempler på bygninger, landbrug, minevogne, skinner, fortryllelse, brygning, handel smedearbejde og meget mere! - - Annullér - - - Annullér tilslutning - - - Opdatér oversigt over onlinespil - - - Party-spil - - - Alle spil - - - Skift gruppe - - - Vis lager - - - Vis beskrivelse - - - Vis ingredienser - - - Fremstilling - - - Skab - - - Tag/placér + + + Din madbjælke er faldet til et niveau, hvor du ikke længere får ny energi. + Tag - - Tag alt - - - Tag halvdelen - - - Placér - - - Placér alt - - - Placér en - - - Smid - - - Smid alt - - - Smid en - - - Byt - - - Flyt hurtigt - - - Ryd hurtigt valg - - - Hvad er det? - - - Del på Facebook - - - Skift filter - - - Send venneanmodning - - - Side ned - - - Side op - Næste @@ -3645,18 +1454,18 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. Smid spiller ud + + Send venneanmodning + + + Side ned + + + Side op + Farve - - Udvind - - - Fodr - - - Tæm - Helbred @@ -3666,1069 +1475,861 @@ Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. Følg - - Smid ud + + Udvind - - Tøm + + Fodr - - Sadel + + Tæm - - Placér + + Skift filter - - Slå + + Placér alt - - Malk + + Placér en - - Indsaml + + Smid - - Spis + + Tag alt - - Sov + + Tag halvdelen - - Vågn op + + Placér - - Leg + + Smid alt - - Rid + + Ryd hurtigt valg - - Sejl + + Hvad er det? - - Dyrk + + Del på Facebook - - Svøm op + + Smid en - - Åbn + + Byt - - Skift tonehøjde - - - Detonér - - - Læs - - - Hæng - - - Kast - - - Plant - - - Kultivér - - - Høst - - - Fortsæt - - - Lås op for det komplette spil - - - Slet gemt spil - - - Slet - - - Indstillinger - - - Invitér venner - - - Acceptér - - - Klip - - - Blokér bane - - - Vælg overflade - - - Tænd - - - Navigér - - - Installér komplet version - - - Installér prøveversion - - - Installér - - - Geninstallér - - - Gem indst. - - - Udfør handling - - - Kreativ - - - Flyt ingrediens - - - Flyt brændsel - - - Flyt redskab - - - Flyt rustning - - - Flyt våben - - - Anvend - - - Træk - - - Slip - - - Privilegier - - - Blok - - - Side op - - - Side ned - - - Elskovssyg - - - Drik - - - Rotér - - - Skjul - - - Ryd alle pladser - - - OK - - - Annullér - - - Minecraft-butikken - - - 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. - - - Afslut spil - - - Gem spil - - - Afslut uden at gemme - - - Er du sikker på, at du vil overskrive de tidligere gemte spil fra denne verden med den nuværende version af denne verden? - - - Er du sikker på, at du vil afslutte uden at gemme? Du mister alle dine fremskridt i denne verden! - - - Start spil - - - Ødelagt gemt spil - - - Det gemte spil er ødelagt. Vil du slette det? - - - 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. - - - Afslut og gem - - - Afslut uden at gemme - - - Er du sikker på, at du vil afslutte til hovedmenuen? Alle fremskridt, der ikke er gemt, går tabt. - - - Er du sikker på, at du vil afslutte til hovedmenuen? Dine fremskridt går tabt! - - - Skab ny verden - - - Spil introduktion - - - Introduktion - - - Giv din verden et navn - - - Indtast et navn til din verden - - - Indtast seed til skabelsen af din verden - - - Indlæs gemt verden - - - Tryk på START-knappen for at deltage i spillet - - - Afslutter spillet - - - Der opstod en fejl. Afslutter til hovedmenuen. - - - Kunne ikke oprette forbindelse - - - Forbindelsen blev afbrudt - - - Forbindelsen til serveren blev afbrudt. Afslutter til hovedmenuen. - - - Serveren afbrød forbindelsen - - - Du blev smidt ud af spillet - - - Du blev smidt ud af spillet, fordi du fløj - - - Det tog for lang tid at oprette forbindelse - - - Serveren er fyldt - - - Værten har forladt spillet. - - - Du kan ikke deltage i dette spil, fordi du ikke er venner med nogen i spillet. - - - Du kan ikke deltage i dette spil, fordi du tidligere er blevet smidt ud af værten. - - - Du kan ikke deltage i dette spil, da værten spiller en ældre version af spillet. - - - Du kan ikke deltage i dette spil, da værten spiller en nyere version af spillet. - - - 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 - - - Filter: - - - Venner - - - Mine point - - - Sammenlagt - - - Placeringer: - - - Rang - - - Forbereder at gemme banen - - - Forbereder dele ... - - - Afslutter ... - - - Bygger terræn - - - Simulerer verdenen et kort stykke tid - - - Starter server - - - Opretter fremkaldelsesområde - - - Indlæser fremkaldelsesområde - - - Rejser til Afgrunden - - - Forlader Afgrunden - - - Gendanner - - - Skaber bane - - - Indlæser bane - - - Gemmer spillere - - - Tilslutter til vært - - - Downloader terræn - - - Skifter til offlinespil - - - Vent venligst, mens værten gemmer spillet - - - Rejser til Mørket - - - Forlader Mørket - - - Sengen er optaget - - - Du kan kun sove om natten - - - %s sover i en seng. Hvis I vil springe frem til daggry, skal alle spillere sove i hver sin seng på samme tid. - - - Din seng blev væk eller var blokeret - - - Du kan ikke hvile nu, der er monstre i nærheden - - - Du sover i en seng. Hvis I vil springe frem til daggry, skal alle spillere sove i hver sin seng på samme tid. - - - Redskaber og våben - - - Våben - - - Mad - - - Strukturer - - - Rustning - - - Mekanismer - - - Transport - - - Dekorationer - - - Byggeblokke - - - Rødsten og transport - - - Diverse - - - Brygning - - - Redskaber, våben og rustninger - - - Materialer - - - Logget ud - - - Sværhedsgrad - - - Musik - - - Lyd - - - Lysstyrke - - - Spilfølsomhed - - - Skærmfølsomhed - - - Fredfyldt - - - Let - - - Normal - - - Svær - - - På denne sværhedsgrad får spilleren automatisk ny energi, og der er ingen fjender i omgivelserne. - - - På denne sværhedsgrad er der fjender i omgivelserne, men spilleren tager mindre skade end normalt. - - - På denne sværhedsgrad er der fjender i omgivelserne, og spilleren tager normal skade. - - - 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! - - - Prøveversionen er udløbet - - - Spillet er fyldt - - - Kunne ikke logge ind, fordi der ikke er flere ledige pladser - - - Indtast tekst til skilt - - - Indtast tekst til dit skilt - - - Indtast en titel - - - Indtast en titel til dit opslag - - - Indtast overskrift - - - Indtast en overskrift til dit opslag - - - Indtast beskrivelse - - - Indtast en beskrivelse til dit opslag - - - Lager - - - Ingredienser - - - Bryggestativ - - - Kiste - - - Fortryl - - - Ovn - - - Ingrediens - - - Brændsel - - - Automat - - - Der er ikke nogen tilbud på indhold, der kan hentes, af denne type i øjeblikket. - - - %s har sluttet sig til spillet. - - - %s har forladt spillet. - - - %s blev smidt ud af spillet. - - - Er du sikker på, at du vil slette det gemte spil? - - - Afventer godkendelse - - - Censureret - - - Spiller nu: - - - Gendan indstillinger - - - Er du sikker på, at du vil gendanne dine indstillinger til deres standardværdier? - - - Indlæsningsfejl - - - Spil tilhørende %s - - - Ukendt spilvært - - - Gæst logget ud - - - Alle gæstespillere er blevet logget ud, fordi en gæst forlod spillet. - - - Log ind - - - Du er ikke logget ind. Du skal være logget ind for at kunne spille. Vil du logge ind nu? - - - Multiplayer er ikke tilladt - - - Kunne ikke oprette spil - - - Autovalg - - - Ingen pakker: Standardskins - - - Favoritoverflade - - - Blokeret bane - - - 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. - - - Vil du blokere banen? - - - 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. - - - Fjern fra blokeringsliste - - - Interval for automatisk gemte spil - - - Interval for automatisk gemte spil: FRA - - - Min. - - - Kan ikke placeres her! - - - Du må ikke placere lava tæt på gendannelsespunktet, da det skaber en risiko for, at gendannede spillere dør med det samme. - - - Skærmgennemsigtighed - - - Gør forberedelser til at gemme banen automatisk - - - Display-størrelse - - - Display-størrelse (delt skærm) - - - Seed - - - Lås op for overfladepakke - - - Du skal låse op for denne overfladepakke for at bruge den valgte overflade. -Vil du låse op for overfladepakken nu? - - - Lås op for teksturpakke - - - Du skal låse op for denne teksturpakke for at bruge den i din verden. -Vil du låse op for den nu? - - - Prøveversion af teksturpakke - - - 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? - - - Teksturpakken er ikke tilgængelig - - - Lås op for den komplette version - - - Download prøveversion - - - Download komplet version - - - Denne verden bruger en mash-up-pakke eller teksturpakke, som du mangler! -Vil du installere mash-up-pakken eller teksturpakken nu? - - - Hent prøveversion - - - Hent den komplette version - - - Smid spiller ud - - - Er du sikker på, at du vil smide spilleren ud? Vedkommende kan ikke oprette forbindelse til dit spil igen, før du genstarter verdenen. - - - Pakker med spillerbilleder - - - Temaer - - - Overfladepakker - - - Tillad venner af venner - - - Du kan ikke tilslutte til spillet, fordi det er begrænset til spillere, der er venner med værten. - - - Kan ikke tilslutte til spil - - - Valgt - - - Valgt overflade: - - - Indholdet, der kan hentes, er ødelagt - - - Indholdet, der kan hentes, er ødelagt og kan ikke bruges. Du skal slette det og geninstallere det fra menuen i Minecraft-butikken. - - - 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. - - - Spiltypen er blevet ændret - - - Omdøb din verden - - - Indtast et nyt navn til din verden - - - Spiltype: Overlevelse - - - Spiltype: Kreativ - - - Overlevelse - - - Kreativ - - - Oprettet i Overlevelse - - - Oprettet i Kreativ - - - Vis skyer - - - Hvad vil du gøre med det gemte spil? - - - Omdøb gemte spil - - - Gemmer automatisk om %d ... - - - Til - - - Fra - - - Normal - - - Meget flad - - - Når denne funktion er slået til, bliver spillet til et onlinespil. - - - Når denne funktion er slået til, er det kun inviterede spillere, der kan deltage. - - - Når denne funktion er slået til, kan spillere, der er venner med personer på din venneliste, deltage i spillet. - - - Når denne funktion er slået til, kan spillerne skade hinanden. Gælder kun i Overlevelse. - - - 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. - - - Når denne funktion er slået til, kan ilden sprede sig til brandbare blokke i nærheden. - - - Når denne funktion er slået til, eksploderer TNT, når det aktiveres. - - - 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. - - - Når denne funktion er slået til, bliver strukturer som landsbyer og fæstninger skabt i verdenen. - - - Når denne funktion er slået til, bliver der skabt en helt flad verden i Oververdenen og Afgrunden. - - - Når denne funktion er slået til, bliver der skabt en kiste med nyttige genstande i nærheden af spillerens gendannelsespunkt. + + Flyt hurtigt Overfladepakker - - Temaer + + Rød mosaikrude - - Spillerbilleder + + Grøn mosaikrude - - Avatargenstande + + Brun mosaikrude - - Teksturpakker + + Hvidt mosaikglas - - Mash-up-pakke + + Mosaikglasrude - - {*PLAYER*} gik op i røg + + Sort mosaikrude - - {*PLAYER*} brændte ihjel + + Blå mosaikrude - - {*PLAYER*} prøvede at svømme i lava + + Grå mosaikrude - - {*PLAYER*} blev kvalt i en væg + + Lyserød mosaikrude - - {*PLAYER*} druknede + + Limefarvet mosaikrude - - {*PLAYER*} sultede ihjel + + Lilla mosaikrude - - {*PLAYER*} blev stukket ihjel + + Cyanfarvet mosaikrude - - {*PLAYER*} ramte jorden for hurtigt + + Lysegrå mosaikrude - - {*PLAYER*} faldt ud af verdenen + + Orange mosaikglas - - {*PLAYER*} døde + + Blåt mosaikglas - - {*PLAYER*} sprang i luften + + Lilla mosaikglas - - {*PLAYER*} blev dræbt af magi + + Cyanfarvet mosaikglas - - {*PLAYER*} blev dræbt af mørkedragens ånde + + Rødt mosaikglas - - {*PLAYER*} blev dræbt af {*SOURCE*} + + Grønt mosaikglas - - {*PLAYER*} blev dræbt af {*SOURCE*} + + Brunt mosaikglas - - {*PLAYER*} blev skudt af {*SOURCE*} + + Lysegråt mosaikglas - - {*PLAYER*} blev skudt ned med ildkugler af {*SOURCE*} + + Gult mosaikglas - - {*PLAYER*} blev banket ihjel af {*SOURCE*} + + Lyseblåt mosaikglas - - {*PLAYER*} blev dræbt af {*SOURCE*} + + Magentafarvet mosaikglas - - Grundfjeldståge + + Gråt mosaikglas - - Vis display + + Lyserødt mosaikglas - - Vis hånd + + Limefarvet mosaikglas - - Beskeder ved dødsfald + + Gul mosaikrude - - Animerede figurer + + Lysegrå - - Tilpassede skinanimationer + + Grå - - Du kan ikke længere udvinde eller bruge genstande + + Lyserød - - Nu kan du udvinde og bruge genstande + + Blå - - Du kan ikke længere placere blokke + + Lilla - - Nu kan du placere blokke + + Cyanfarvet - - Nu kan du bruge døre og kontakter + + Limefarvet - - Du kan ikke længere bruge døre og kontakter + + Orange - - Nu kan du bruge beholdere (fx kister) + + Hvid - - Du kan ikke længere bruge beholdere (fx kister) + + Tilpasset - - Du kan ikke længere angribe væsner + + Gul - - Nu kan du angribe væsner + + Lyseblå - - Du kan ikke længere angribe andre spillere + + Magentafarvet - - Nu kan du angribe andre spillere + + Brun - - Du kan ikke længere angribe dyr + + Hvid mosaikrude - - Nu kan du angribe dyr + + Lille bold - - Nu er du en moderator + + Stor bold - - Du er ikke længere en moderator + + Lyseblå mosaikrude - - Nu kan du flyve + + Magentafarvet mosaikrude - - Du kan ikke længere flyve + + Orange mosaikrude - - Du vil ikke længere blive udmattet + + Stjerneformet - - Nu bliver du udmattet + + Sort - - Nu er du en usynlig + + Rød - - Du er ikke længere usynlig + + Grøn - - Nu er du usårlig + + Snigerformet - - Du er ikke længere usårlig + + Brag - - %d MSP + + Ukendt form - - Mørkedrage + + Sort mosaikglas - - %s er rejst til Mørket + + Hesteudrustning af jern - - %s har forladt Mørket + + Hesteudrustning af guld - + + Hesteudrustning af diamant + + + Rødstenssammenligner + + + Minevogn med TNT + + + Minevogn med springer + + + Line + + + Signallys + + + Fældekiste + + + Vægtet trykplade (let) + + + Navneskilt + + + Træplanker (af en hvilken som helst type) + + + Kommandoblok + + + Fyrværkeristjerne + + + Du kan tæmme disse dyr og bruge dem til at ride på. Du kan også sætte en kiste fast på dem. + + + Muldyr + + + 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. + + + Hest + + + Du kan tæmme disse dyr og bruge dem til at ride på. + + + Æsel + + + Zombiehest + + + Blankt kort + + + Mørkestjerne + + + Raket + + + Skelethest + + + Wither + + + De her laves af Wither-kranier og sjælesand. De skyder sprængfarlige kranier efter dig. + + + Vægtet trykplade (tung) + + + Lysegråt, farvet ler + + + Gråt, farvet ler + + + Lyserødt, farvet ler + + + Blåt, farvet ler + + + Lilla, farvet ler + + + Cyanfarvet ler + + + Limefarvet ler + + + Orange, farvet ler + + + Hvidt, farvet ler + + + Mosaikglas + + + Gult, farvet ler + + + Lyseblåt, farvet ler + + + Magentafarvet ler + + + Brunt, farvet ler + + + Springer + + + Aktiveringsskinne + + + Dropper + + + Rødstenssammenligner + + + Dagslyssensor + + + Rødstensblok + + + Farvet ler + + + Sort, farvet ler + + + Rødt, farvet ler + + + Grønt, farvet ler + + + Halmballe + + + Hærdet ler + + + Kulblok + + + Falm til + + + 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. + + + Når denne indstilling er slået til, beholder spillere deres lager, når de dør. + + + Når denne indstilling er slået fra, opstår væsner ikke naturligt. + + + Spiltype: Eventyr + + + Eventyr + + + Indtast seed for at danne det samme terræn igen. Du får en tilfældig verden, hvis du ikke indtaster noget. + + + Når denne indstilling er slået fra, taber monstre og dyr ikke bytte (snigere taber for eksempel ikke krudt). + + + {*PLAYER*} faldt ned ad en stige + + + {*PLAYER*} faldt ned ad nogle lianer + + + {*PLAYER*} faldt ud af vandet + + + Når denne indstilling er slået fra, kommer der ikke genstande ud af blokke (stenblokke giver for eksempel ikke brosten). + + + Når denne indstilling er slået fra, heler spillere ikke naturligt. + + + Når denne indstilling er slået fra, ændrer tidspunktet på dagen sig ikke. + + + Minevogn + + + Bind + + + Slip fri + + + Fastgør + + + Stig af + + + Fastgør kiste + + + Affyr + + + Navn + + + Signallys + + + Primær kraft + + + Sekundær kraft + + + Hest + + + Dropper + + + Springer + + + {*PLAYER*} faldt fra et højt sted + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal flagermus i en verden er nået. + + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal avlende heste er nået. + + + Spilindstillinger + + + {*PLAYER*} åd ildkugler fra {*SOURCE*}, der brugte {*ITEM*} + + + {*PLAYER*} blev mørbanket af {*SOURCE*}, der brugte {*ITEM*} + + + {*PLAYER*} blev slået ihjel af {*SOURCE*}, der brugte {*ITEM*} + + + Væsendestruktion + + + Feltbytte + + + Naturlig heling + + + Dag og nat + + + Behold lager + + + Væseners opståen + + + Væseners bytte + + + {*PLAYER*} blev skudt af {*SOURCE*}, der brugte {*ITEM*} + + + {*PLAYER*} faldt for langt og fik nådestødet af {*SOURCE*} + + + {*PLAYER*} faldt for langt og fik nådestødet af {*SOURCE*}, der brugte {*ITEM*} + + + {*PLAYER*} gik ind i ilden i kampen mod {*SOURCE*} + + + {*PLAYER*} blev dømt til at falde af {*SOURCE*} + + + {*PLAYER*} blev dømt til at falde af {*SOURCE*} + + + {*PLAYER*} blev dømt til at falde af {*SOURCE*}, som brugte {*ITEM*} + + + {*PLAYER*} blev brændt til aske i kampen mod {*SOURCE*} + + + {*PLAYER*} blev sprængt i stumper og stykker af {*SOURCE*} + + + {*PLAYER*} visnede bort + + + {*PLAYER*} blev dræbt af {*SOURCE*}, der brugte {*ITEM*} + + + {*PLAYER*} prøvede at svømme i lava for at undslippe {*SOURCE*} + + + {*PLAYER*} druknede under flugten fra {*SOURCE*} + + + {*PLAYER*} gik ind i en kaktus i forsøget på at undslippe {*SOURCE*} + + + Stig op + + -{*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*} + Hesten skal have en sadel, hvis du vil styre den. Du kan købe sadler af landsbyboere eller finde dem i kister rundt omkring. + + + + + Du kan give tamme æsler og muldyr sadeltasker ved at fastgøre en kiste. Du kan åbne disse tasker, mens du rider eller sniger. + + + + + 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ø. + + + + + 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. + + + + + Når den er tæmmet, bliver den omgivet af hjerter og holder op med at prøve at smide dig af. + + + + + 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. + + + + + 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. + + + + 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. + + + 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. + + + På toppen af denne pyramide er der et inaktivt signalfyr. + + + Dette er signallysskærmen, hvor du kan vælge, hvilken virkning dit signallys skal have. + + +{*B*}Tryk{*CONTROLLER_VK_A*} for at fortsætte. +{*B*}Tryk{*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan man bruger signallysskærmen. + + + + 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. + + + + 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. + + + + + Dette er hestens lager. + + + + + {*B*}Tryk på{*CONTROLLER_VK_A*} for at fortsætte. + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til hesteskærmen. + + + + + Hesteskærmen lader dig overføre genstande til din hest, dit æsel eller dit muldyr, eller give dyret udstyr på. + + + + Glimmer + + + Spor + + + Varighed i luften: + + + + Du kan sadle din hest op ved at placere en sadel på sadelpladsen. Heste kan få rustning ved at placere hesterustning på rustningspladsen. + + + + Du har fundet et muldyr. + + + {*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. + + + + Heste og æsler findes mest på åbne sletter. Muldyr kan avles fra et æsel og en hest, men de er selv sterile. + + + + + 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. + + + + Du har fundet en hest. + + + Du har fundet et æsel. + + + +{*B*}Tryk{*CONTROLLER_VK_A*} for at lære mere om signallys. +{*B*}Tryk{*CONTROLLER_VK_B*}, hvis du allerede kender til signallys. + + + + + Du kan lave fyrværkeristjerner ved at placere krudt og farve i fremstillingsgitteret. + + + + + Farven bestemmer farven på fyrværkeristjernens eksplosion. + + + + + Faconen på fyrværkeristjernen vælges ved at tilføje enten en ildladning, en guldklump, en fjer eller et hoved. + + + + + Du kan også lægge adskillige fyrværkeristjerner i fremstillingsgitteret for at føje dem til fyrværkeriet. + + + + + Hvis du fylder flere felter i fremstillingsgitteret med krudt, når alle fyrværkeristjernerne højere op, før de eksploderer. + + + + + Så kan du tage det færdige fyrværkeri ud af produktionspladsen, når du vil fremstille det. + + + + + Et spor eller en funklen kan tilføjes med diamanter og glødestenstøv. + + + + + 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. + + + + + 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. + + + + + Prøv at lave noget fyrværkeri ved arbejdsbordet med forskellige ingredienser fra kisterne. + + + + + 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. + + + + + I disse kister er der forskellige genstande, som kan bruges til at lave fyrværkeri af! + + + + {*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. + + + + + Du skal lægge krudt og papir i det 3x3-håndværksgitter, der vises over din oppakning. + + + + Dette rum indeholder springere + + + {*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. + + + + + 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. + + + + + 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. + + + + 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. + + + + 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. + + + + + De virker på bryggerstande, kister, automater, droppere, minevogne med kister, minevogne med springere og på andre springere. + + + + I dette rum kan du se og eksperimentere med forskellige, nyttige springer-arrangementer. + + + + + Dette er fyrværkeriskærmen, hvor du kan lave fyrværkeri og fyrværkeristjerner. + + + + + {*B*}Tryk på{*CONTROLLER_VK_A*} for at fortsætte. + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fyrværkeriskærmen. + + + + + 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. + + + + + Men hvis en springer er drevet af rødsten, bliver den inaktiv og holder op med både at suge og videregive ting. + + + + + 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. + + + + Disse fjender findes i sumpe og angriber dig ved at kaste eliksirer. De efterlader eliksirer, når de dør. + + + Det maksimale antal af malerier/rammer i verdenen er nået. + + + Du kan ikke fremkalde fjender i spiltypen Fredfyldt. + + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal avlende grise, får, køer, katte og heste er nået. + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af blæksprutter i verdenen er nået. + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af fjender i verdenen er nået. + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af landsbyboere i verdenen er nået. + + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede ulve er nået. + + + Det maksimale antal af hoveder i verdenen er nået. + + + Vend kamera + + + Venstrehåndet + + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede høns er nået. + + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede muhsvampe er nået. + + + Det maksimale antal af både i verdenen er nået. + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af høns i verdenen er nået. + {*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*} @@ -4781,9 +2382,63 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Nulstil Afgrunden + + %s er rejst til Mørket + + + %s har forladt Mørket + + + +{*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*} + + 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. + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af grise, får, køer, katte og heste er nået. + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af muhsvampe er nået. + + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af ulve i verdenen er nået. + Nulstil Afgrunden @@ -4791,113 +2446,11 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Lad være med at nulstille Afgrunden - Du kan ikke klippe denne muhsvamp i øjeblikket. Det maksimale antal af grise, får, køer og katte er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af grise, får, køer og katte er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af muhsvampe er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af ulve i verdenen er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af høns i verdenen er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af blæksprutter i verdenen er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af fjender i verdenen er nået. - - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af landsbyboere i verdenen er nået. - - - Det maksimale antal af malerier/rammer i verdenen er nået. - - - Du kan ikke fremkalde fjender i spiltypen Fredfyldt. - - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede grise, får, køer og katte er nået. - - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede ulve er nået. - - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede høns er nået. - - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede muhsvampe er nået. - - - Det maksimale antal af både i verdenen er nået. - - - Det maksimale antal af hoveder i verdenen er nået. - - - Vend kamera - - - Venstrehåndet + Du kan ikke klippe denne muhsvamp i øjeblikket. Det maksimale antal af grise, får, køer, katte og heste er nået. Du døde! - - Gendan - - - Tilbud på indhold, der kan hentes - - - Skift overflade - - - Sådan spiller du - - - Styring - - - Indstillinger - - - Folkene bag - - - Geninstallér indhold - - - Gendan indstillinger - - - Ilden spreder sig - - - TNT eksploderer - - - Spiller mod spiller - - - Stol på spillere - - - Værtsprivilegier - - - Opret strukturer - - - Helt flad verden - - - Bonuskiste - Verdensindstillinger @@ -4907,18 +2460,18 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Kan bruge døre og kontakter + + Opret strukturer + + + Helt flad verden + + + Bonuskiste + Kan åbne beholdere - - Kan angribe spillere - - - Kan angribe dyr - - - Moderator - Smid spiller ud @@ -4928,185 +2481,307 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Slå udmattelse fra + + Kan angribe spillere + + + Kan angribe dyr + + + Moderator + + + Værtsprivilegier + + + Sådan spiller du + + + Styring + + + Indstillinger + + + Gendan + + + Tilbud på indhold, der kan hentes + + + Skift overflade + + + Folkene bag + + + TNT eksploderer + + + Spiller mod spiller + + + Stol på spillere + + + Geninstallér indhold + + + Gendan indstillinger + + + Ilden spreder sig + + + Mørkedrage + + + {*PLAYER*} blev dræbt af mørkedragens ånde + + + {*PLAYER*} blev dræbt af {*SOURCE*} + + + {*PLAYER*} blev dræbt af {*SOURCE*} + + + {*PLAYER*} døde + + + {*PLAYER*} sprang i luften + + + {*PLAYER*} blev dræbt af magi + + + {*PLAYER*} blev skudt af {*SOURCE*} + + + Grundfjeldståge + + + Vis display + + + Vis hånd + + + {*PLAYER*} blev skudt ned med ildkugler af {*SOURCE*} + + + {*PLAYER*} blev banket ihjel af {*SOURCE*} + + + {*PLAYER*} blev dræbt af {*SOURCE*}, der brugte magi + + + {*PLAYER*} faldt ud af verdenen + + + Teksturpakker + + + Mash-up-pakke + + + {*PLAYER*} gik op i røg + + + Temaer + + + Spillerbilleder + + + Avatargenstande + + + {*PLAYER*} brændte ihjel + + + {*PLAYER*} sultede ihjel + + + {*PLAYER*} blev stukket ihjel + + + {*PLAYER*} ramte jorden for hurtigt + + + {*PLAYER*} prøvede at svømme i lava + + + {*PLAYER*} blev kvalt i en væg + + + {*PLAYER*} druknede + + + Beskeder ved dødsfald + + + Du er ikke længere en moderator + + + Nu kan du flyve + + + Du kan ikke længere flyve + + + Du kan ikke længere angribe dyr + + + Nu kan du angribe dyr + + + Nu er du en moderator + + + Du vil ikke længere blive udmattet + + + Nu er du usårlig + + + Du er ikke længere usårlig + + + %d MSP + + + Nu bliver du udmattet + + + Nu er du en usynlig + + + Du er ikke længere usynlig + + + Nu kan du angribe andre spillere + + + Nu kan du udvinde og bruge genstande + + + Du kan ikke længere placere blokke + + + Nu kan du placere blokke + + + Animerede figurer + + + Tilpassede skinanimationer + + + Du kan ikke længere udvinde eller bruge genstande + + + Nu kan du bruge døre og kontakter + + + Du kan ikke længere angribe væsner + + + Nu kan du angribe væsner + + + Du kan ikke længere angribe andre spillere + + + Du kan ikke længere bruge døre og kontakter + + + Nu kan du bruge beholdere (fx kister) + + + Du kan ikke længere bruge beholdere (fx kister) + Usynlig - - Indstillinger for vært + + Signallys - - Spillere/invitér + + {*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*} + - - Onlinespil + + Fyrværkeri - - Kun for inviterede + + Sprog - - Flere indstillinger + + Heste - - Indlæs + + {*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*} - - Ny verden + + {*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. + - - Navn på verden + + {*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. + - - Seed til verdensgeneratoren + + 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. - - Lad stå tom for tilfældigt seed + + Efterlades af Wither, anvendes til at lave signallys. - - Spillere + + Springere - - Tilslut spil + + {*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*} + - - Start spil + + Droppere - - Fandt ingen spil - - - Spil - - - Ranglister - - - Hjælp og indstillinger - - - Oplås det fulde spil - - - Genoptag spil - - - Gem spil - - - Sværhedsgrad: - - - Spiltype: - - - Strukturer: - - - Banetype: - - - PvP: - - - Stol på spillere: - - - TNT: - - - Ilden spreder sig: - - - Geninstallér tema - - - Geninstallér spillerbillede 1 - - - Geninstallér spillerbillede 2 - - - Geninstallér avatargenstand 1 - - - Geninstallér avatargenstand 2 - - - Geninstallér avatargenstand 3 - - - Indstillinger - - - Lyd - - - Følsomhed - - - Grafik - - - Brugerdisplay - - - Gendan standardindstillinger - - - Vis gangbevægelse - - - Tip - - - Redskabstips i spillet - - - Lodret delt skærm for to spillere - - - Afslut - - - Redigér besked på skilt: - - - Indtast oplysningerne til dit billede - - - Overskrift - - - Billede fra spillet - - - Redigér besked på skilt: - - - Klassiske teksturer, ikoner og brugerdisplay fra Minecraft! - - - Vis alle mash-up-verdener - - - Ingen effekter - - - Fart - - - Langsomhed - - - Hast - - - Minetræthed - - - Styrke - - - Svaghed + + BRUGES IKKE Øjeblikkelig energi @@ -5117,62 +2792,3296 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Hoppeboost + + Minetræthed + + + Styrke + + + Svaghed + Kvalme + + BRUGES IKKE + + + BRUGES IKKE + + + BRUGES IKKE + Regenerering Modstand - - Ildmodstand + + Finder seed til verdensgeneratoren - - Vandvejrtrækning + + 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. - - Usynlighed + + En type skinner, der kan aktivere eller deaktivere minevogne med springere og udløse minevogne med TNT. - - Blindhed + + 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. - - Nattesyn + + Kulørte blokke, du kan lave ved at farve hærdet ler. - - Sult + + 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. + + + Bruges som rødstensenergikilde. Kan laves om til rødsten igen. + + + Bruges til at fange genstande eller overføre genstande ind og ud af beholdere. + + + Kan fodres til heste, æsler eller muldyr for at helbrede op til 10 hjerter. Fremskynder føls vækst. + + + Flagermus + + + Disse flyvende væsener findes i huler eller andre store, lukkede rum. + + + Heks + + + Laves ved at smelte ler i en ovn. + + + Laves af glas og en farve. + + + Laves af mosaikglas. + + + Udsender rødstensstrøm. Strømmen er stærkere, hvis der er flere genstande på pladen. + + + Er en blok, som sender et rødstenssignal baseret på sollys (eller mangel på sollys). + + + Er en særlig type minevogn, der fungerer ligesom en springer. Den indsamler genstande, der ligger på skinnerne og fra beholdere over den. + + + En særlig type rustning, som en hest kan bære. Giver fem rustning. + + + Bruges til at bestemme farven, effekten og formen af fyrværkeri. + + + Bruges i rødstenskredsløb til at vedligeholde, sammenligne eller fratrække signalstyrke eller til at måle visse bloktilstande. + + + Er en type minevogn, der fungerer som en rullende TNT-blok. + + + En særlig type rustning, som en hest kan bære. Giver syv rustning. + + + Bruges til at udføre kommandoer. + + + Sender en stråle af lys op i himlen og giver statuseffekter til spillere i nærheden. + + + 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. + + + En særlig type rustning, som en hest kan bære. Giver 11 rustning. + + + Bruges til at tøjre monstre til spilleren eller hegnspæle. + + + Bruges til at navngive monstre i verdenen. + + + Hast + + + Oplås det fulde spil + + + Genoptag spil + + + Gem spil + + + Spil + + + Ranglister + + + Hjælp og indstillinger + + + Sværhedsgrad: + + + PvP: + + + Stol på spillere: + + + TNT: + + + Spiltype: + + + Strukturer: + + + Banetype: + + + Fandt ingen spil + + + Kun for inviterede + + + Flere indstillinger + + + Indlæs + + + Indstillinger for vært + + + Spillere/invitér + + + Onlinespil + + + Ny verden + + + 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 + + + Sprængstofsanimator + + + En stor sort drage, der lever i Mørket. + + + Flammeånd + + + Disse fjender lever i Afgrunden og oftest inde i afgrundsfæstninger. De efterlader flammestave, når de dør. + + + Snegolem + + + En snegolem består af sneblokke og et græskar. Den kaster snebolde efter dens skabers fjender. + + + Mørkedrage + + + Magmablokke + + + 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. + + + Jerngolem + + + Beskytter landsbyerne. Kan fremstilles med blokke af jern og græskar. + + + Magmablokkene lever i Afgrunden. Ligesom slim deler de sig i mindre stykker, hvis du dræber dem. + + + Landsbyboer + + + Ozelot + + + Skaber kraftigere fortryllelser, når de er placeret omkring et fortryllelsesbord. + + + {*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. + + + + {*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. + + + + {*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. + + + + {*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. + + + + {*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. + + + + {*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. + + + + {*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*} + + + {*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. + + + + {*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 + + + + 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. + + + Snigerne blev født af en programfejl. + + + Er det en kylling, eller er det en and? + + + Mojangs nye kontorer er så seje! + + + {*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. + + + {*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. + + + {*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. + + + Minecon 2013 blev afholdt i Orlando, Florida, USA! + + + .party() var alt for fedt! + + + Antag altid, at rygter er falske, snarere end at tro, at de er sande! + + + Forrige side + + + Handel + + + Ambolt + + + Mørket + + + Blokér baner + + + Kreativ + + + Indstillinger for vært og spiller + + + {*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. + + + + {*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*} + + + + Gør mere skade end næver. + + + Grav i jord, græs, sand, grus og sne hurtigere end med hænderne. Der skal bruges skovle for at grave snebolde op. + + + Spurt + + + Nyt + + + {*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*} + + + + Sådan deler du billeder + + + Kister + + + Fremstilling + + + Ovn + + + Det grundlæggende + + + Display + + + Lager + + + Automat + + + Fortryllelse + + + Portal til Afgrunden + + + Multiplayer + + + Husdyr + + + Dyreavl + + + Brygning + + + deadmau5 er vild med Minecraft! + + + Grisemænd angriber dig ikke, medmindre du angriber dem. + + + Du kan skifte dit gendannelsespunkt og springe frem til daggry ved at sove i en seng. + + + Slå ildkuglerne tilbage mod gyslingen! + + + Lav fakler for at få lys om natten. Monstrene undgår områder med fakler. + + + Du kan komme hurtigere omkring i en minevogn på skinner! + + + Hvis du planter stiklinger, vokser de og bliver til træer. + + + Når du bygger en portal, kan du rejse til en anden dimension: Afgrunden + + + Det er ikke en god idé at grave lige ned eller lige op. + + + Du kan bruge benmel (fremstilles af skeletben) som gødning. Det får dine planter til at vokse øjeblikkeligt! + + + Snigere eksploderer, når de kommer tæt på dig! + + + Tryk på {*CONTROLLER_VK_B*} for at smide den genstand, som du holder i hånden! + + + Find det rigtige redskab til opgaven! + + + Hvis ikke du kan finde kul til dine fakler, kan du altid lave kul ved at brænde træ i ovnen. + + + Hvis du spiser en stegt kotelet, får du mere energi, end hvis du spiser en rå. + + + Hvis du indstiller sværhedsgraden til Fredfyldt, vil din energi automatisk blive gendannet, og der kommer ingen monstre om natten! + + + Tæm en ulv ved at give den et ben. Derefter kan du få den til at sidde eller følge efter dig. + + + Du kan smide genstande fra Lager-menuen ved at trykke på {*CONTROLLER_VK_A*} uden for menuen. + + + + Der er nyt indhold, der kan hentes! Find det via ikonet for Minecraft-butikken i hovedmenuen. + + + Du kan ændre din figurs udseende med en overfladepakke fra Minecraft-butikken. Vælg "Minecraft-butik" i hovedmenuen for at se udbuddet af varer. + + + + Tilpas lysstyrken for at gøre spillet lysere eller mørkere. + + + 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. + + + Kultivér jorden med et lugejern, så du kan plante frø. + + + Edderkopperne angriber dig ikke om dagen, medmindre du angriber dem. + + + Det er hurtigere at grave i jord eller sand med en spade end med dine hænder. + + + Slagt grise for at få koteletter, som du kan stege og spise for at få mere energi. + + + Få læder fra køer til at lave rustninger med. + + + Hvis du har en tom spand, kan du fylde den med mælk fra en ko, vand eller lava! + + + Obsidian bliver skabt ved at blande vand med flydende lava. + + + Nu kan du stable hegn oven på hinanden i spillet. + + + Nogle dyr følger efter dig, hvis du har hvede i hånden. + + + Dyr forsvinder ikke ud af spillet, med mindre de kan bevæge sig mindst 20 blokke væk i en hvilken som helst retning. + + + Tamme ulve viser deres energitilstand med deres hale. Giv dem kød for at genopfriske deres energi. + + + Kog kaktusser i ovnen for at udvinde grøn farve. + + + Du kan læse om de seneste opdateringer i spillet i sektionen Nyt i Sådan spiller du-menuerne. + + + Musik af C418! + + + Hvem er Notch? + + + Mojang har vundet flere priser, end de har medarbejdere! + + + Visse berømtheder spiller Minecraft! + + + Notch har mere end en million følgere på Twitter! + + + Ikke alle svenskere har lyst hår. Der er endda nogle, ligesom Jens fra Mojang, der har rødt hår! + + + Der kommer en opdatering til spillet før eller siden! + + + Hvis du sætter to kister ved siden af hinanden, bliver de til en stor kiste. + + + Pas på, hvis du bygger en bygning i uld udendørs, da lynnedslag kan sætte den i brand. + + + En enkel spand lava kan smelte 100 blokke i ovnen. + + + Materialet under toneblokken afgør, hvilket instrument der spiller. + + + Det kan tage nogle minutter, inden den flydende lava forsvinder FULDSTÆNDIGT, når lavablokken fjernes. + + + Gyslingens ildkugler kan ikke trænge igennem brosten, så derfor er det et effektivt materiale at bruge til at beskytte portaler med. + + + Blokke, der kan bruges som lyskilder, smelter sne og is. Det inkluderer fakler, glødestene og græskarlygter. + + + Zombier og skeletter kan overleve i dagslys, hvis de opholder sig i vand. + + + Høns lægger æg hvert femte til tiende minut. + + + Obsidian kan kun udvindes med en diamanthakke. + + + Snigere er den lettest tilgængelige kilde til krudt. + + + Hvis du angriber en ulv, vil andre ulve i nærheden blive fjendtlige og angribe dig. Det samme gælder for zombificerede grisemænd. + + + Ulve kan ikke rejse til Afgrunden. + + + Ulve kan ikke angribe snigere. + + + Kræves for at udvinde forskellige former for stenblokke og malm. + + + Bruges i kageopskriften og som ingrediens i eliksirer. + + + Sender en elektrisk ladning, når den tændes eller slukkes. Forbliver tændt eller slukket, indtil der bliver trykket på den igen. + + + 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. + + + Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille et guldæble med. + + + Gendanner 2 {*ICON_SHANK_01*} samt energi i fire sekunder. Fremstilles af et æble og guldklumper. + + + Gendanner 2 {*ICON_SHANK_01*}. Indtagelse kan forgifte dig. + + + Bruges i rødstenskredsløb som gentager, forsinker og/eller diode. + + + Bruges til at styre minevogne med. + + + 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. + + + Fungerer som en trykplade (sender et rødstenssignal, når den er aktiveret), men kan kun aktiveres af en minevogn. + + + Sender en elektrisk strøm, når der trykkes på den. Forbliver aktiveret i cirka et sekund, inden den slukkes igen. + + + Skyder med genstande i tilfældig rækkefølge, når den modtager strøm fra rødsten. + + + 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. + + + + Gendanner 2,5 {*ICON_SHANK_01*}. Fremstillet ved at stege rå fisk i en ovn. + + + Gendanner 1 {*ICON_SHANK_01*}. + + + Gendanner 1 {*ICON_SHANK_01*}. + + + Gendanner 3 {*ICON_SHANK_01*}. + + + Bruges som ammunition til buer. + + + Gendanner 2,5 {*ICON_SHANK_01*}. + + + Gendanner 1 {*ICON_SHANK_01*}. Kan bruges seks gange. + + + Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Indtagelse kan forgifte dig. + + + Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. + + + Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kotelet i en ovn. + + + Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan bruges til at tæmme en ozelot med. + + + Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kylling i en ovn. + + + Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. + + + Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege råt kød i en ovn. + + + Kan transportere dig, et dyr eller et monster på skinnerne. + + + Bruges som farve til lyseblå uld. + + + Bruges som farve til cyan uld. + + + Bruges som farve til lilla uld. + + + Bruges som farve til limegrøn uld. + + + Bruges som farve til grå uld. + + + 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.) + + + Bruges som farve til magentafarvet uld. + + + Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. + + + Bruges til fremstilling af bøger og kort. + + + Bruges til fremstilling af bogreoler eller fortryllede bøger, når de er fortryllede. + + + Bruges som farve til blå uld. + + + Spiller musikplader. + + + Bruges til fremstilling af meget solide redskaber, våben og rustninger. + + + Bruges som farve til orange uld. + + + Indsamlet fra får og kan farves. + + + Bruges som byggemateriale og kan farves. Denne opskrift anbefales ikke, fordi det er let at få fat i uld fra får. + + + Bruges som farve til sort uld. + + + Kan transportere gods på skinnerne. + + + Kan køre på skinner og kan skubbe andre minevogne, når der er kul i den. + + + Rejs hurtigere over vand end ved at svømme. + + + Bruges som farve til grøn uld. + + + Bruges som farve til rødt uld. + + + Bruges for at få afgrøder, højt græs, kæmpesvampe og blomster til at vokse øjeblikkeligt og kan bruges i farveopskrifter. + + + Bruges som farve til lyserødt uld. + + + Bruges som farve til brun uld og ingrediens i småkager eller til dyrkning af kakaobønner. + + + Bruges som farve til sølvfarvet uld. + + + Bruges som farve til gul uld. + + + Gør det muligt at skyde med pile. + + + Giver dig 5 rustning, når du har den på. + + + Giver dig 3 rustning, når du har den på. + + + Giver dig 1 rustning, når du har den på. + + + Giver dig 5 rustning, når du har den på. + + + Giver dig 2 rustning, når du har den på. + + + Giver dig 2 rustning, når du har den på. + + + Giver dig 3 rustning, når du har den på. + + + En funklende barre, som du kan lave redskaber ud af. Fremstillet ved bearbejdning af malm i ovnen. + + + 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. + + + 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. + + + Giver dig 8 rustning, når du har den på. + + + Giver dig 6 rustning, når du har den på. + + + Giver dig 3 rustning, når du har den på. + + + Giver dig 6 rustning, når du har den på. + + + Jerndøre kan kun åbnes ved hjælp af rødsten, knapper eller kontakter. + + + Giver dig 1 rustning, når du har den på. + + + Giver dig 3 rustning, når du har den på. + + + Hug forskellige former for træ hurtigere end med hænderne. + + + Opdyrk blokke med græs og jord for at gøre plads til afgrøder. + + + Åbn og luk trædøre ved at slå på dem, aktivere dem eller ved hjælp af rødsten. + + + Giver dig 2 rustning, når du har den på. + + + Giver dig 4 rustning, når du har den på. + + + Giver dig 1 rustning, når du har den på. + + + Giver dig 2 rustning, når du har den på. + + + Giver dig 1 rustning, når du har den på. + + + Giver dig 2 rustning, når du har den på. + + + Giver dig 5 rustning, når du har den på. + + + Kan bruges til at bygge kompakte trapper med. + + + Til svampestuvning. Du får lov at beholde skålen, når stuvningen er spist. + + + Til opbevaring og transport af vand, lava og mælk. + + + Til opbevaring og transport af vand. + + + Viser tekst, der er skrevet af dig eller andre spillere. + + + Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. + + + Skaber eksplosioner. Stil sprængstoffet, og udløs det ved at tænde lunten med et fyrtøj eller en elektrisk ladning. + + + Til opbevaring og transport af lava. + + + Viser solens og månens placeringer. + + + Peger mod din startposition. + + + Tegner et billede af et område, når du bruger det. Du kan bruge kortet til at finde vej med. + + + Til opbevaring og transport af mælk. + + + Tænder ild, udløser sprængstof og aktiverer portaler, når rammen er færdig. + + + Bruges til at fiske med. + + + 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. + + + Bruges som byggemateriale og kan også anvendes til fremstilling af mange genstande. Kan fremstilles af enhver slags træ. + + + Bruges som byggemateriale. Påvirkes ikke af tyngdekraften som normalt sand. + + + Bruges som byggemateriale. + + + Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. + + + Kan bruges til at bygge lange trapper med. To fliser placeret ovenpå hinanden skaber en blok af normal størrelse. + + + Giver lys. Fakler kan også smelte sne og is. + + + Bruges til fremstilling af fakler, pile, skilte, stiger, hegn, samt håndtag til våben og redskaber. + + + Kan opbevare blokke og genstande. Stil to kister ved siden af hinanden for at skabe en større kiste med dobbelt så meget plads. + + + 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. + + + + Bruges til at klatre lodret med. + + + 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. + + + Giver dig mulighed for at fremstille et mere varieret udvalg af genstande end ellers. + + + Giver dig mulighed for at smelte malm, fremstille kul og glas samt stege fisk og koteletter. + + + Jernøkse + + + Rødstenslampe + + + Trappe af jungletræ + + + Trappe af birketræ + + + Nuværende styring + + + Kranium + + + Kakao + + + Trappe af grantræ + + + Drageæg + + + Mørkesten + + + Portalramme til Mørket + + + Trappe af sandsten + + + Bregne + + + Buskads + + + Layout + + + Fremstilling + + + Anvend + + + Handling + + + List/flyv nedad + + + List + + + Smid + + + Skift anvendt genstand + + + Pause + + + Synsvinkel + + + Gå/spurt + + + Lager + + + Hop/flyv op + + + Hop + + + Portal til Mørket + + + Græskarstilk + + + Melon + + + Rude af glas + + + Låge + + + Vinranke + + + Melonstilk + + + Jernbarrer + + + Revnet mursten af sten + + + Mursten af mossten + + + Mursten af sten + + + Svamp + + + Svamp + + + Tilhugget mursten af sten + + + Trappe af mursten + + + Afgrundsurt + + + Trappe af afgrundsmursten + + + Hegn af afgrundsmursten + + + Gryde + + + Bryggestativ + + + Fortryllelsesbord + + + Afgrundsmursten + + + Sølvfisk fra brosten + + + Sølvfisk fra sten + + + Trappe af stenmursten + + + Åkandeblad + + + Mycelium + + + Sølvfisk fra mursten af sten + + + Skift kameravinkel + + + 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. + + + 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. + + + + Dit lager bliver fyldt, efterhånden som du fremstiller og indsamler flere genstande.{*B*} + +Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. + + + Du kan lave planker ud af det træ, du finder. Åbn fremstillingsskærmen for at lave dem.{*PlanksIcon*} + + + 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*} + + + 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. + + + Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen. + + + 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. + + + + Brug {*CONTROLLER_ACTION_MOVE*} for at gå. + + + Brug {*CONTROLLER_ACTION_LOOK*} for at kigge op, ned og rundt omkring dig. + + + 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. + + + 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å {*CONTROLLER_ACTION_JUMP*} for at hoppe. + + + Mange fremstillingsprocesser indeholder flere trin. Nu hvor du har nogle planker, er der flere genstande, som du kan lave. Byg et arbejdsbord.{*CraftingTableIcon*} + + + + 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. + + + + Åbn beholderen + + + 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*} + + + 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*} + + + + 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. + + + + + 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 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*} + + + 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. + + + Brug {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for at udskifte den genstand, du har i hånden. + + + 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 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*} + + + Ret sigtekornet mod arbejdsbordet, og tryk på {*CONTROLLER_ACTION_USE*} for at åbne det. + + + Vælg arbejdsbordet, og ret sigtekornet mod det sted, hvor du vil placere det. Tryk på {*CONTROLLER_ACTION_USE*} for at placere arbejdsbordet. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Layout 1 + + + Bevægelse (flyver) + + + Spillere/invitér + + + + + + Layout 3 + + + Layout 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at fortsætte. + + + + + + + + + + + + + + + + + + + + + + + + + + + Blok med sølvfisk + + + Flise af sten + + + En kompakt måde at opbevare jern på. + + + Blok af jern + + + Flise af bøgetræ + + + Sandstensflise + + + Flise af sten + + + En kompakt måde at opbevare guld på. + + + Blomst + + + Hvid uld + + + Orange uld + + + Blok af guld + + + Svamp + + + Rose + + + Flise af brosten + + + Bogreol + + + TNT + + + Mursten + + + Fakkel + + + Obsidian + + + Mossten + + + Flise af afgrundsmursten + + + Flise af bøgetræ + + + Flise af stenmursten + + + Flise af mursten + + + Flise af jungletræ + + + Flise af birketræ + + + Flise af grantræ + + + Magentafarvet uld + + + Birkeblade + + + Granblade + + + Bøgeblade + + + Glas + + + Svamp + + + Jungleblade + + + Blade + + + Bøg + + + Gran + + + Birk + + + Grantræ + + + Birketræ + + + Jungletræ + + + Uld + + + Lyserød uld + + + Grå uld + + + Lysegrå uld + + + Lyseblå uld + + + Gul uld + + + Limegul uld + + + Cyan uld + + + Grøn uld + + + Rød uld + + + Sort uld + + + Lilla uld + + + Blå uld + + + Brun uld + + + Fakkel (kul) + + + Glødesten + + + Sjælesand + + + Afgrundssten + + + Blok af lasursten + + + Lasurstensmalm + + + Portal + + + Græskarlygte + + + Sukkerrør + + + Ler + + + Kaktus + + + Græskar + + + Hegn + + + Jukebox + + + En kompakt måde at opbevare lasursten på. + + + Faldlem + + + Låst kiste + + + Diode + + + Klistret stempel + + + Stempel + + + Uld (en hvilken som helst farve) + + + Vissen busk + + + Kage + + + Nodeblok + + + Automat + + + Højt græs + + + Spindelvæv + + + Seng + + + Is + + + Arbejdsbord + + + En kompakt måde at opbevare diamanter på. + + + Blok af diamant + + + Ovn + + + Landbrugsjord + + + Afgrøder + + + Diamantmalm + + + Monsterfremkalder + + + Ild + + + Fakkel (trækul) + + + Støv fra rødsten + + + Kiste + + + Trappe af bøgetræ + + + Skilt + + + Rødstensmalm + + + Jerndør + + + Trykplade + + + Sne + + + Knap + + + Rødstensfakkel + + + Håndtag + + + Skinne + + + Stige + + + Trædør + + + Trappe af sten + + + Kontaktskinne + + + Strømskinne + + + Du har samlet nok brosten til at bygge en ovn. Byg en på arbejdsbordet. + + + Fiskestang + + + Ur + + + Støv fra glødesten + + + Minevogn med ovn + + + Æg + + + Kompas + + + Rå fisk + + + Rosenrødt + + + Kaktusgrønt + + + Kakaobønner + + + Stegt fisk + + + Farvepulver + + + Blækpose + + + Minevogn med kiste + + + Snebold + + + Båd + + + Læder + + + Minevogn + + + Sadel + + + Rødsten + + + Mælkespand + + + Papir + + + Bog + + + Slimklat + + + Mursten + + + Ler + + + Sukkerrør + + + Lasursten + + + Kort + + + Musikplade – "13" + + + Musikplade – "cat" + + + Seng + + + Rødstensgentager + + + Småkage + + + Musikplade – "blocks" + + + Musikplade – "mellohi" + + + Musikplade – "stal" + + + Musikplade – "strad" + + + Musikplade – "chirp" + + + Musikplade – "far" + + + Musikplade – "mall" + + + Kage + + + Grå farve + + + Lyserød farve + + + Limegrøn farve + + + Lilla farve + + + Cyan farve + + + Lysegrå farve + + + Mælkebøttegul + + + Benmel + + + Ben + + + Sukker + + + Lyseblå farve + + + Magenta farve + + + Orange farve + + + Skilt + + + Lædertunika + + + Brystplade af jern + + + Diamantbrystplade + + + Jernhjelm + + + Diamanthjelm + + + Guldhjelm + + + Brystplade af guld + + + Guldbukser + + + Læderstøvler + + + Jernstøvler + + + Læderbukser + + + Jernbukser + + + Diamantbukser + + + Læderhætte + + + Lugejern af sten + + + Lugejern af jern + + + Diamantlugejern + + + Diamantøkse + + + Guldøkse + + + Lugejern af træ + + + Guldlugejern + + + Ringbrynje + + + Ringbukser + + + Ringstøvler + + + Trædør + + + Jerndør + + + Ringhjelm + + + Diamantstøvler + + + Fjer + + + Krudt + + + Hvedefrø + + + Skål + + + Svampestuvning + + + Snor + + + Hvede + + + Stegt kotelet + + + Maleri + + + Guldæble + + + Brød + + + Flint + + + Rå kotelet + + + Pind + + + Spand + + + Vandspand + + + Lavaspand + + + Guldstøvler + + + Jernbarre + + + Guldbarre + + + Fyrtøj + + + Kul + + + Trækul + + + Diamant + + + Æble + + + Bue + + + Pil + + + Musikplade – "ward" + + + + 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*} + + + + + 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*} + + + + + 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. + + + + + 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. + + + + " + 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*} + " + + + + " + 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*} + " + + + + Du kan lave planker ud af det træ, du finder. Vælg plankeikonet, og tryk på {*CONTROLLER_VK_A*} for at lave dem.{*PlanksIcon*} + + + + 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. + + + + + 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. + + + + + 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*}. + + + + + Listen over de nødvendige ingredienser bliver vist. + + + + + Beskrivelsen af den valgte genstand bliver vist. Den hjælper dig med at finde ud af, hvad genstanden kan bruges til. + + + + + 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. + + + + + Visse genstande kan ikke fremstilles på arbejdsbordet. Her skal du bruge en ovn. Byg en ovn.{*FurnaceIcon*} + + + + Grus + + + Guldmalm + + + Jernmalm + + + Lava + + + Sand + + + Sandsten + + + Kulmalm + + + {*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. + + + + + 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. + + + + + 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. + + + + Træ + + + Bøgetræ + + + + 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. + + + + {*B*} + Tryk på {*CONTROLLER_VK_X*} for at se lageret igen. + + + + {*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. + + + + + 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. + + + + + {*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. + + + + + Hvis du flytter markøren uden for kanten af skærmen, kan du smide en genstand. + + + + 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*}. + + + + 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. + + + + + Du har gennemført den første del af introduktionen. + + + + Lav glas i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. + + + Lav kul i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. + + + Placér ovnen i verden med {*CONTROLLER_ACTION_USE*}, og åbn den. + + + 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*} + + + Placér døren med {*CONTROLLER_ACTION_USE*}. Du kan åbne og lukke en trædør ved hjælp af {*CONTROLLER_ACTION_USE*}. + + + 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*} + + + + Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren hen over genstanden og trykke på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + + Dette er fremstillingsskærmen. Her kan du fremstille nye genstande ved at kombinere de genstande, du har samlet sammen. + + + + + Tryk på {*CONTROLLER_VK_B*} for at lukke lageret i Kreativ. + + + + + Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren hen over genstanden og trykke på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + {*B*} + Tryk på {*CONTROLLER_VK_X*} for at se de ingredienser, der skal bruges for at lave denne genstand. + + + + {*B*} + Tryk på {*CONTROLLER_VK_X*} for at se beskrivelsen af genstanden. + + + + {*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. + + + + + 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. + + + + {*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. + + + + + 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. + + + + + Tryk på {*CONTROLLER_VK_B*} for at lukke lageret. + + + + + 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. + + + + + 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. + + + + + 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. + + + + Vand + + + Glasflaske + + + Vandflaske + + + Edderkoppeøje + + + Guldklump + + + Afgrundsurt + + + {*splash*}{*prefix*}Eliksir {*postfix*} + + + Gæret edderkoppeøje + + + Gryde + + + Mørkeøje + + + Glimmermelon + + + Pulver fra flammeånd + + + Magmacreme + + + Bryggestativ + + + Gyslingetåre + + + Græskarfrø + + + Melonfrø + + + Rå kylling + + + Musikplade – "11" + + + Musikplade – "where are we now?" + + + Saks + + + Stegt kylling + + + Mørkeperle + + + Melonskive + + + Flammestav + + + Råt kød + + + Steak + + + Rådden fisk + + + Erfaringseliksir + + + Planker af bøgetræ + + + Planker af grantræ + + + Planker af birketræ + + + Græsblok + + + Jord + + + Brosten + + + Planker af jungletræ + + + Stikling fra birketræ + + + Stikling fra jungletræ + + + Grundfjeld + + + Stikling + + + Stikling fra bøgetræ + + + Stikling fra grantræ + + + Sten + + + Ramme + + + Fremkald {*CREATURE*} + + + Afgrundsmursten + + + Ildladning + + + Ildladning (trækul) + + + Ildladning (kul) + + + Kranium + + + Hoved + + + Hoved fra %s + + + Snigerhoved + + + Kranium fra skelet + + + Kranium fra visneskelet + + + Zombiehoved + + + 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 sløvhed + + + af hast + + + af svaghed + + + af styrke + + + Ildmodstand + + + Mætning + af modstand - - af ildmodstand + + af spring - - af vandvejrtrækning + + Wither - - af usynlighed + + Helbredsbonus - - af blindhed - - - af nattesyn - - - af sult - - - af gift + + Absorbering @@ -5213,9 +6131,78 @@ Vil du installere mash-up-pakken eller teksturpakken nu? III + + af usynlighed + IV + + af vandvejrtrækning + + + af ildmodstand + + + af nattesyn + + + af gift + + + af sult + + + med absorbering + + + med mætning + + + med helbredsbonus + + + af blindhed + + + med fordærv + + + Kunstløs + + + Tynd + + + Diffus + + + Klar + + + Mælket + + + Akavet + + + Smørret + + + Jævn + + + Klodset + + + Flad + + + Pladskrævende + + + Kedelig + Plask @@ -5225,50 +6212,14 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Uinteressant - - Kedelig + + Flot - - Klar + + Hjertelig - - Mælket - - - Diffus - - - Kunstløs - - - Tynd - - - Akavet - - - Flad - - - Pladskrævende - - - Klodset - - - Smørret - - - Jævn - - - Glat - - - Rar - - - Tyk + + Charmerende Elegant @@ -5276,149 +6227,152 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Fancy - - Charmerende - - - Flot - - - Raffineret - - - Hjertelig - Mousserende - - Potent - - - Fæl - - - Lugtfri - Rang Harsk + + Lugtfri + + + Potent + + + Fæl + + + Glat + + + Raffineret + + + Tyk + + + Rar + + + Gendanner energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. + + + Reducerer øjeblikkeligt energien for spillere, dyr og monstre, som eliksiren bruges på. + + + 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. + 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å. + + + Bruges som grundingrediens i alle eliksirer. Bruges i et bryggestativ for at brygge eliksirer. + Klam Stinkende - - Bruges som grundingrediens i alle eliksirer. Bruges i et bryggestativ for at brygge eliksirer. - - - 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. - - - Reducerer 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å. - - - 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å. - - - Reducerer øjeblikkeligt energien for spillere, dyr og monstre, som eliksiren bruges på. - - - Gendanner energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. - - - Gør spillere, dyr og monstre, som eliksiren bruges på, usårlige over for angreb på afstand med ild, lava og fra flammeånder. - - - Reducerer energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. + + Fordriv Skarphed - - Fordriv + + Reducerer energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. - - Leddyrenes banemand + + Angrebsskade Tilbageslag - - Ildaspekt + + Leddyrenes banemand - - Beskyttelse + + Fart - - Beskyttelse mod ild + + Zombieforstærkninger - - Fjerfald + + Hestehopstyrke - - Beskyttelse mod eksplosioner + + Ved brug: - - Beskyttelse mod projektiler + + Modstandskraft mod at blive slået tilbage - - Respiration + + Væsners forfølgelsesradius - - Vandtilpasset - - - Effektivitet + + Maksimalt helbred Silkeberøring - - Ubrydelig + + Effektivitet - - Plyndring + + Vandtilpasset Held - - Kraft + + Plyndring - - Flamme + + Ubrydelig - - Slag + + Beskyttelse mod ild - - Uendelighed + + Beskyttelse - - I + + Ildaspekt - - II + + Fjerfald - - III + + Respiration + + + Beskyttelse mod projektiler + + + Beskyttelse mod eksplosioner IV @@ -5429,23 +6383,29 @@ Vil du installere mash-up-pakken eller teksturpakken nu? VI + + Slag + VII - - VIII + + III - - IX + + Flamme - - X + + Kraft - - Indeholder smaragder, der kan udvindes med en hakke af jern eller kraftigere materiale. + + Uendelighed - - 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. + + II + + + I Aktiveres, når noget passerer gennem en forbundet snubletråd. @@ -5456,44 +6416,59 @@ Vil du installere mash-up-pakken eller teksturpakken nu? En kompakt måde at opbevare smaragder på. - - En væg af brosten. + + 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. - - Kan bruges til at reparere våben, redskaber og rustninger med. + + IX - - Smeltes i en ovn for at udvinde afgrundskvarts. + + VIII - - Bruges som en dekoration. + + Indeholder smaragder, der kan udvindes med en hakke af jern eller kraftigere materiale. - - Kan handles med landsbyboere. - - - Bruges som en dekoration. Der kan plantes blomster, stiklinger, kaktusser og svampe i den. + + X Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille en guldgulerod med. Kan plantes på opdyrket jord. + + Bruges som en dekoration. Der kan plantes blomster, stiklinger, kaktusser og svampe i den. + + + En væg af brosten. + Gendanner 0,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan plantes på opdyrket jord. - - Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at tilberede en kartoffel i en ovn. + + Smeltes i en ovn for at udvinde afgrundskvarts. + + + Kan bruges til at reparere våben, redskaber og rustninger med. + + + Kan handles med landsbyboere. + + + Bruges som en dekoration. + + + Gendanner 4 {*ICON_SHANK_01*}. - 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. + Gendanner 1 {*ICON_SHANK_01*}. Indtagelse kan forgifte dig. Bruges til at styre en sadlet gris med, når du ridder på den. - - Gendanner 4 {*ICON_SHANK_01*}. + + Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at tilberede en kartoffel i en ovn. + + + Gendanner 3 {*ICON_SHANK_01*}. Fremstillet af en gulerod og guldklumper. Bruges med en ambolt for at fortrylle våben, redskaber og rustninger. @@ -5501,6 +6476,15 @@ Vil du installere mash-up-pakken eller teksturpakken nu? 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 + + Græskartærte - - Kartoffel - - - 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 - - Omkostninger for fortryllelse: %d - For dyr - - Omdøb + + Omkostninger for fortryllelse: %d Du har: - - Påkrævet for handel + + Omdøb {*VILLAGER_TYPE*} tilbyder %s - - Reparation + + Påkrævet for handel Handel - - Farv krave + + Reparation 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 + + + + 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,24 +6713,14 @@ 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. 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. - - - - - Det er muligt at omdøbe genstanden ved at redigere navnet i tekstboksen. @@ -5758,9 +6728,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Når du fjerner den reparerede genstand, bliver begge ingredienser brugt af ambolten, og dit erfaringsniveau bliver fratrukket omkostningerne for arbejdet. - + - 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. + Det er muligt at omdøbe genstanden ved at redigere navnet i tekstboksen. @@ -5770,9 +6740,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til ambolten. - + - 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. + 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. @@ -5780,9 +6750,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Du kan finde fortryllede bøger i kister i fangekældre, eller du kan fortrylle en normal bog på et fortryllelsesbord. - + - Det koster erfaringsniveauer at bruge ambolten, og der er en risiko for, at du beskadiger ambolten. + 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. @@ -5790,9 +6760,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Reparationsomkostningerne bliver afgjort af arbejdets karakter, genstandens værdi, antallet af fortryllelser samt antallet af forbedringer, der er foretaget tidligere. - + - Når du omdøber en genstand, ændres navnet for alle spillere, og omkostningerne for tidligere arbejde reduceres. + Det koster erfaringsniveauer at bruge ambolten, og der er en risiko for, at du beskadiger ambolten. @@ -5800,9 +6770,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? I kisten i dette område finder du en beskadiget hakke, råmaterialer, en erfaringseliksir og fortryllelsesbøger, som du kan eksperimentere med. - + - Dette er handelsskærmen, der viser, hvilke handler du kan gøre med en landsbyboer. + Når du omdøber en genstand, ændres navnet for alle spillere, og omkostningerne for tidligere arbejde reduceres. @@ -5812,9 +6782,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til handelsskærmen. - + - Alle handler, som landsbyboeren vil gå med til i øjeblikket, bliver vist øverst på skærmen. + Dette er handelsskærmen, der viser, hvilke handler du kan gøre med en landsbyboer. @@ -5822,9 +6792,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Hvis du mangler de nødvendige genstande, vil handlerne være utilgængelige og vist med rød tekst. - + - De to felter til venstre viser mængden og typen af genstande, som du tilbyder landsbyboeren. + Alle handler, som landsbyboeren vil gå med til i øjeblikket, bliver vist øverst på skærmen. @@ -5832,14 +6802,24 @@ Vil du installere mash-up-pakken eller teksturpakken nu? I de to felter til venstre kan du se det samlede antal af genstande, der skal bruges for at gennemføre handlen. - + - Tryk på {*CONTROLLER_VK_A*} for at handle med de genstande, som landsbyboeren har bedt om, for de genstande, der bliver tilbudt. + De to felter til venstre viser mængden og typen af genstande, som du tilbyder landsbyboeren. I dette område finder du en landsbyboer og en kiste, der indeholder papir, som du kan købe genstande for. + + + + + Tryk på {*CONTROLLER_VK_A*} for at handle med de genstande, som landsbyboeren har bedt om, for de genstande, der bliver tilbudt. + + + + + 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,37 +1,122 @@  - - 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 + + + Online-ID for deltagere på delt skærm + + + Trophies + + + 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. + + + 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. + + + Online-ID'er: + + + 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. + + + Opdatering 1.04 (titelopdatering 14) + + + Online-ID'er i spillet + + + Se, hvad jeg har lavet i Minecraft: PlayStation®Vita Edition! + + + Fejl ved download. Prøv igen senere. + + + Kunne ikke føje dig til spillet på grund af en restriktiv NAT-type. Se dine netværksindstillinger. + + + Fejl ved upload. Prøv igen senere. + + + Download gennemført! + + + +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. + + + + Kunne ikke gemme + + + 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. + + + Upload annulleret + + + Du har annulleret upload af disse gemte data til det sikre overførselssted. + + + Upload gemt spil til Vita/PS4™-brug + + + Uploader data : %d%% + + + "PSN" + + + Download gemt PS3™-spil + + + Downloader data: %d%% + + + Gemmer + + + Upload er gennemført! + + + Er du sikker på, at du vil uploade dette gemte spil og overskrive ethvert aktuelt gemt spil i overførselsområdet? + + + Konverterer data + + + BRUGES IKKE + + + BRUGES IKKE {*T3*}SÅDAN SPILLER DU: KREATIV{*ETW*}{*B*}{*B*} @@ -45,32 +130,80 @@ Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig 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. - - BRUGES IKKE - - - BRUGES IKKE - "BRUGES IKKE" - - "BRUGES IKKE" - - - Invitér venner - 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? 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? - - Denne verden er tidligere blevet gemt i Kreativ, og trophies og ranglister vil være slået fra. + + "BRUGES IKKE" - - 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? + + Invitér venner + + + minecraftforum indeholder en særlig sektion for PlayStation®Vita Edition + + + Du kan få de seneste nyheder om spillet fra @4JStudios og @Kappische på Twitter! + + + IKKE BRUGT + + + Du kan bruge berøringskærmen på PlayStation®Vita-systemet til at navigere i menuerne! + + + Du må aldrig kigge direkte på en mørkemand! + + + {*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. + + + {*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. + + + Vi tror, at 4J Studios har fjernet Herobrine fra spillet til PlayStation®Vita-systemet, men vi er ikke sikre. + + + Minecraft: PlayStation®Vita Edition slog mange rekorder! + + + 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? + + + "Minecraft: PlayStation®Vita Edition" kunne ikke blive indlæst og kan derfor ikke fortsætte. + + + Brygning + + + Du er blevet sendt tilbage til startskærmen, fordi du er blevet logget ud af "PSN". + + + 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. + + + 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. + + + 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. + + + 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. + + + Du må ikke deltage i denne spilsession, fordi Online er slået fra for din Sony Entertainment Network-konto på grund af chatbegrænsninger. Forbindelsen til "PSN" blev afbrudt. Afslutter til hovedmenuen. @@ -78,11 +211,23 @@ Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig Forbindelsen til "PSN" blev afbrudt. + + Denne verden er tidligere blevet gemt i Kreativ, og trophies og ranglister vil være slået fra. + + + 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? + 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? + + Gæstespillere kan ikke låse op for det komplette spil. Log venligst ind med en Sony Entertainment Network-konto. + + + Online-ID + 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". @@ -92,150 +237,7 @@ Vil du låse op for det komplette spil? 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? - - Gæstespillere kan ikke låse op for det komplette spil. Log venligst ind med en Sony Entertainment Network-konto. - - - Online-ID - - - Brygning - - - Du er blevet sendt tilbage til startskærmen, fordi du er blevet logget ud af "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? - - - "Minecraft: PlayStation®Vita Edition" kunne ikke blive indlæst og kan derfor ikke fortsætte. - - - 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. - - - 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. - - - Du må ikke deltage i denne spilsession, fordi Online er slået fra for din Sony Entertainment Network-konto på grund af chatbegrænsninger. - - - 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. - - - 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. - - - 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. - - - 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. - - - Online-ID for deltagere på delt skærm - - - Trophies - - - Online-ID'er: - - - Online-ID'er i spillet - - - Se, hvad jeg har lavet i Minecraft: PlayStation®Vita Edition! - - - 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. - - - Opdatering 1.04 (titelopdatering 14) - - - SELECT - - - 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. - - - Vil du logge ind på "PSN"? - - - 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. - - - PlayStation®Vita-system - - - Skift netværkstilstand - - - Vælg netværkstilstand - - - 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. - - - Ad hoc-netværk - - - "PSN" - - - Download gemt PlayStation®3-system spil - - - - Upload gemt spil til PlayStation®3/PlayStation®4-system brug - - - Upload annulleret - - - Du har annulleret upload af disse gemte data til det sikre overførselssted. - - - Uploader data : %d%% - - - Downloader data: %d%% - - - Er du sikker på, at du vil uploade dette gemte spil og overskrive ethvert aktuelt gemt spil i overførselsområdet? - - - Konverterer data - - - Gemmer - - - Upload er gennemført! - - - Fejl ved upload. Prøv igen senere. - - - Download gennemført! - - - Fejl ved download. Prøv igen senere. - - - Kunne ikke føje dig til spillet på grund af en restriktiv NAT-type. Se dine netværksindstillinger. - - - 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. - - - - Kunne ikke gemme - - - 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. + + 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. - - - Das Spiel wurde beendet, weil du dich von "PSN" abgemeldet hast. - - - Derzeit nicht angemeldet. - - - - Dieses Spiel verfügt über Funktionen, die eine Verbindung mit "PSN" erfordern, aber du bist derzeit offline. - - - Ad-hoc-Netzwerk offline. - - - 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 - - - Problem mit Trophäe - - - Beim Zugriff auf dein Sony Entertainment Network-Konto ist ein Problem aufgetreten. Deine Trophäe kann derzeit nicht verliehen werden. + + Speichern der Einstellungen des Sony Entertainment Network-Kontos fehlgeschlagen. Problem mit Sony Entertainment Network-Konto - - Speichern der Einstellungen des Sony Entertainment Network-Kontos fehlgeschlagen. + + Beim Zugriff auf dein Sony Entertainment Network-Konto ist ein Problem aufgetreten. Deine Trophäe kann derzeit nicht verliehen werden. 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? + + Mit Ad-hoc-Netzwerk verbinden + + + Einige Funktionen dieses Spiels erfordern eine Ad-hoc-Netzwerkverbindung, allerdings bist du derzeit offline. + + + Ad-hoc-Netzwerk offline. + + + Problem mit Trophäe + + + Das Spiel wurde beendet, weil du dich von "PSN" abgemeldet hast. + + + Du bist zum Titelbildschirm zurückgekehrt, weil du dich von "PSN" abgemeldet hast. + + + Im Systemspeicher ist nicht genug freier Speicherplatz vorhanden, um einen Spielstand zu erstellen. + + + 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,252 +1,3548 @@  - - 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. - - - {*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. + + O. K. + + + Abbrechen + + + Minecraft Store + + + Drehen + + + Ausblenden + + + Alle Plätze leeren + + + Möchtest du dieses Spiel wirklich verlassen und dem neuen beitreten? Dabei gehen nicht gespeicherte Fortschritte verloren. + + + Willst du wirklich mit der aktuellen Version dieser Welt alle früheren Speicherdateien für diese Welt überschreiben? + + + Möchtest du wirklich ohne Speichern aufhören? Du verlierst dabei alle Fortschritte in dieser Welt! + + + Spiel starten + + + Spiel verlassen + + + Spiel speichern + + + Verlassen ohne Speichern + + + Drück START, um beizutreten + + + Hurra – du hast ein Spielerbild mit Steve von Minecraft gewonnen! + + + Hurra – du hast ein Spielerbild mit einem Creeper gewonnen! + + + Vollständiges Spiel freischalten + + + Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine neuere Spielversion verwendet. + + + Neue Welt + + + Preis freigeschaltet! + + + Du spielst die Testversion, kannst deinen Spielstand aber nur im vollständigen Spiel speichern. +Möchtest du jetzt das vollständige Spiel freischalten? + + + Freunde + + + Meine Punkte + + + Insgesamt + + + Bitte warten + + + Keine Ergebnisse + + + Filter: + + + Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine ältere Spielversion verwendet. + + + Verbindung verloren. + + + Die Verbindung zum Server wurde unterbrochen. Zurück zum Hauptmenü. + + + Die Verbindung zum Server wurde getrennt. + + + Spiel verlassen + + + Es ist ein Fehler aufgetreten. Zurück zum Hauptmenü. + + + Fehler beim Herstellen der Verbindung + + + Du wurdest aus dem Spiel ausgeschlossen. + + + Der Host hat das Spiel verlassen. + + + Du kannst diesem Spiel nicht beitreten, da du mit niemandem in diesem Spiel befreundet bist. + + + Du kannst diesem Spiel nicht beitreten, da du vom Host aus dem Spiel ausgeschlossen wurdest. + + + Du wurdest wegen Fliegens aus dem Spiel ausgeschlossen. + + + Verbindungsversuch dauert zu lange. + + + Der Server ist voll. + + + 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! + + + Themen + + + Skinpaket + + + Freunde von Freunden zulassen + + + Spieler ausschließen + + + Möchtest du diesen Spieler wirklich aus dem Spiel ausschließen? Er wird bis zum Neustart der Welt dem Spiel nicht mehr beitreten können. + + + Spielerbilder-Paket + + + Du kannst diesem Spiel nicht beitreten, da es auf Spieler beschränkt wurde, die mit dem Host befreundet sind. + + + Inhalte zum Herunterladen def. + + + Diese Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü „Minecraft Store“ aus neu installieren. + + + Einige deiner Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü „Minecraft Store“ aus neu installieren. + + + Spielbeitritt nicht möglich + + + Ausgewählt + + + Ausgewählte Skin: + + + Vollständiges Spiel holen + + + Texturpaket freischalten + + + Du musst das Texturpaket freischalten, um es für deine Welt zu verwenden. +Möchtest du es jetzt freischalten? + + + Texturpaket-Testversion + + + Seed + + + Skinpaket freischalten + + + Um die ausgewählte Skin zu verwenden, musst du dieses Skinpaket freischalten. +Möchtest du dieses Skinpaket jetzt freischalten? + + + 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? + + + Vollversion herunterladen + + + Diese Welt verwendet ein Mash-up-Paket oder Texturpaket, das dir fehlt! +Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? + + + Testversion holen + + + Texturpaket nicht verfügbar + + + Vollversion freischalten + + + Testversion herunterladen + + + Dein Spielmodus wurde geändert. + + + Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. + + + Wenn dies aktiviert ist, können nur Freunde von Leuten auf deiner Freundeliste dem Spiel beitreten. + + + Aktiviert, dass Spieler sich gegenseitig Schaden zufügen können. Hat nur Einfluss auf den Überlebensmodus. + + + Normal + + + Superflach + + + Wenn dies aktiviert ist, ist das Spiel online. + + + Wenn deaktiviert, können Spieler, die dem Spiel beitreten, nicht bauen oder abbauen, bis sie autorisiert wurden. + + + Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. + + + Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird. + + + Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. + + + Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. + + + Aktiviert, dass aktiviertes TNT explodiert. + + + 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. + + + Aus + + + Spielmodus: Kreativ + + + Überleben + + + Kreativ + + + Welt umbenennen + + + Gib den neuen Namen für deine Welt ein. + + + Spielmodus: Überleben + + + Im Überlebensmodus + + + Spielstand umbenennen + + + Automatisches Speichern in %d ... + + + Ein + + + Im Kreativmodus + + + Wolken erstellen + + + Was möchtest du mit diesem Spielstand tun? + + + Displaygr. (geteilter Bildsch.) + + + Zutat + + + Brennstoff + + + Dispenser + + + Truhe + + + Verzaubern + + + Ofen + + + Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. + + + Möchtest du diesen Spielstand wirklich löschen? + + + Wird genehmigt ... + + + Zensiert + + + %s ist dem Spiel beigetreten. + + + %s hat das Spiel verlassen. + + + %s wurde aus dem Spiel ausgeschlossen. + + + Braustand + + + Schildtext eingeben + + + Gib eine Textzeile für dein Schild ein. + + + Titel eingeben + + + Testversion abgelaufen + + + Spiel voll + + + Fehler beim Spielbeitritt, da keine Plätze mehr frei sind. + + + Gib einen Titel für deinen Beitrag ein. + + + Gib eine Beschreibung für deinen Beitrag ein. + + + Inventar + + + Zutaten + + + Überschrift eingeben + + + Gib eine Überschrift für deinen Beitrag ein. + + + Beschreibung eingeben + + + Jetzt wird gespielt: + + + Möchtest du diesen Level wirklich deiner Liste gesperrter Level hinzufügen? +Wenn du O. K. auswählst, verlässt du dieses Spiel. + + + Von Liste gesperrter Level entfernen + + + Speicherintervall + + + Gesperrter Level + + + Das Spiel, dem du beitrittst, steht auf deiner Liste gesperrter Level. +Wenn du dem Spiel beitrittst, wird der Level von deiner Liste gesperrter Level entfernt. + + + Diesen Level sperren? + + + Speicherintervall: AUS + + + Durchsichtigkeit + + + Autospeichern des Levels wird vorbereitet + + + Displaygröße + + + Min + + + Kann hier nicht platziert werden! + + + Das Platzieren von Lava neben dem Wiedereintrittspunkt ist nicht gestattet, da sonst Spieler beim Wiedereintritt in den Level sofort sterben könnten. + + + Skin-Favoriten + + + Spiel von %s + + + Unbekanntes Hostspiel + + + Gast abgemeldet + + + Einstellungen zurücksetzen + + + Möchtest du deine Einstellungen wirklich auf die Standardwerte zurücksetzen? + + + Ladefehler + + + Ein Gastspieler hat sich abgemeldet, dadurch wurden alle Gastspieler aus dem Spiel entfernt. + + + Fehler beim Erstellen des Spiels + + + Automatisch ausgewählt + + + Kein Paket: Standard-Skins + + + Anmelden + + + Du bist derzeit nicht angemeldet. Du musst angemeldet sein, um dieses Spiel zu spielen. Möchtest du dich jetzt anmelden? + + + Multiplayer nicht möglich + + + Trinken + + + In diesem Gebiet wurde eine Farm errichtet. Mithilfe von Landwirtschaft kannst du eine erneuerbare Quelle von Nahrung und anderen Gegenständen erschaffen. + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über Landwirtschaft zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Landwirtschaft weißt. + + + Weizen, Kürbisse und Melonen zieht man aus Samen. Weizensamen kann man sammeln, indem man Weizen erntet oder Hohes Gras abbaut. Kürbis- und Melonensamen kann man aus Kürbissen bzw. Melonen herstellen. + + + Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Kreativinventar-Oberfläche zu öffnen. + + + Begib dich auf die andere Seite dieses Lochs. + + + Du hast jetzt das Tutorial zum Kreativmodus abgeschlossen. + + + 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. + + + Kakteen müssen auf Sand gepflanzt werden. Sie wachsen bis zu drei Blöcke hoch. Genau wie bei Zuckerrohrblock musst du nur den untersten Block zerstören, um auch die darüber liegenden Blöcke einsammeln zu können.{*ICON*}81{*/ICON*} + + + Pilze solltest du in einem spärlich beleuchteten Gebiet pflanzen. Sie breiten sich auf umliegende spärlich beleuchtete Blöcke aus.{*ICON*}39{*/ICON*} + + + Man kann Knochenmehl verwenden, um Pflanzen schneller auswachsen zu lassen oder um Pilze zu Riesigen Pilzen wachsen zu lassen.{*ICON*}351:15{*/ICON*} + + + Weizen durchläuft beim Wachstum mehrere Phasen. Er kann geerntet werden, wenn er dunkler aussieht.{*ICON*}59:7{*/ICON*} + + + Kürbisse und Melonen benötigen einen Block Platz neben der Stelle, wo du den Samen gepflanzt hast, damit die Frucht wachsen kann, nachdem der Stängel voll ausgewachsen ist. + + + Zuckerrohr muss auf einem Gras-, Erd- oder Sandblock gepflanzt werden, der sich direkt neben einem Wasserblock befindet. Wenn man einen Zuckerrohrblock entfernt, zerfallen auch alle darüber liegenden Zuckerrohrblöcke.{*ICON*}83{*/ICON*} + + + 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. + + + In der Truhe in diesem Gebiet findest du Komponenten, um Schaltkreise mit Kolben herzustellen. Versuch, die Schaltkreise in diesem Gebiet zu verwenden oder sie fertigzustellen, oder bau deine eigenen zusammen. Außerhalb des Tutorial-Gebiets findest du weitere Beispiele. + + + In diesem Gebiet gibt es ein Portal in den Nether! + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über das Portal und den Nether zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du schon alles über das Portal und den Nether weißt. + + + Redstone-Staub kannst du beim Abbauen von Redstone-Erz mit einer Spitzhacke aus Eisen, Diamant oder Gold erhalten. Mit seiner Hilfe kannst du Strom 15 Blöcke weit und einen Block nach oben oder unten übertragen. + {*ICON*}331{*/ICON*} + + + + Mit Redstone-Repeatern kannst du die Distanz verlängern, über die du Strom übertragen kannst, oder eine Verzögerung in einem Schaltkreis verursachen. + {*ICON*}356{*/ICON*} + + + + + Wenn Strom an den Kolben angelegt wird, wird der Kolben länger und verschiebt bis zu 12 Blöcke. Wenn ein haftender Kolben zurückgezogen wird, zieht er einen Block der meisten Typen mit sich zurück. + {*ICON*}33{*/ICON*} + + + + 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. + + + Mithilfe der Netherwelt kann man in der oberirdischen Welt schneller reisen – eine Entfernung von einem Block im Nether entspricht drei Blöcken in der oberirdischen Welt. + + + Du bist jetzt im Kreativmodus. + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über den Kreativmodus erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Kreativmodus weißt. + + + 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. + + + 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. + + + 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. + + + Du hast jetzt das Tutorial zur Landwirtschaft abgeschlossen. + + + Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Axt verwenden, um Baumstämme abzuhacken. + + + Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Spitzhacke verwenden, um Steine und Erz abzubauen. Möglicherweise musst du eine Spitzhacke aus besserem Material herstellen, um aus manchen Blöcken Rohstoffe gewinnen zu können. + + + Manche Werkzeuge eignen sich besser, um Gegner anzugreifen. Probier zum Angreifen mal ein Schwert aus. + + + Eisengolems erscheinen auch auf natürliche Art, um Dörfer zu verteidigen, und greifen dich an, falls du Dorfbewohner attackierst. + + + Du kannst diesen Bereich erst verlassen, wenn du das Tutorial abgeschlossen hast. + + + Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Schaufel verwenden, um weiches Material wie Erde und Sand abzubauen. + + + 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. + + + In der Truhe neben dem Fluss befindet sich ein Boot. Um das Boot zu verwenden, platzier den Cursor auf Wasser und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*}, während du auf das Boot zeigst, um es zu betreten. + + + In der Truhe neben dem Teich befindet sich eine Angel. Nimm die Angel aus der Truhe, und nimm sie in deine Hand, um sie zu verwenden. + + + Dieser kompliziertere Kolbenmechanismus erzeugt eine selbstreparierende Brücke! Drück zum Aktivieren den Schalter und schau dir dann an, wie die Komponenten interagieren, um alles besser zu verstehen. + + + Das verwendete Werkzeug ist beschädigt worden. Jedes Mal, wenn du ein Werkzeug einsetzt, erhält es ein wenig Schaden, und irgendwann geht es kaputt. Die farbige Leiste unterhalb des Gegenstands in deinem Inventar zeigt seinen aktuellen Zustand an. + + + Halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um nach oben zu schwimmen. + + + In diesem Gebiet gibt es Schienen, auf denen eine Lore steht. Um die Lore zu betreten, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*} auf dem Schalter, um die Lore in Bewegung zu setzen. + + + Eisengolems bestehen aus vier Eisenblöcken im gezeigten Muster mit einem Kürbis auf dem mittleren Block. Eisengolems greifen deine Feinde an. + + + 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. + + + Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst. + + + Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann. + + + In diesem Gebiet sind Tiere untergebracht. Du kannst Tiere dazu bringen, dass sie Tierbabys produzieren. + + + {*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. + + + + Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den „Liebesmodus“ zu versetzen. + + + 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*} + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über Golems zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Golems weißt. + + + Du erstellst Golems, indem du einen Kürbis auf einen Stapel Blöcke legst. + + + Schneegolems bestehen aus zwei aufeinanderliegenden Schneeblöcken mit einem Kürbis darauf. Schneegolems bewerfen deine Feinde mit Schneebällen. + + + + 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. + + + + Du hast jetzt das Tutorial zur Tierzucht abgeschlossen. + + + In dieser Gegend gibt es Kürbisse und Blöcke, um einen Schneegolem und einen Eisengolem zu erstellen. + + + 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 ein Kessel leer ist, kannst du ihn mit einem Wassereimer wieder auffüllen. + + + Braue mithilfe des Braustandes einen Trank der Feuerresistenz. Du brauchst dazu eine Wasserflasche, eine Netherwarze und Magmacreme. + + + Nimm einen Trank in 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. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über das Brauen und Tränke erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über das Brauen und Tränke weißt. + + + Der erste Schritt zum Brauen eines Trankes ist es, eine Wasserflasche zu erschaffen. Nimm eine Glasflasche aus der Truhe. + + + Du kannst eine Glasflasche aus einem Kessel mit Wasser füllen oder aus einem Wasserblock. Fülle jetzt deine Glasflasche, indem du damit auf eine Wasserquelle zeigst und{*CONTROLLER_ACTION_USE*} drückst. + + + Verwende deinen Trank der Feuerresistenz für dich selbst. + + + Um einen Gegenstand zu verzaubern, lege ihn in das Verzauberfeld. Waffen, Rüstungen und manche Werkzeuge können verzaubert werden, um Spezialeffekte zu erhalten wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. + + + Wenn ein Gegenstand in das Verzauberfeld gelegt wird, ändern sich die Schaltflächen rechts und zeigen eine Auswahl zufälliger Verzauberungen an. + + + Die Zahl auf den Schaltflächen symbolisiert die Kosten in Erfahrungsleveln, um die Verzauberung auf den Gegenstand anzuwenden. Wenn dein Erfahrungslevel nicht hoch genug ist, ist die Schaltfläche deaktiviert. + + + Jetzt bist du resistent gegenüber Feuer und Lava. Probier doch mal aus, ob du jetzt Orte erreichen kannst, die dir vorher versperrt geblieben sind. + + + Dies ist die Verzauberoberfläche, über die du Waffen, Rüstungen und einige Werkzeuge verzaubern kannst. + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Verzauberoberfläche erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Verzauberoberfläche weißt. + + + In diesem Gebiet gibt es einen Braustand, einen Kessel sowie eine Truhe mit Gegenständen zum Brauen. + + + Holzkohle kann als Brennstoff verwendet werden, du kannst daraus aber auch mit einem Stock eine Fackel herstellen. + + + Wenn du Sand ins Zutatenfeld legst, kannst du Glas herstellen. Erschaff ein paar Glasblöcke, die du als Fenster in deinem Unterstand verwenden kannst. + + + Dies ist die Brau-Oberfläche. Hier kannst du Tränke erschaffen, die die verschiedensten Effekte haben können. + + + Du kannst viele Holzgegenstände als Brennstoff verwenden, aber nicht alles brennt gleich lange. Du wirst auch andere Gegenstände in der Welt finden, die du als Brennstoff verwenden kannst. + + + Wenn dein Gegenstand fertig erhitzt ist, kannst du ihn aus dem Ausgabefeld in dein Inventar verschieben. Du solltest mit verschiedenen Zutaten experimentieren, um zu sehen, was du alles herstellen kannst. + + + Wenn du Baumstämme als Zutat verwendest, kannst du Holzkohle herstellen. Leg Brennstoff in den Ofen und einen Baumstamm in das Zutatenfeld. Es wird eine Weile dauern, bis der Ofen die Holzkohle fertig hat, du kannst währenddessen etwas anderes tun und später wiederkommen, um dir den Fortschritt anzusehen. + + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man den Braustand verwendet. + + + Wenn du dem Trank ein Fermentiertes Spinnenauge hinzufügst, verdirbt der Trank und kann den entgegengesetzten Effekt hervorrufen. Wenn du dem Trank Schießpulver hinzufügst, wird aus dem Trank ein Wurftrank und du kannst seinen Effekt auf einen ganzen Bereich entfalten. + + + Erzeuge einen Trank der Feuerresistenz, indem du zuerst eine Netherwarze zu einer Wasserflasche hinzufügst und dann Magmacreme. + + + Drück jetzt{*CONTROLLER_VK_B*}, um die Brauoberfläche zu verlassen. + + + Du braust Tränke, indem du in das obere Feld eine Zutat legst und in die unteren Felder je einen Trank oder eine Wasserflasche (du kannst gleichzeitig bis zu 3 Tränke brauen). Sobald eine funktionierende Kombination eingelegt wurde, beginnt der Brauprozess und nach kurzer Zeit entsteht der Trank. + + + Basis aller Tränke ist eine Wasserflasche. Die meisten Tränke werden hergestellt, indem zuerst mit einer Netherwarze ein Seltsamer Trank hergestellt wird. Sie erfordern mindestens eine weitere Zutat, bevor der Trank fertig ist. + + + Wenn du einen Trank fertig hast, kannst du seinen Effekt noch weiter modifizieren. Wenn du ihm Redstonestaub hinzufügst, steigerst du die Dauer seines Effekts. Wenn du ihm Glowstonestaub hinzufügst, machst du ihn stärker. + + + 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. + + + Drück{*CONTROLLER_ACTION_USE*}, um deine Angel auszuwerfen und mit dem Angeln zu beginnen. Drück erneut{*CONTROLLER_ACTION_USE*}, um die Angel einzuholen. + {*FishingRodIcon*} + + + Wenn du mit dem Einholen wartest, bis der Schwimmer unter die Wasseroberfläche versunken ist, kannst du einen Fisch fangen. Fische können roh gegessen oder in einem Ofen gekocht werden, um deine Gesundheit zu regenerieren. + {*FishIcon*} + + + Genau wie viele andere Werkzeuge kann eine Angel nicht unbegrenzt oft eingesetzt werden. Ihr Einsatz beschränkt sich aber nicht aufs Fangen von Fischen. Du solltest mit ihr experimentieren, um zu sehen, was du sonst noch so fangen oder aktivieren kannst ... + {*FishingRodIcon*} + + + Ein Boot erlaubt dir, schneller übers Wasser zu reisen. Du kannst es mit{*CONTROLLER_ACTION_MOVE*} und{*CONTROLLER_ACTION_LOOK*} steuern. + {*BoatIcon*} + + + Du verwendest jetzt eine Angel. Drück{*CONTROLLER_ACTION_USE*}, um sie einzusetzen.{*FishingRodIcon*} + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr übers Angeln zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles übers Angeln weißt. + + + 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*} + + + In diesem Gebiet gibt es ein paar einfache Redstone-Schaltkreise und Kolben sowie eine Truhe mit weiteren Gegenständen, um diese Schaltkreise zu erweitern. + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Redstone-Schaltkreise und Kolben zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Redstone-Schaltkreise und Kolben weißt. + + + Hebel, Schalter, Druckplatten und auch Redstone-Fackeln können Schaltkreise mit Strom versorgen, indem du sie entweder direkt oder mithilfe von Redstonestaub mit dem Gegenstand verbindest, den du aktivieren möchtest. + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Betten zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Betten weißt. + + + Ein Bett sollte an einem sicheren, gut beleuchteten Ort stehen, damit du nicht mitten in der Nacht von Monstern geweckt wirst. Sobald du einmal ein Bett verwendet hast und später stirbst, erscheinst du in diesem Bett wieder in der Spielwelt. + {*ICON*}355{*/ICON*} + + + Wenn es in deinem Spiel noch weitere Spieler gibt, müssen sich alle gleichzeitig im Bett befinden, um schlafen zu können. + {*ICON*}355{*/ICON*} + + + {*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. + + + Mithilfe eines Zaubertisches kannst du Waffen, Rüstungen und manchen Werkzeugen Spezialeffekte hinzufügen wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. + + + Wenn du Bücherregale rund um den Zaubertisch baust, steigerst du seine Zauberkraft und kannst Verzauberungen höherer Level erhalten. + + + Gegenstände verzaubern kostet Erfahrungslevel, die du durch das Sammeln von Erfahrungskugeln steigerst. Erfahrungskugeln entstehen, wenn du Monster und Tiere tötest, Erz abbaust, Tiere züchtest, angelst und manche Dinge in einem Ofen kochst/einschmilzt. + + + Auch wenn alle Verzauberungen zufällig sind, sind einige der besseren doch nur verfügbar, wenn du einen hohen Erfahrungslevel und viele Bücherregale rund um den Zaubertisch errichtet hast, um die Stärke des Zaubers zu vergrößern. + + + In diesem Gebiet stehen ein Zaubertisch und weitere Gegenstände, die dir helfen, etwas über das Verzaubern zu lernen. + + + {*B*} + Drü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. + + + + 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. + + + Loren fahren auf Schienen. Mit einem Ofen und einer Lore kannst du eine angetriebene Lore erschaffen. Du kannst auch eine Lore mit einer Truhe darin erschaffen. + {*RailIcon*} + + + Du kannst auch Booster-Schienen erschaffen, die Loren mit Strom aus Redstone-Fackeln und -Stromkreisen beschleunigen. Sie können mit Schaltern, Hebeln und Druckplatten verbunden werden, um komplexe Systeme zu erschaffen. + {*PoweredRailIcon*} + + + Du segelst jetzt in einem Boot. Um das Boot zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + 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. + + + Du fährst jetzt in einer Lore. Um die Lore zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Loren zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Loren weißt. + + + Wenn du den Cursor über den Rand der Oberfläche hinaus bewegst, während du einen Gegenstand trägst, kannst du den Gegenstand ablegen. + + + Lesen + + + Hängen + + + Werfen + + + Öffnen + + + Tonhöhe ändern + + + Explodieren + + + Pflanzen + + + Vollständiges Spiel freischalten + + + Spielstand löschen + + + Löschen + + + Umgraben + + + Ernten + + + Weiter + + + Hochschwimmen + + + Treffen + + + Melken + + + Sammeln + + + Leeren + + + Sattel + + + Platzieren + + + Essen + + + Reiten + + + Segeln + + + Anbauen + + + Schlafen + + + Aufwachen + + + Spielen + + + Optionen + + + Rüstung bewegen + + + Waffe bewegen + + + Verwenden + + + Zutat verschieben + + + Brennstoff verschieben + + + Beweg-Werkzeug + + + Ziehen + + + Seite hoch + + + Seite runter + + + Liebesmodus + + + Loslassen + + + Privilegien + + + Blocken + + + Kreativ + + + Level sperren + + + Skin auswählen + + + Anzünden + + + Freunde einladen + + + Annehmen + + + Schere + + + Navigieren + + + Neu installieren + + + Optionen + + + Kommando ausführen + + + Vollständiges Spiel installieren + + + Testversion installieren + + + Installieren + + + Auswerfen + + + Online-Spiele aktualisieren + + + Partyspiele + + + Alle Spiele + + + Verlassen + + + Abbrechen + + + Beitritt abbrechen + + + Gruppe wechseln + + + Crafting + + + Erschaffen + + + Nehmen/Ablegen + + + Inventar + + + Beschreibung + + + Zutaten + + + Zurück + + + Erinnerung: + + + + + + Mit der aktuellen Version wurden dem Spiel neue Features hinzugefügt, darunter neue Gebiete in der Tutorial-Welt. + + + Du hast nicht alle Zutaten, die du brauchst, um diesen Gegenstand herzustellen. Das Feld unten links zeigt dir die benötigten Zutaten an. + + + Glückwunsch, du hast das Tutorial abgeschlossen. Die Spielzeit vergeht jetzt mit normaler Geschwindigkeit, und du hast nicht mehr viel Zeit, bis die Nacht hereinbricht und Monster auftauchen! Stell deinen Unterstand fertig! + + + {*EXIT_PICTURE*} Wenn du bereit bist, dich weiter umzusehen, gibt es in der Nähe des Unterstands der Minenarbeiter eine Treppe, die zu einer kleinen Burg führt. + + + + {*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. + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über die Hungerleiste und die Nahrungsaufnahme zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Hungerleiste und die Nahrungsaufnahme weißt. + + + Auswählen + + + Verwenden + + + In diesem Gebiet gibt es Bereiche, in denen du mehr über das Angeln, Boote, Kolben und Redstone erfahren kannst. + + + Außerhalb dieses Gebiets findest du Beispiele für Gebäude, Landwirtschaft, Loren und Schienen sowie zum Verzaubern, Brauen, Handeln, Schmieden und noch einiges mehr! + + + Deine Hungerleiste ist so weit geleert, dass du dich nicht mehr regenerieren kannst. + + + Nehmen + + + Weiter + + + Zurück + + + Spieler ausschließen + + + Freundschaftsanfrage + + + Seite runter + + + Seite hoch + + + Färben + + + Heilen + + + Sitz + + + Folge mir + + + Abbauen + + + Füttern + + + Zähmen + + + Filter ändern + + + Alles platzieren + + + Eins platzieren + + + Ablegen + + + Alles nehmen + + + Hälfte nehmen + + + Platzieren + + + Alles ablegen + + + Schnellauswahl leeren + + + Was ist das? + + + Auf Facebook teilen + + + Eins ablegen + + + Tauschen + + + Verschieben + + + Skinpakete + + + Rot gefärbte Glasscheibe + + + Grün gefärbte Glasscheibe + + + Braun gefärbte Glasscheibe + + + Weiß gefärbtes Glas + + + Gefärbte Glasscheibe + + + Schwarz gefärbte Glasscheibe + + + Blau gefärbte Glasscheibe + + + Grau gefärbte Glasscheibe + + + Rosa gefärbte Glasscheibe + + + Hellgrün gefärbte Glasscheibe + + + Violett gefärbte Glasscheibe + + + Türkis gefärbte Glasscheibe + + + Hellgrau gefärbte Glasscheibe + + + Orange gefärbtes Glas + + + Blau gefärbtes Glas + + + Violett gefärbtes Glas + + + Türkis gefärbtes Glas + + + Rot gefärbtes Glas + + + Grün gefärbtes Glas + + + Braun gefärbtes Glas + + + Hellgrau gefärbtes Glas + + + Gelb gefärbtes Glas + + + Hellblau gefärbtes Glas + + + Magenta gefärbtes Glas + + + Grau gefärbtes Glas + + + Rosa gefärbtes Glas + + + Hellgrün gefärbtes Glas + + + Gelb gefärbte Glasscheibe + + + Hellgrau + + + Grau + + + Rosa + + + Blau + + + Violett + + + Türkis + + + Hellgrün + + + Orange + + + Weiß + + + Benutzerdefiniert + + + Gelb + + + Hellblau + + + Magenta + + + Braun + + + Weiß gefärbte Glasscheibe + + + Kleine Kugel + + + Große Kugel + + + Hellblau gefärbte Glasscheibe + + + Magenta gefärbte Glasscheibe + + + Orange gefärbte Glasscheibe + + + Sternform + + + Schwarz + + + Rot + + + Grün + + + Creeperform + + + Explosion + + + Unbekannte Form + + + Schwarz gefärbtes Glas + + + Eisen-Pferderüstung + + + Gold-Pferderüstung + + + Diamant-Pferderüstung + + + Redstone-Komparator + + + Lore mit TNT + + + Lore mit Trichter + + + Leine + + + Leuchtfeuer + + + Fallentruhe + + + Beschwerte Druckplatte (leicht) + + + Namensschild + + + Holzbretter (beliebiger Typ) + + + Befehlsblock + + + Feuerwerksstern + + + Diese Tiere können gezähmt und danach geritten werden. Sie können mit einer Truhe verbunden werden. + + + Maultier + + + Wird geboren, wenn sich Pferd und Esel paaren. Diese Tiere können gezähmt und danach geritten werden und Rüstung und Truhen tragen. + + + Pferd + + + Diese Tiere können gezähmt und danach geritten werden. + + + Esel + + + Zombiepferd + + + Leere Karte + + + Netherstern + + + Feuerwerksrakete + + + Skelettpferd + + + Wither + + + Diese werden aus Wither-Schädeln und Seelensand hergestellt. Sie feuern explodierende Schädel auf dich. + + + Beschwerte Druckplatte (schwer) + + + Hellgrau gefärbter Lehm + + + Grau gefärbter Lehm + + + Rosa gefärbter Lehm + + + Blau gefärbter Lehm + + + Violett gefärbter Lehm + + + Türkis gefärbter Lehm + + + Hellgrün gefärbter Lehm + + + Orange gefärbter Lehm + + + Weiß gefärbter Lehm + + + Gefärbtes Glas + + + Gelb gefärbter Lehm + + + Hellblau gefärbter Lehm + + + Magenta gefärbter Lehm + + + Braun gefärbter Lehm + + + Trichter + + + Aktivierungsschiene + + + Spender + + + Redstone-Komparator + + + Tageslichtsensor + + + Redstoneblock + + + Gefärbter Lehm + + + Schwarz gefärbter Lehm + + + Rot gefärbter Lehm + + + Grün gefärbter Lehm + + + Heuballen + + + Gebrannter Lehm + + + Kohleblock + + + Fading nach + + + 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. + + + Ist dies aktiviert, behalten Spieler nach dem Tod ihr Inventar. + + + Bei Deaktivierung erscheinen keine NPCs auf natürliche Art. + + + Spielmodus: Abenteuer + + + Abenteuer + + + Gib einen Startwert ein, um das gleiche Gelände erneut zu erstellen. Für eine zufallsgenerierte Welt leer lassen. + + + Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (beispielsweise werfen Creeper kein Schießpulver ab). + + + {*PLAYER*} ist von einer Leiter gefallen. + + + {*PLAYER*} ist von ein paar Ranken gefallen. + + + {*PLAYER*} ist aus dem Wasser gefallen. + + + Bei Deaktivierung lassen Blöcke keine Gegenstände fallen, wenn sie zerstört werden (beispielsweise bringen Steinblöcke keine Pflastersteine hervor). + + + Bei Deaktivierung regenerieren Spieler Gesundheit nicht auf natürliche Art. + + + Bei Deaktivierung verändert sich die Tageszeit nicht. + + + Lore + + + Leine + + + Freilassen + + + Verbinden + + + Absteigen + + + Truhe verbinden + + + Abfeuern + + + Name + + + Leuchtfeuer + + + Primärkraft + + + Sekundärkraft + + + Pferd + + + Spender + + + Trichter + + + {*PLAYER*} ist aus großer Höhe gestürzt. + + + Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Fledermäusen in einer Welt wurde erreicht. + + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pferde wurde erreicht. + + + Spieloptionen + + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} mit Feuerbällen abgeschossen. + + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} verprügelt. + + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} getötet. + + + NPC-Griefing + + + Blockabwurf + + + Natürliche Regeneration + + + Tageslichtzyklus + + + Inventar behalten + + + NPC-Erzeugung + + + NPC-Beute + + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} erschossen. + + + {*PLAYER*} ist zu weit gefallen und wurde von {*SOURCE*} erledigt. + + + {*PLAYER*} ist zu tief gefallen und wurde durch {*SOURCE*} mithilfe von {*ITEM*} erledigt. + + + {*PLAYER*} ist beim Kampf gegen {*SOURCE*} ins Feuer gelaufen. + + + {*PLAYER*} wurde durch {*SOURCE*} zum Fallen verdammt. + + + {*PLAYER*} wurde von {*SOURCE*} zum Fallen verdammt. + + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} zum Fallen verdammt. + + + {*PLAYER*} wurde beim Kampf gegen {*SOURCE*} verbrannt. + + + {*PLAYER*} wurde von {*SOURCE*} in die Luft gesprengt. + + + {*PLAYER*} ist eingegangen wie eine Primel. + + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} getötet. + + + {*PLAYER*} hat versucht, durch Lava zu schwimmen, um {*SOURCE*} zu entkommen. + + + {*PLAYER*} ist beim Versuch, {*SOURCE*} zu entkommen, ertrunken. + + + {*PLAYER*} ist auf der Flucht vor {*SOURCE*} gegen einen Kaktus gelaufen. + + + Aufsteigen + + + 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. + + + +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. + + + + 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. + + + +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. + + + + Wenn sie zahm sind, erscheinen um sie herum Liebesherzen und sie versuchen nicht mehr, den Spieler abzuwerfen. + + + Versuche jetzt, auf diesem Pferd zu reiten. Verwende {*CONTROLLER_ACTION_USE*}, ohne dass du Gegenstände oder Werkzeuge in der Hand hast, um aufzusteigen. + + + +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. + + + + 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. + + + 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. + + + An der Spitze dieser Pyramide befindet sich ein inaktives Leuchtfeuer. + + + Dies ist die Leuchtfeuer-Oberfläche, mit der du Kräfte auswählen kannst, die dein Leuchtfeuer anderen Spielern gewährt. + + + {*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. + + + 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. + + + 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. + + + Das ist die Pferdeinventar-Oberfläche. + + + +{*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. + + + + Das Pferdeinventar ermöglicht es dir, Gegenstände auf dein Pferd, deinen Esel oder dein Maultier zu übertragen oder diese damit auszurüsten. + + + Glitzern + + + Spur + + + Flugdauer: + + + +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. + + + + 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 in weiten Ebenen. Maultiere sind Nachkommen von Pferd und Esel, selbst aber unfruchtbar. + + + In diesem Menü kannst du außerdem Gegenstände zwischen deinem eigenen Inventar und den Satteltaschen auf den Eseln und Maultieren verschieben. + + + Du hast ein Pferd gefunden. + + + Du hast einen Esel gefunden. + + + {*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. + + + Feuerwerkssterne können hergestellt werden, indem im Craftingfeld Schießpulver und Farbstoff platziert werden. + + + +Der Farbstoff bestimmt die Farbe der Explosion des Feuerwerkssterns. + + + + +Die Form des Feuerwerkssterns wird durch Hinzufügen von Feuerkugel, Goldklumpen, Feder oder NPC-Kopf bestimmt. + + + + Optional können mehrere Feuerwerkssterne im Craftingfeld platziert werden, um sie dem Feuerwerk hinzuzufügen. + + + Je mehr Plätze im Craftingfeld mit Schießpulver gefüllt werden, desto höher explodieren die Feuerwerkssterne. + + + Dann kannst du das hergestellte Feuerwerk aus dem Ausgabeplatz nehmen, wenn du es bearbeiten möchtest. + + + +Eine Spur oder ein Glitzern kann durch Verwendung von Diamanten oder Glowstone-Staub erzeugt werden. + + + + 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. + + + +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. + + + + Versuche, an der Werkbank ein Feuerwerk herzustellen, indem du ein Sortiment von Zutaten aus den Truhen verwendest. + + + +Nach der Herstellung des Feuerwerkssterns kann die Fading-Farbe durch Bearbeiten mit Farbstoff festgelegt werden. + + + + In diesen Truhen hier sind mehrere Gegenstände, die zur Herstellung von FEUERWERK verwendet werden! + + + {*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. + + + +Um ein Feuerwerk herzustellen, musst du Schießpulver und Papier im 3x3-Craftingfeld platzieren, das über deinem Inventar angezeigt wird. + + + + 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 werden Gegenstände in Container befördert oder aus ihnen entfernt. Gegenstände, die in sie hineingeworfen werden, werden automatisch eingesammelt. + + + 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. + + + 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. + + + Versuche, die Kräfte einzustellen, die dieses Leuchtfeuer gewähren soll. Du kannst die Eisenbarren als Bezahlung verwenden, die hier verfügbar sind. + + + Sie können sich auf Braustände, Truhen, Dispenser, Spender, Loren mit Truhen, Loren mit Trichtern und auch auf andere Trichter auswirken. + + + In diesem Raum kannst du mit verschiedenen Trichter-Layouts experimentieren. + + + Das ist die Feuerwerk-Oberfläche, über die du Feuerwerk und Feuerwerkssterne herstellen kannst. + + + {*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. + + + 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. + + + +Wird aber ein Trichter von einem Redstone angetrieben, wird er inaktiv und saugt weder Gegenstände auf, noch legt er welche ab. + + + + +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. + + + + 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. + + + Die Höchstanzahl von Gemälden/Gegenstandsrahmen in einer Welt wurde erreicht. + + + Im friedlichen Modus kannst du keine Feinde erscheinen lassen. + + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühe, Katzen und Pferden wurde erreicht. + + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. + + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Feinden in einer Welt wurde erreicht. + + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Dorfbewohnern in einer Welt wurde erreicht. + + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Wölfe wurde erreicht. + + + Die Höchstanzahl von NPC-Köpfen in einer Welt wurde erreicht. + + + Sicht umkehren + + + Linkshänder + + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Hühner wurde erreicht. + + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pilzkühe wurde erreicht. + + + Die Höchstanzahl von Booten in einer Welt wurde erreicht. + + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Hühnern in einer Welt wurde erreicht. + + + {*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*} + + + {*C2*}Manchmal nannte es sie „Planeten“ und „Sterne“.{*EF*}{*B*}{*B*} +{*C2*}Manchmal glaubte es, es befände sich in einem Universum, das aus Energie bestand, welche wiederum aus Aus- und An-Zuständen bestand, aus Nullen und Einsen; Programmzeilen. Manchmal glaubte es, dass es ein Spiel spielte. Manchmal glaubte es, dass es Worte auf einem Bildschirm las.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen, das die Worte liest ...{*EF*}{*B*}{*B*} +{*C2*}Pssst ... Manchmal las das spielende Wesen Programmzeilen auf einem Bildschirm. Entschlüsselte sie, um Worte zu erhalten; entschlüsselte die Worte, um deren Bedeutung zu erfahren; entschlüsselte die Bedeutung, und gewann daraus Gefühle, Emotionen, Theorien, Ideen. Und das spielende Wesen begann schneller zu atmen, tiefer zu atmen, und es erkannte, dass es am Leben war. Jene tausend Tode waren nicht reell gewesen, das spielende Wesen lebte.{*EF*}{*B*}{*B*} +{*C3*}Du. Du. Du lebst.{*EF*}{*B*}{*B*} +{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Sonnenlicht, das durch die raschelnden Blätter der sommerlichen Bäume drang, zu ihm gesprochen.{*EF*}{*B*}{*B*} +{*C3*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Licht, welches aus dem klaren Nachthimmel des Winters herabschien, zu ihm gesprochen, wo ein Lichtfleck, den das spielende Wesen aus dem Augenwinkel erhaschte, ein Stern sein könnte, dessen Masse die der Sonne um ein Millionenfaches übertrifft und der seine Planeten zu Plasma zerkocht, um für einen kurzen Moment vom spielenden Wesen wahrgenommen zu werden, das am anderen Ende des Universums nach Hause geht, plötzlich Essen riecht, kurz vor der vertrauten Tür, hinter der es bald wieder träumen wird.{*EF*}{*B*}{*B*} +{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch die Nullen und Einsen, durch die Elektrizität der Welt, durch die über den Bildschirm huschenden Worte am Ende eines Traumes zu ihm gesprochen.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Ich liebe dich.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du hast gut gespielt.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Alles, was du brauchst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du bist stärker, als du denkst.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist das Tageslicht.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du bist die Nacht.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Die Finsternis, gegen die du kämpfst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Das Licht, nach dem du trachtest, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist nicht allein.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du existierst nicht getrennt von allem anderen.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist das Universum, das von sich selbst kostet, das mit sich selbst spricht und seinen eigenen Code liest.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Ich liebe dich, denn du bist die Liebe.{*EF*}{*B*}{*B*} +{*C3*}Und das Spiel war vorbei und das spielende Wesen erwachte aus dem Traum. Und das spielende Wesen begann einen neuen Traum. Und das spielende Wesen träumte wieder, träumte besser. Und das spielende Wesen war das Universum. Und das spielende Wesen war Liebe.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen.{*EF*}{*B*}{*B*} +{*C2*}Wach auf.{*EF*} + + + Nether zurücksetzen + + + %s hat das Ende betreten. + + + %s hat das Ende verlassen. + + + {*C3*}Ich sehe das spielende Wesen, das du meinst.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Sei auf der Hut. Es hat eine höhere Stufe erreicht. Es kann unsere Gedanken lesen.{*EF*}{*B*}{*B*} +{*C2*}Das ist gleichgültig. Es denkt, wir gehören zum Spiel.{*EF*}{*B*}{*B*} +{*C3*}Ich mag dieses spielende Wesen. Es hat gut gespielt. Es hat nicht aufgegeben.{*EF*}{*B*}{*B*} +{*C2*}Es liest unsere Gedanken, als wären sie Worte auf einem Bildschirm.{*EF*}{*B*}{*B*} +{*C3*}So stellt es sich vielerlei Dinge vor, wenn es sich tief im Traum eines Spiels befindet.{*EF*}{*B*}{*B*} +{*C2*}Worte sind eine wunderbare Schnittstelle. Äußerst flexibel. Und weniger 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*} + + + 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! + + + Eintrittsei kann momentan nicht verwendet werden. 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. + + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Wölfen in einer Welt wurde erreicht. + + + Nether zurücksetzen + + + Nether nicht zurücksetzen + + + Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden wurde erreicht. + + + Gestorben! + + + Weltoptionen + + + Kann bauen und abbauen + + + Kann Türen und Schalter verwenden + + + Strukturen erzeugen + + + Superflache Welt + + + Bonustruhe + + + Kann Container öffnen + + + Spieler ausschließen + + + Kann fliegen + + + Erschöpfung deaktivieren + + + Kann Spieler angreifen + + + Kann Tiere angreifen + + + Moderator + + + Hostprivilegien + + + So wird gespielt + + + Steuerung + + + Einstellungen + + + Wieder erscheinen + + + Inhalte zum Herunterladen + + + Skin ändern + + + Mitwirkende + + + TNT explodiert + + + Spieler gegen Spieler + + + Spielern vertrauen + + + Inhalte neu installieren + + + Debug-Einstellungen + + + Feuer breitet sich aus + + + Enderdrache + + + {*PLAYER*} wurde durch Enderdrachen-Odem getötet. + + + {*PLAYER*} wurde durch {*SOURCE*} getötet. + + + {*PLAYER*} wurde durch {*SOURCE*} getötet. + + + {*PLAYER*} ist gestorben. + + + {*PLAYER*} ist in die Luft gegangen. + + + {*PLAYER*} wurde durch Magie getötet. + + + {*PLAYER*} wurde von {*SOURCE*} erschossen. + + + Grundgesteinnebel + + + Display anzeigen + + + Hand anzeigen + + + {*PLAYER*} starb durch einen Feuerball von {*SOURCE*}. + + + {*PLAYER*} wurde von {*SOURCE*} erschlagen. + + + {*PLAYER*} wurde durch {*SOURCE*} mit Magie getötet. + + + {*PLAYER*} ist aus der Welt herausgefallen. + + + Texturpakete + + + Mash-up-Pakete + + + {*PLAYER*} ist in Flammen aufgegangen. + + + Themen + + + Spielerbilder + + + Avatargegenstände + + + {*PLAYER*} ist zu Tode verbrannt. + + + {*PLAYER*} ist verhungert. + + + {*PLAYER*} wurde erstochen. + + + {*PLAYER*} ist zu hart auf dem Boden aufgeschlagen. + + + {*PLAYER*} hat versucht, in Lava zu schwimmen. + + + {*PLAYER*} ist in einer Wand erstickt. + + + {*PLAYER*} ist ertrunken. + + + Todesmeldungen + + + Du bist kein Moderator mehr. + + + Du kannst jetzt fliegen. + + + Du kannst nicht mehr fliegen. + + + Du kannst keine Tiere mehr angreifen. + + + Du kannst jetzt Tiere angreifen. + + + Du bist jetzt ein Moderator. + + + Du wirst keine Erschöpfung mehr spüren. + + + Du bist jetzt unverwundbar. + + + Du bist nicht mehr unverwundbar. + + + %d MSP + + + Du wirst jetzt wieder Erschöpfung spüren. + + + Du bist jetzt unsichtbar. + + + Du bist nicht mehr unsichtbar. + + + Du kannst jetzt Spieler angreifen. + + + Du kannst jetzt graben und Gegenstände verwenden. + + + Du kannst keine Blöcke mehr platzieren. + + + Du kannst jetzt Blöcke platzieren. + + + Animierte Spielfigur + + + Eigene Skin-Animation + + + Du kannst nicht mehr graben und keine Gegenstände mehr verwenden. + + + Du kannst jetzt Türen und Schalter verwenden. + + + Du kannst keine NPCs mehr angreifen. + + + Du kannst jetzt NPCs angreifen. + + + Du kannst keine Spieler mehr angreifen. + + + Du kannst keine Türen und Schalter mehr verwenden. + + + Du kannst jetzt Container (z. B. Truhen) verwenden. + + + Du kannst keine Container (z. B. Truhen) mehr verwenden. + + + Unsichtbar + + + 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 + + + NICHT VERWENDET + + + Sofortgesundheit + + + Sofortschaden + + + Sprungverstärkung + + + Grabmüdigkeit + + + Stärke + + + Schwäche + + + Verwirrtheit + + + NICHT VERWENDET + + + NICHT VERWENDET + + + NICHT VERWENDET + + + Regeneration + + + Widerstand + + + Seed für den Weltengenerator finden + + + 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. + + + Eine Schienenart, die Loren mit Trichtern aktivieren oder deaktivieren und Loren mit TNT auslösen kann. + + + Damit werden Gegenstände festgehalten oder fallen gelassen, oder in einen anderen Container gelegt, wenn ein Impuls von einem Redstone-Stromkreis empfangen wird. + + + Farbenfrohe Blöcke, die hergestellt werden, indem man gebrannten Lehm färbt. + + + 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. + + + Wird als Redstone-Stromquelle verwendet. Kann wieder zu Redstone zerlegt werden. + + + Wird zum Fangen von Gegenständen oder zu ihrem Transport in und aus Containern verwendet. + + + Kann an Pferde, Esel oder Maultiere verfüttert werden und heilt so bis zu 10 Herzen. Beschleunigt das Wachstum von Fohlen. + + + Fledermaus + + + Diese fliegenden Kreaturen findet man in Höhlen oder anderen großen, geschlossenen Gebieten. + + + Hexe + + + Wird hergestellt, indem Lehm im Ofen geschmolzen wird. + + + Hergestellt aus Glas und Farbstoff. + + + Hergestellt aus gefärbtem Glas. + + + Stellt einen Redstone-Stromkreis zur Verfügung. Der Stromkreis wird stärker, wenn mehr Gegenstände auf die Platte gelegt werden. + + + Ein Block, der abhängig vom Sonnenlicht (oder vom Mangel an Sonnenlicht) ein Redstone-Signal abgibt. + + + Eine besondere Lore, die ähnlich funktioniert wie ein Trichter. Sie sammelt Gegenstände auf Schienen und in Containern über ihr. + + + Eine besondere Rüstung, mit der ein Pferd ausgerüstet werden kann. Verleiht 5 Rüstungspunkte. + + + Damit werden Farbe, Effekt und Form eines Feuerwerks festgelegt. + + + Wird in Redstone-Schaltkreisen eingesetzt, um die Signalstärke zu erhalten, zu vergleichen oder zu verringern oder um bestimmte Blockwerte zu messen. + + + Eine Art Lore, die sich wie ein bewegender TNT-Block verhält. + + + Eine besondere Rüstung, mit der ein Pferd ausgerüstet werden kann. Verleiht 7 Rüstungspunkte. + + + Wird zum Ausführen von Kommandos verwendet. + + + Wirft einen Lichtstrahl in den Himmel und kann Spieler in der Nähe mit Statuseffekten belegen. + + + 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. + + + Eine besondere Rüstung, mit der ein Pferd ausgerüstet werden kann. Verleiht 11 Rüstungspunkte. + + + Wird verwendet, um NPCs zum Spieler oder zu Zaunpfählen zu führen. + + + Wird verwendet, um NPCs in der Welt Namen zu geben. + + + Grabeile + + + Vollständiges Spiel freischalten + + + Spiel fortsetzen + + + Spiel speichern + + + Spielen + + + Bestenlisten + + + Hilfe und Optionen + + + Schwierigkeit: + + + PvP: + + + Spielern vertrauen: + + + TNT: + + + Spieltyp: + + + Strukturen: + + + Leveltyp: + + + Keine Spiele gefunden + + + Nur mit Einladung + + + Weitere Optionen + + + Laden + + + Hostoptionen + + + Spieler/Einladen + + + Online-Spiel + + + Neue Welt + + + Spieler + + + Spiel beitreten + + + Spiel starten + + + Weltname + + + Seed für den Weltengenerator + + + Freilassen für zufälligen Seed + + + Feuer breitet sich aus: + + + Schildnachricht ändern: + + + Gib erklärende Texte zu deinem Screenshot ein. + + + Überschrift + + + Spiel-QuickInfos + + + 2 Spieler, geteilter Bildschirm + + + Fertig + + + Screenshot aus dem Spiel + + + Keine Effekte + + + Geschwindigkeit + + + Langsamkeit + + + Schildnachricht ändern: + + + Die klassischen Texturen, Symbole und Benutzeroberfläche aus Minecraft! + + + Alle Mash-up-Welten anzeigen + + + Tipps + + + Avatar-Gegenstand 1 neu installieren + + + Avatar-Gegenstand 2 neu installieren + + + Avatar-Gegenstand 3 neu installieren + + + Design neu installieren + + + Spielerbild 1 neu installieren + + + Spielerbild 2 neu installieren + + + 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 + + + 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. + + + 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*} @@ -283,6 +3579,23 @@ Die Grundzutaten für Tränke sind:{*B*}{*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*} @@ -293,25 +3606,6 @@ Die tatsächlich angewendete Verzauberung wird zufällig und basierend auf den K 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: 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: LEVEL SPERREN{*ETW*}{*B*}{*B*} @@ -340,6 +3634,27 @@ Aktiviert, dass TNT nach dem Zünden explodiert. Diese Option kann ebenfalls ü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*} @@ -403,60 +3718,91 @@ Dies ermöglicht es dem Spieler, andere Spieler oder sich selbst zu anderen Spie 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. + + + {*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. + + + {*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. + + + Die Minecon 2013 hat in Orlando, Florida (USA) stattgefunden! + + + .party() war exzellent! + + + Gerüchte sind sicherlich immer eher falsch als wahr! + Vorige Seite - - Grundlagen - - - Display - - - Inventar - - - Truhen - - - Dinge herstellen - - - Ofen - - - Dispenser - - - Tierhaltung - - - Tierzucht - - - Brauen - - - Verzaubern - - - Netherportal - - - Multiplayer - - - Screenshots teilen - - - Level sperren - - - Kreativmodus - - - Host- und Spieleroptionen - Handel @@ -466,6 +3812,15 @@ Dies ermöglicht es dem Spieler, andere Spieler oder sich selbst zu anderen Spie Das Ende + + Level sperren + + + Kreativmodus + + + Host- und Spieleroptionen + {*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*} @@ -478,67 +3833,14 @@ 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. - - - Sprinten - - - Neuigkeiten - - - {*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*} {*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*} +{*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*} Fügt mehr Schaden zu als eine leere Hand. @@ -546,9 +3848,466 @@ Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir Hiermit kannst du Erde, Gras, Sand, Kies und Schnee schneller als mit der Hand abbauen. Du brauchst eine Schaufel, um Schneebälle abzubauen. + + Sprinten + + + Neuigkeiten + + + {*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*} + + + Screenshots teilen + + + Truhen + + + Dinge herstellen + + + Ofen + + + Grundlagen + + + Display + + + Inventar + + + Dispenser + + + Verzaubern + + + Netherportal + + + Multiplayer + + + Tierhaltung + + + Tierzucht + + + Brauen + + + deadmau5 mag Minecraft! + + + Pigmen greifen dich nicht an, es sei denn, du greifst sie an. + + + Du kannst deinen Wiedereintrittspunkt ändern und zum Sonnenaufgang vorspringen, indem du in einem Bett schläfst. + + + Schleudere die Feuerbälle auf den Ghast zurück! + + + Stelle Fackeln her, um nachts die Gegend zu erhellen. Monster werden die Bereiche rund um diese Fackeln meiden. + + + Mit einer Lore und Schienen erreichst du dein Ziel schneller! + + + Pflanz ein paar Setzlinge. Sie werden zu Bäumen heranwachsen. + + + Wenn du ein Portal baust, kannst du damit in eine andere Dimension reisen – den Nether. + + + Gerade nach unten oder oben zu graben, ist keine so gute Idee. + + + Knochenmehl (hergestellt aus einem Skelettknochen) kann als Dünger verwendet werden und lässt Pflanzen sofort wachsen! + + + Creeper explodieren, wenn sie dir zu nahe kommen! + + + Drück{*CONTROLLER_VK_B*}, um den Gegenstand abzulegen, den du derzeit in der Hand hältst! + + + Verwende für jede Arbeit das geeignete Werkzeug! + + + Wenn du keine Kohle für deine Fackeln findest, kannst du immer noch im Ofen aus Bäumen Holzkohle herstellen. + + + Mit gekochtem Schweinefleisch regeneriert die Gesundheit besser als mit rohem. + + + Wenn du die Spielschwierigkeit auf Friedlich setzt, wird deine Gesundheit automatisch regeneriert und nachts tauchen keine Monster auf! + + + Füttere einen Wolf mit einem Knochen, um ihn zu zähmen. Du kannst ihm dann befehlen, sich zu setzen oder dir zu folgen. + + + Du kannst vom Inventarmenü aus Gegenstände ablegen, indem du den Cursor aus dem Menü hinaus bewegst und{*CONTROLLER_VK_A*} drückst. + + + Es sind neue Inhalte zum Herunterladen verfügbar! Du kannst sie im Hauptmenü über die Schaltfläche „Minecraft Store“ herunterladen. + + + Du kannst das Aussehen deiner Spielfigur mit einem Skinpaket aus dem Minecraft Store anpassen. Wähle „Minecraft Store“ im Hauptmenü, um zu sehen, was verfügbar ist. + + + Ändere die Gamma-Einstellung, um das Spiel heller oder dunkler anzeigen zu lassen. + + + 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. + + + Bereite mit einer Hacke den Boden aufs Bepflanzen vor. + + + Spinnen werden dich tagsüber nicht angreifen, es sei denn, du greifst sie an! + + + Erde oder Sand lässt sich mit einem Spaten schneller abbauen als per Hand! + + + Hol dir Schweinefleisch von Schweinen. Koch und iss es, um deine Gesundheit zu regenerieren. + + + Hol dir Leder von Kühen und stell daraus Rüstungen her. + + + Wenn du einen leeren Eimer hast, kannst du ihn mit Kuhmilch, Wasser oder Lava füllen! + + + Obsidian entsteht, wenn Wasser auf eine Lavaquelle trifft. + + + Es gibt jetzt stapelbare Zäune im Spiel! + + + Manche Tiere folgen dir, wenn du Weizen in deiner Hand hältst. + + + Wenn ein Tier sich nicht mehr als 20 Blöcke in eine beliebige Richtung bewegen kann, verschwindet es nicht. + + + Zahme Wölfe zeigen ihre Gesundheit durch die Haltung ihres Schwanzes an. Füttere sie mit Fleisch, um sie zu heilen. + + + Koche Kaktus im Ofen, um grüne Farbe zu erhalten. + + + Im Menü „So wird gespielt“ findest du im Abschnitt „Neuigkeiten“ die neuesten Update-Informationen! + + + Musik von C418! + + + Wer ist Notch? + + + Mojang hat mehr Preise als Mitarbeiter! + + + Es gibt berühmte Personen, die Minecraft spielen! + + + Notch hat mehr als eine Million Follower auf Twitter! + + + Nicht alle Schweden sind blond. Manche wie Jens von Mojang haben sogar rote Haare! + + + Irgendwann wird es ein Update für dieses Spiel geben! + + + Wenn du zwei Truhen direkt nebeneinander stellst, entsteht eine große Truhe. + + + Sei vorsichtig, wenn du unter freiem Himmel Strukturen aus Wolle baust, da Gewitterblitze Wolle entzünden können. + + + Ein einziger Eimer Lava reicht als Brennmaterial, um in einem Ofen 100 Blöcke zu schmelzen. + + + Das Instrument, das ein Notenblock spielt, hängt von dem Material unter dem Block ab. + + + Es kann Minuten dauern, bis die Lava VOLLSTÄNDIG verschwindet, nachdem die Lavaquelle entfernt wurde. + + + Pflasterstein ist immun gegen die Feuerbälle von Ghasts und eignet sich daher zum Schutz von Portalen. + + + Alle Blöcke, die als Lichtquelle verwendet werden können, schmelzen Schnee und Eis. Dazu zählen Fackeln, Glowstone und Kürbislaternen. + + + Zombies und Skelette können den Kontakt mit Tageslicht überleben, wenn sie sich im Wasser befinden. + + + Hühner legen alle 5 bis 10 Minuten ein Ei. + + + Obsidian kann nur mit einer Diamantspitzhacke abgebaut werden. + + + Creeper sind die einfachste Möglichkeit, zu Schießpulver zu kommen. + + + Wenn du einen Wolf angreifst, werden alle Wölfe in der unmittelbaren Umgebung aggressiv und greifen dich an. Das Gleiche gilt für Zombie Pigmen. + + + Wölfe können nicht den Nether betreten. + + + Wölfe werden keine Creeper angreifen. + Wird benötigt, um Stein- und Erzblöcke abzubauen. + + Wird für das Kuchenrezept verwendet und als Zutat beim Brauen von Tränken. + + + Erzeugt einen elektrischen Impuls, wenn er gedrückt wird. Bleibt ein- oder ausgeschaltet, bis er erneut gedrückt wird. + + + Konstante Stromquelle. Kann als Empfänger/Sender verwendet werden, wenn sie mit der Seite eines Blocks verbunden ist. Kann auch genutzt werden, um ein wenig Licht zu erzeugen. + + + Regeneriert 2{*ICON_SHANK_01*} und kann zu einem goldenen Apfel verarbeitet werden. + + + Regeneriert 2{*ICON_SHANK_01*} und regeneriert 4 Sekunden lang Gesundheit. Kann aus einem Apfel und Goldklumpen hergestellt werden. + + + Regeneriert 2{*ICON_SHANK_01*}. Der Verzehr kann dich vergiften. + + + Wird in Redstone-Schaltkreisen als Repeater, Verzögerer und/oder als Diode eingesetzt. + + + Wird verwendet, um Loren eine Richtung vorzugeben. + + + Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. + + + Funktioniert wie eine Druckplatte (sendet ein Redstone-Signal, wenn sie aktiviert wird), kann aber nur durch eine Lore aktiviert werden. + + + Erzeugt ein elektrisches Signal, wenn er gedrückt wird. Bleibt für ungefähr eine Sekunde aktiv, bevor er sich wieder deaktiviert. + + + Kann Gegenstände in zufälliger Reihenfolge verschießen, wenn er einen Impuls von einem Redstone-Stromkreis erhält. + + + Spielt beim Auslösen eine Note ab. Schlag auf den Block, um die Tonhöhe zu ändern. Wenn du diesen Block auf verschiedenen Untergründen platzierst, ändert sich das verwendete Instrument. + + + Regeneriert 2,5{*ICON_SHANK_01*}. Entsteht, wenn man einen rohen Fisch im Ofen brät. + + + Regeneriert 1{*ICON_SHANK_01*}. + + + Regeneriert 1{*ICON_SHANK_01*}. + + + Regeneriert 3{*ICON_SHANK_01*}. + + + Wird als Munition für Bögen verwendet. + + + Regeneriert 2,5{*ICON_SHANK_01*}. + + + Regeneriert 1{*ICON_SHANK_01*}. Kann 6 Mal verwendet werden. + + + Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Der Verzehr kann dich vergiften. + + + Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. + + + Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Schweinefleisch im Ofen brät. + + + Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Füttere einen Ozelot damit, um ihn zu zähmen. + + + Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man rohes Hühnchen im Ofen brät. + + + Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. + + + Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Rindfleisch im Ofen brät. + + + Kann dich, ein Tier oder ein Monster auf Schienen transportieren. + + + Wird als Farbe verwendet, um Wolle hellblau zu färben. + + + Wird als Farbe verwendet, um Wolle cyanfarben zu färben. + + + Wird als Farbe verwendet, um Wolle lila zu färben. + + + Wird als Farbe verwendet, um Wolle hellgrün zu färben. + + + Wird als Farbe verwendet, um Wolle grau zu färben. + + + Wird als Farbe verwendet, um Wolle hellgrau zu färben. (Hinweis: Hellgraue Farbe kann auch aus grauer Farbe und Knochenmehl erzeugt werden. So erhältst du aus jedem Tintensack 4 hellgraue Farbe statt nur 3.) + + + Wird als Farbe verwendet, um Wolle magentafarben zu färben. + + + Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + + + Wird zur Herstellung von Büchern und Karten verwendet. + + + Kann zur Herstellung von Bücherregalen verwendet oder verzaubert werden, um Zauberbücher herzustellen. + + + Wird als Farbe verwendet, um Wolle blau zu färben. + + + Spielt Schallplatten ab. + + + Hieraus kannst du sehr beständige Werkzeuge, Waffen und Rüstungen herstellen. + + + Wird als Farbe verwendet, um Wolle orange zu färben. + + + Wird von Schafen eingesammelt und kann mit Farben gefärbt werden. + + + Wird als Baumaterial verwendet und kann mit Farben gefärbt werden. Dieses Rezept ist nicht empfehlenswert, da man Wolle leicht von Schafen erhalten kann. + + + Wird als Farbe verwendet, um Wolle schwarz zu färben. + + + Wird verwendet, um Waren auf Schienen zu transportieren. + + + Bewegt sich auf Schienen und kann andere Loren schieben, wenn du Kohle hineinlegst. + + + Wird verwendet, um schneller als schwimmend übers Wasser zu reisen. + + + Wird als Farbe verwendet, um Wolle grün zu färben. + + + Wird als Farbe verwendet, um Wolle rot zu färben. + + + Wird verwendet, um Getreide, Bäume, hohes Gras, riesige Pilze und Blumen fast augenblicklich wachsen zu lassen. Kann außerdem als Zutat in Farbrezepten verwendet werden. + + + Wird als Farbe verwendet, um Wolle rosa zu färben. + + + Wird als Farbe verwendet, um Wolle braun zu färben, als Zutat für Kekse oder um Kakaofrüchte zu züchten. + + + Wird als Farbe verwendet, um Wolle silbern zu färben. + + + Wird als Farbe verwendet, um Wolle gelb zu färben. + + + Erlaubt Fernangriffe mit Pfeilen. + + + Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. + + + Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + + + Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. + + + Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. + + + Verleihen dem Spieler beim Tragen 2 Rüstungspunkte. + + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + + Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + + + Ein glänzender Barren, aus dem du Werkzeuge herstellen kannst, die aus diesem Material bestehen. Entsteht, wenn du im Ofen Erz schmilzt. + + + Ermöglicht es, aus Barren, Diamanten oder Farben platzierbare Blöcke zu erzeugen. Kann als teurer Baublock oder kompakter Erzspeicher verwendet werden. + + + Wird verwendet, um einen elektrischen Impuls zu erzeugen, wenn ein Spieler, ein Tier oder ein Monster darauftritt. Hölzerne Druckplatten können auch aktiviert werden, indem etwas darauf abgelegt wird. + + + Verleiht dem Spieler beim Tragen 8 Rüstungspunkte. + + + Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. + + + Verleihen dem Spieler beim Tragen 3 Rüstungspunkte. + + + Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. + + + Eisentüren können nur mit Redstone, Knöpfen oder Schaltern geöffnet werden. + + + Verleiht dem Spieler beim Tragen 1 Rüstungspunkt. + + + Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + Wird verwendet, um Holzblöcke schneller als per Hand abzubauen. @@ -558,30 +4317,18 @@ Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir Holztüren werden geöffnet, indem du sie verwendest, dagegen schlägst oder mittels Redstone. - - Eisentüren können nur mit Redstone, Knöpfen oder Schaltern geöffnet werden. - - - NICHT VERWENDET - - - NICHT VERWENDET - - - NICHT VERWENDET - - - NICHT VERWENDET - - - Verleiht dem Spieler beim Tragen 1 Rüstungspunkt. - - - Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + Verleiht dem Spieler beim Tragen 4 Rüstungspunkte. + + + Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. + + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. @@ -591,111 +4338,9 @@ Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. - - Verleiht dem Spieler beim Tragen 4 Rüstungspunkte. - - - Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. - - - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. - - - Verleihen dem Spieler beim Tragen 2 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. - - - Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. - - - Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 8 Rüstungspunkte. - - - Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. - - - Verleihen dem Spieler beim Tragen 3 Rüstungspunkte. - - - Ein glänzender Barren, aus dem du Werkzeuge herstellen kannst, die aus diesem Material bestehen. Entsteht, wenn du im Ofen Erz schmilzt. - - - Ermöglicht es, aus Barren, Diamanten oder Farben platzierbare Blöcke zu erzeugen. Kann als teurer Baublock oder kompakter Erzspeicher verwendet werden. - - - Wird verwendet, um einen elektrischen Impuls zu erzeugen, wenn ein Spieler, ein Tier oder ein Monster darauftritt. Hölzerne Druckplatten können auch aktiviert werden, indem etwas darauf abgelegt wird. - Wird zum Bau platzsparender Treppen verwendet. - - Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. - - - Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. - - - Wird verwendet, um Licht zu erzeugen. Fackeln schmelzen außerdem Schnee und Eis. - - - Wird als Baumaterial und zur Herstellung vieler Dinge verwendet. Kann aus jeder Art von Holz hergestellt werden. - - - Wird als Baumaterial verwendet. Zerfällt nicht wie normaler Sand durch die Schwerkraft. - - - Wird als Baumaterial verwendet. - - - Wird zur Herstellung von Fackeln, Pfeilen, Schildern, Leitern, Zäunen und als Griff für Werkzeuge und Waffen verwendet. - - - Kann die Zeit von einem beliebigen Zeitpunkt in der Nacht bis zum Morgen vorstellen, wenn alle Spieler in der Welt im Bett liegen. Kann auch deinen Wiedereintrittspunkt ändern. Das Bett hat immer dieselbe Farbe. - - - Erlaubt dir, eine größere Auswahl von Gegenständen zu erschaffen als beim normalen Crafting. - - - Erlaubt dir, Erz zu schmelzen, Holzkohle und Glas herzustellen sowie Fisch und Schweinefleisch zu kochen. - - - Lässt dich in ihrem Inneren Blöcke und Gegenstände lagern. Platzier zwei Truhen nebeneinander, um eine größere Truhe mit der doppelten Kapazität zu erschaffen. - - - Wird als Barriere verwendet, über die nicht hinübergesprungen werden kann. Hat für Spieler, Tiere und Monster eine Höhe von 1,5 Blöcken, für andere Blöcke aber die normale Höhe von 1 Block. - - - Wird verwendet, um sich in vertikaler Richtung zu bewegen. - - - Wird durch Verwenden, Dagegenschlagen oder mittels Redstone aktiviert. Funktioniert wie eine normale Tür, ist 1 x 1 Block groß und liegt flach auf dem Boden. - - - Zeigt den Text an, den du oder andere Spieler eingegeben haben. - - - Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. - - - Erzeugt eine Explosion. Wird nach Platzieren mit dem Feuerzeug oder elektrisch gezündet. - Wird verwendet, um Pilzsuppe aufzubewahren. Wenn die Suppe aufgegessen ist, behältst du die Schüssel. @@ -705,18 +4350,18 @@ Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir Wird zum Aufbewahren und zum Transport von Wasser verwendet. + + Zeigt den Text an, den du oder andere Spieler eingegeben haben. + + + Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + + + Erzeugt eine Explosion. Wird nach Platzieren mit dem Feuerzeug oder elektrisch gezündet. + Wird zum Aufbewahren und zum Transport von Lava verwendet. - - Wird zum Aufbewahren und zum Transport von Milch verwendet. - - - Kann Feuer erzeugen, TNT zünden und ein Portal nach dem Bau öffnen. - - - Wird verwendet, um Fische zu fangen. - Zeigt die Position der Sonne und des Mondes an. @@ -726,1388 +4371,507 @@ Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. - - Erlaubt Fernangriffe mit Pfeilen. + + Wird zum Aufbewahren und zum Transport von Milch verwendet. - - Wird als Munition für Bögen verwendet. + + Kann Feuer erzeugen, TNT zünden und ein Portal nach dem Bau öffnen. - - Regeneriert 2,5{*ICON_SHANK_01*}. + + Wird verwendet, um Fische zu fangen. - - Regeneriert 1{*ICON_SHANK_01*}. Kann 6 Mal verwendet werden. + + 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. - - Regeneriert 1{*ICON_SHANK_01*}. + + Wird als Baumaterial und zur Herstellung vieler Dinge verwendet. Kann aus jeder Art von Holz hergestellt werden. - - Regeneriert 1{*ICON_SHANK_01*}. + + Wird als Baumaterial verwendet. Zerfällt nicht wie normaler Sand durch die Schwerkraft. - - Regeneriert 3{*ICON_SHANK_01*}. + + Wird als Baumaterial verwendet. - - Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Der Verzehr kann dich vergiften. - - - Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man rohes Hühnchen im Ofen brät. - - - Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. - - - Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Rindfleisch im Ofen brät. - - - Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. - - - Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Schweinefleisch im Ofen brät. - - - Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Füttere einen Ozelot damit, um ihn zu zähmen. - - - Regeneriert 2,5{*ICON_SHANK_01*}. Entsteht, wenn man einen rohen Fisch im Ofen brät. - - - Regeneriert 2{*ICON_SHANK_01*} und kann zu einem goldenen Apfel verarbeitet werden. - - - Regeneriert 2{*ICON_SHANK_01*} und regeneriert 4 Sekunden lang Gesundheit. Kann aus einem Apfel und Goldklumpen hergestellt werden. - - - Regeneriert 2{*ICON_SHANK_01*}. Der Verzehr kann dich vergiften. - - - Wird für das Kuchenrezept verwendet und als Zutat beim Brauen von Tränken. - - - Erzeugt einen elektrischen Impuls, wenn er gedrückt wird. Bleibt ein- oder ausgeschaltet, bis er erneut gedrückt wird. - - - Konstante Stromquelle. Kann als Empfänger/Sender verwendet werden, wenn sie mit der Seite eines Blocks verbunden ist. Kann auch genutzt werden, um ein wenig Licht zu erzeugen. - - - Wird in Redstone-Schaltkreisen als Repeater, Verzögerer und/oder als Diode eingesetzt. - - - Erzeugt ein elektrisches Signal, wenn er gedrückt wird. Bleibt für ungefähr eine Sekunde aktiv, bevor er sich wieder deaktiviert. - - - Kann Gegenstände in zufälliger Reihenfolge verschießen, wenn er einen Impuls von einem Redstone-Stromkreis erhält. - - - Spielt beim Auslösen eine Note ab. Schlag auf den Block, um die Tonhöhe zu ändern. Wenn du diesen Block auf verschiedenen Untergründen platzierst, ändert sich das verwendete Instrument. - - - Wird verwendet, um Loren eine Richtung vorzugeben. - - - Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. - - - Funktioniert wie eine Druckplatte – sendet ein Redstone-Signal, wenn sie aktiviert wird, kann aber nur durch Loren aktiviert werden. - - - Kann dich, ein Tier oder ein Monster auf Schienen transportieren. - - - Wird verwendet, um Waren auf Schienen zu transportieren. - - - Bewegt sich auf Schienen und kann andere Loren schieben, wenn du Kohle hineinlegst. - - - Wird verwendet, um schneller als schwimmend übers Wasser zu reisen. - - - Wird von Schafen eingesammelt und kann mit Farben gefärbt werden. - - - Wird als Baumaterial verwendet und kann mit Farben gefärbt werden. Dieses Rezept ist nicht empfehlenswert, da man Wolle leicht von Schafen erhalten kann. - - - Wird als Farbe verwendet, um Wolle schwarz zu färben. - - - Wird als Farbe verwendet, um Wolle grün zu färben. - - - Wird als Farbe verwendet, um Wolle braun zu färben, als Zutat für Kekse oder um Kakaofrüchte zu züchten. - - - Wird als Farbe verwendet, um Wolle silbern zu färben. - - - Wird als Farbe verwendet, um Wolle gelb zu färben. - - - Wird als Farbe verwendet, um Wolle rot zu färben. - - - Wird verwendet, um Getreide, Bäume, hohes Gras, riesige Pilze und Blumen fast augenblicklich wachsen zu lassen. Kann außerdem als Zutat in Farbrezepten verwendet werden. - - - Wird als Farbe verwendet, um Wolle rosa zu färben. - - - Wird als Farbe verwendet, um Wolle orange zu färben. - - - Wird als Farbe verwendet, um Wolle hellgrün zu färben. - - - Wird als Farbe verwendet, um Wolle grau zu färben. - - - Wird als Farbe verwendet, um Wolle hellgrau zu färben. (Hinweis: Hellgraue Farbe kann auch aus grauer Farbe und Knochenmehl erzeugt werden. So erhältst du aus jedem Tintensack 4 hellgraue Farbe statt nur 3.) - - - Wird als Farbe verwendet, um Wolle hellblau zu färben. - - - Wird als Farbe verwendet, um Wolle cyanfarben zu färben. - - - Wird als Farbe verwendet, um Wolle lila zu färben. - - - Wird als Farbe verwendet, um Wolle magentafarben zu färben. - - - Wird als Farbe verwendet, um Wolle blau zu färben. - - - Spielt Schallplatten ab. - - - Hieraus kannst du sehr beständige Werkzeuge, Waffen und Rüstungen herstellen. - - - Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. - - - Wird zur Herstellung von Büchern und Karten verwendet. - - - Kann zur Herstellung von Bücherregalen verwendet oder verzaubert werden, um Zauberbücher herzustellen. - - - Ermöglicht die Herstellung noch mächtigerer Verzauberungen, wenn sie um den Zaubertisch herumgestellt werden. - - - Wird als Dekoration eingesetzt. - - - Muss mit mindestens einer Eisenspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Goldbarren zu erzeugen. - - - Muss mit mindestens einer Steinspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Eisenbarren zu erzeugen. - - - Kann mit einer Spitzhacke abgebaut werden, um Kohle zu erhalten. - - - Muss mit mindestens einer Steinspitzhacke abgebaut werden, um Lapislazuli zu erhalten. - - - Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Diamanten zu erhalten. - - - Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Redstone-Staub zu erhalten. - - - Kann mit einer Spitzhacke abgebaut werden, um Pflasterstein zu erhalten. - - - Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. - - - Kann gepflanzt werden und wächst mit der Zeit zu einem Baum heran. - - - Ist unzerstörbar. - - - Setzt alles in Brand, was es berührt. Kann in einem Eimer eingesammelt werden. - - - Wird mithilfe einer Schaufel abgebaut. Kann im Ofen zu Glas geschmolzen werden. Wird unter dem Einfluss der Schwerkraft nach unten fallen, wenn sich kein anderer Block darunter befindet. - - - Wird mithilfe einer Schaufel abgebaut, wodurch man gelegentlich Feuerstein erhält. Fällt unter dem Einfluss der Schwerkraft nach unten, wenn es darunter keinen anderen Block gibt. - - - Kann mit einer Axt abgebaut und zur Herstellung von Holz oder als Brennstoff verwendet werden. - - - Wird im Ofen durch Schmelzen von Sand hergestellt. Kann zum Bauen verwendet werden, bricht aber weg, wenn du versuchst, ihn abzubauen. - - - Kann aus Stein mit einer Spitzhacke abgebaut werden. Kann zum Bau von Öfen oder Steinwerkzeugen verwendet werden. - - - Wird in einem Ofen aus Lehm gebacken. - - - Kann in einem Ofen zu Ziegeln gebacken werden. - - - Wenn er zerstört wird, entstehen Lehmbälle, die in einem Ofen zu Lehmziegeln gebacken werden können. - - - Eine platzsparende Art, Schneebälle zu lagern. - - - Kann mit einer Schaufel abgebaut werden, um Schneebälle zu erzeugen. - - - Erzeugt beim Abbauen gelegentlich Weizensamen. - - - Kann zu Farbe verarbeitet werden. - - - Kann mithilfe einer Schüssel zu Suppe verarbeitet werden. - - - Kann nur mit einer Diamantspitzhacke abgebaut werden. Entsteht, wenn fließendes Wasser und ruhende Lava aufeinandertreffen. Wird zum Bauen von Portalen verwendet. - - - Erschafft Monster und setzt sie in die Welt. - - - Wird auf den Boden gelegt, um eine elektrische Ladung zu erzeugen. In einem Trank gebraut wird die Dauer des Effekts verlängert. - - - Im reifen Zustand kann Getreide geerntet werden, wodurch man Weizen erhält. - - - Boden, der vorbereitet wurde, um bepflanzt zu werden. - - - Kann im Ofen gekocht werden, um grüne Farbe herzustellen. - - - Kann zu Zucker verarbeitet werden. - - - Kann als Helm getragen oder mit einer Fackel zu einer Kürbislaterne verarbeitet werden. Außerdem die Hauptzutat für Kürbiskuchen. - - - Brennt unendlich lange, wenn er angezündet wird. - - - Verlangsamt die Bewegung von allem, was darüber läuft. - - - Mit einem Portal kannst du dich zwischen der oberirdischen Welt und dem Nether hin und her bewegen. - - - Kann im Ofen als Brennstoff verwendet oder zu einer Fackel verarbeitet werden. - - - Erhält man durch Töten einer Spinne. Kann zu einem Bogen oder einer Angel verarbeitet oder auf dem Boden platziert werden, um Stolperdraht herzustellen. - - - 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! - - - Erhält man durch Ernten von Getreide. Kann zu Nahrung verarbeitet werden. - - - Erhält man beim Abbauen von Kies. Kann zu einem Feuerzeug verarbeitet werden. - - - Kann mit einem Schwein verwendet werden, wodurch es möglich ist, auf ihm zu reiten. Mit einer Karottenrute kann das Schwein gesteuert werden. - - - Entsteht beim Abbauen von Schnee. Kann geworfen werden. - - - 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 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. - - - Erhält man durch Töten eines Skeletts. Kann zu Knochenmehl verarbeitet werden. Kann an einen Wolf verfüttert werden, um ihn zu zähmen. - - - Entsteht, wenn ein Creeper von einem Skelett getötet wird. Kann in einer Jukebox abgespielt werden. - - - Löscht Feuer und lässt Getreide wachsen. Kann in einem Eimer eingesammelt werden. - - - Wenn sie abgebaut werden, erscheint manchmal ein Setzling, den man wieder einpflanzen kann, woraus ein neuer Baum wächst. - - - 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. - - - Wenn Strom an einen Kolben angelegt wird (mit einem Schalter, einem Hebel, einer Druckplatte, einer Redstone-Fackel oder Redstone mit einem der vorgenannten Dinge), wird der Kolben länger, falls möglich, und verschiebt Blöcke. - - - Wenn Strom an einen Kolben angelegt wird, 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. - - - Wie eine Tür, findet aber hauptsächlich in Zäunen Verwendung. - - - Kann aus Melonenscheiben hergestellt werden. - - - Transparente Blöcke, können als Alternative zu Glasblöcken verwendet werden. - - - Kann gepflanzt werden, um Kürbisse wachsen zu lassen. - - - Kann gepflanzt werden, um Melonen wachsen zu lassen. - - - Wird von einem sterbenden Enderman fallen gelassen. Wenn du die Enderperle wirfst, wirst du an die Stelle teleportiert, wo sie landet, und verlierst etwas Gesundheit. - - - Ein Block Erde, auf dem Gras wächst. Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. - - - Kann für Bauarbeiten und als Dekoration verwendet werden. - - - Verlangsamt beim Darüberlaufen die Bewegung. Kann mit einer Schere zerstört werden, um Faden zu erhalten. - - - Lässt bei Zerstörung einen Silberfisch entstehen. Kann auch Silberfische entstehen lassen, wenn in der Nähe Silberfische angegriffen werden. - - - Wächst nach Platzierung mit der Zeit. Kann mit einer Schere eingesammelt werden. Du kannst daran wie an einer Leiter klettern. - - - Ist beim Darüberlaufen rutschig. Wird bei Zerstörung zu Wasser, wenn darunter ein anderer Block ist. Schmilzt in der Nähe einer Lichtquelle 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 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. - - - Kann verschiedene Effekte haben, abhängig davon, worauf er angewendet wird. - - - Kann mit Wasser gefüllt werden und wird als Startzutat zum Brauen von Tränken am Braustand verwendet. - - - Giftige Nahrung und Brauzutat. Wird von Spinnen und Höhlenspinnen fallen gelassen, wenn sie von einem Spieler getötet werden. - - - Kann zum Brauen verwendet werden, hauptsächlich, um Tränke mit einem negativen Effekt herzustellen. - - - Kann zum Brauen verwendet werden oder um mit anderen Gegenständen Enderaugen oder Magmacreme herzustellen. - - - Kann zum Brauen verwendet werden. - - - Wird verwendet, um Tränke und Wurftränke herzustellen. - - - Kann mithilfe eines Eimers mit Wasser oder durch Regen gefüllt werden, und kann dann verwendet werden, um Glasflaschen mit Wasser zu füllen. - - - Wenn man es wirft, zeigt es die Richtung zu einem Endportal an. Wenn zwölf davon in die Endportalblöcke gelegt werden, wird das Endportal aktiviert. - - - Kann zum Brauen verwendet werden. - - - Ähnlich wie Grasblöcke, eignet sich aber gut, um Pilze darauf wachsen zu lassen. - - - Schwimmt auf dem Wasser, und man kann darüber laufen. - - - Wird verwendet, um Netherfestungen zu bauen. Immun gegenüber den Feuerbällen von Ghasts. - - - Wird in Netherfestungen verwendet. - - - Findet man in Netherfestungen. Wenn man ihn zerbricht, erhält man Netherwarzen. - - - Erlaubt es Spielern, Schwerter, Spitzhacken, Schaufeln, Äxte und Bögen sowie Rüstungen mithilfe der Erfahrungspunkte des Spielers zu verzaubern. - - - Kann mit zwölf Enderaugen aktiviert werden, und erlaubt es dem Spieler, in die Enddimension zu reisen. - - - Wird verwendet, um ein Endportal zu bilden. - - - Ein Block, den man im Ende findet. Ist sehr widerstandsfähig gegenüber Explosionen und daher ein nützliches Baumaterial. - - - Dieser Block entsteht, wenn der Spieler im Ende den Drachen besiegt. - - - Wenn man sie wirft, erscheint eine Erfahrungskugel, die deine Erfahrungspunkte steigert, wenn du sie einsammelst. - - - Nützlich, um Dinge in Brand zu stecken oder willkürlich beim Abfeuern aus einem Dispenser Feuer zu legen. - - - Ähnelt einem Schaukasten und zeigt den Gegenstand oder Block, der darin platziert wurde. - - - Wirft man damit, kann eine Kreatur des angegebenen Typs erscheinen. - - + Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. - + Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. - - Entsteht, wenn du im Ofen Netherstein schmilzt. Kann zu Netherziegelblöcken verarbeitet werden. + + Wird verwendet, um Licht zu erzeugen. Fackeln schmelzen außerdem Schnee und Eis. - - Sie leuchten, wenn sie unter Strom stehen. + + Wird zur Herstellung von Fackeln, Pfeilen, Schildern, Leitern, Zäunen und als Griff für Werkzeuge und Waffen verwendet. - - Kann angebaut werden, um Kakaobohnen zu erhalten. + + 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. - - NPC-Köpfe können als Dekoration platziert werden oder als Maske anstatt eines Helms getragen werden. + + 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. - - Tintenfisch + + Wird verwendet, um sich in vertikaler Richtung zu bewegen. - - Wenn er getötet wird, lässt er einen Tintensack fallen. + + 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. - - Kuh + + Erlaubt dir, eine größere Auswahl von Gegenständen zu erschaffen als beim normalen Crafting. - - 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 und Knochen fallen. - - - Spinne - - - Greift dich an, wenn du ihr zu nahe kommst. Kann Wände hochklettern. Wenn sie getötet wird, lässt sie Faden fallen. - - - Zombie - - - Greift dich an, wenn du ihm zu nahe kommst. - - - Zombie-Schweinezüchter - - - Eigentlich friedlich, greift dich aber in Gruppen an, wenn du einen angreifst. - - - Ghast - - - Schießt Feuerbälle auf dich, die beim Auftreffen explodieren. - - - Slime - - - Zerfällt in kleinere Slimes, wenn er Schaden erhält. - - - Enderman - - - Greift dich an, wenn du ihn ansiehst. Kann außerdem Blöcke bewegen. - - - Silberfisch - - - Lockt in der Nähe versteckte Silberfische an, wenn er angegriffen wird. Versteckt sich in Steinblöcken. - - - Höhlenspinne - - - Hat einen giftigen Biss. - - - Pilzkuh - - - Kann mithilfe einer Schüssel zu Pilzsuppe verarbeitet werden. Lässt Pilze fallen und wird zu einer normalen Kuh, wenn man sie schert. - - - Schneegolem - - - Der Schneegolem entsteht, wenn Spieler Schneeblöcke und einen Kürbis kombinieren. Bewirft die Feinde seines Erbauers mit Schneebällen. - - - Enderdrache - - - Ein großer schwarzer Drache, den man im Ende findet. - - - Lohe - - - Gegner, die man im Nether findet, vorwiegend in Netherfestungen. Lassen Lohenruten fallen, wenn sie getötet werden. - - - Magmawürfel - - - Findet man im Nether. Ähnlich wie Schleim zerfallen sie zu kleineren Versionen, wenn man sie tötet. - - - Dorfbewohner - - - Ozelot - - - Findet man in Dschungeln. Füttere sie mit rohem Fisch, um sie zu zähmen. Du musst aber zulassen, dass der Ozelot sich dir nähert, denn bei schnellen Bewegungen läuft er weg. - - - Eisengolem - - - Erscheinen in Dörfern, um sie zu beschützen, und können mittels Eisenblöcken und Kürbissen erstellt werden. - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - Lead Game Programmer Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Holzschwert - - - Steinschwert - - - Eisenschwert - - - Diamantschwert - - - Goldschwert - - - Holzschaufel - - - Steinschaufel - - - Eisenschaufel - - - Diamantschaufel - - - Goldschaufel - - - Holzspitzhacke - - - Steinspitzhacke - - - Eisenspitzhacke - - - Diamantspitzhacke - - - Goldspitzhacke - - - Holzaxt - - - Steinaxt + + Erlaubt dir, Erz zu schmelzen, Holzkohle und Glas herzustellen sowie Fisch und Schweinefleisch zu kochen. Eisenaxt - - Diamantaxt + + Redstone-Lampe - - Goldaxt + + Dschungelholztreppe - - Holzhacke + + Birkenholztreppe - - Steinhacke + + Derzeitige Steuerung - - Eisenhacke - - - Diamanthacke - - - Goldhacke - - - Holztür - - - Eisentür - - - Kettenhelm - - - Kettenbrustplatte - - - Kettenhose - - - Kettenstiefel - - - Lederkappe - - - Eisenhelm - - - Diamanthelm - - - Goldhelm - - - Ledertunika - - - Eisenbrustplatte - - - Diamantbrustplatte - - - Goldbrustplatte - - - Lederhose - - - Eisenhose - - - Diamanthose - - - Goldhose - - - Lederstiefel - - - Eisenstiefel - - - Diamantstiefel - - - Goldstiefel - - - Eisenbarren - - - Goldbarren - - - Eimer - - - Wassereimer - - - Lavaeimer - - - Feuerzeug - - - Apfel - - - Bogen - - - Pfeil - - - Kohle - - - Holzkohle - - - Diamant - - - Stock - - - Schüssel - - - Pilzsuppe - - - Faden - - - Feder - - - Schießpulver - - - Weizensamen - - - Weizen - - - Brot - - - Feuerstein - - - Rohes Schweinefleisch - - - Gekochtes Schweinefleisch - - - Gemälde - - - Goldener Apfel - - - Schild - - - Lore - - - Sattel - - - Redstone - - - Schneeball - - - Boot - - - Leder - - - Milcheimer - - - Ziegel - - - Lehm - - - Zuckerrohr - - - Papier - - - Buch - - - Schleimball - - - Lore mit Truhe - - - Lore mit Ofen - - - Ei - - - Kompass - - - Angel - - - Uhr - - - Glowstone-Staub - - - Roher Fisch - - - Gekochter Fisch - - - Farbpulver - - - Tintensack - - - Rosenrot - - - Kaktusgrün - - - Kakaobohnen - - - Lapislazuli - - - Lila Farbe - - - Farbe Cyan - - - Hellgraue Farbe - - - Graue Farbe - - - Rosa Farbe - - - Hellgrüne Farbe - - - Löwenzahngelb - - - Hellblaue Farbe - - - Farbe Magenta - - - Farbe Orange - - - Knochenmehl - - - Knochen - - - Zucker - - - Kuchen - - - Bett - - - Redstone-Repeater - - - Keks - - - Karte - - - Schallplatte - „13“ - - - Schallplatte - „cat“ - - - Schallplatte - „blocks“ - - - Schallplatte - „chirp“ - - - Schallplatte - „far“ - - - Schallplatte - „mall“ - - - Schallplatte - „mellohi“ - - - Schallplatte - „stal“ - - - Schallplatte - „strad“ - - - Schallplatte - „ward“ - - - Schallplatte - „11“ - - - Schallplatte - „where are we now“ - - - Schere - - - Kürbissamen - - - Melonensamen - - - Rohes Hühnchen - - - Gebratenes Hühnchen - - - Rohes Rindfleisch - - - Steak - - - Verrottetes Fleisch - - - Enderperle - - - Melonenscheibe - - - Lohenrute - - - Ghastträne - - - Goldklumpen - - - Netherwarze - - - {*prefix*}{*splash*}Trank {*postfix*} - - - Glasflasche - - - Wasserflasche - - - Spinnenauge - - - Ferment. Spinnenauge - - - Lohenstaub - - - Magmacreme - - - Braustand - - - Kessel - - - Enderauge - - - Funkelnde Melone - - - Erfahrungsfläschchen - - - Feuerkugel - - - Feuerkugel (Holzkohle) - - - Feuerkugel (Kohle) - - - Gegenstandsrahmen - - - {*CREATURE*} erzeugen - - - Netherziegel - - + Schädel - - Skelettschädel + + Kakao - - Dörrskelettschädel + + Fichtenholztreppe - - Zombiekopf + + Drachenei - - Kopf + + Endstein - - Kopf von %s + + Endportalrahmen - - Creeper-Kopf + + Sandsteintreppe - - Stein + + Hohes Gras - - Grasblock + + Strauch - - Erde + + Layout - - Pflasterstein + + Crafting - - Eichenholzbretter + + Verwenden - - Fichtenholzbretter + + Aktion - - Birkenholzbretter + + Schleichen/Runterfliegen - - Dschungelholzbretter + + Schleichen - - Setzling + + Ablegen - - Eichensetzling + + Gegenstand wechseln - - Fichtensetzling + + Pause - - Birkensetzling + + Schauen - - Dschungelbaumsetzling + + Bewegen/Sprinten - - Bedrock + + Inventar - - Wasser + + Springen/Hochfliegen - - Lava + + Springen - - Sand + + Endportal - - Sandstein + + Kürbispflanze - - Kies + + Melone - - Golderz + + Glasscheibe - - Eisenerz + + Zauntor - - Kohlenerz + + Ranken - - Baumstamm + + Melonenpflanze - - Eichenholz + + Eisengitter - - Fichtenholz + + Rissige Steinziegel - - Birkenholz + + Bemooste Steinziegel - - Dschungelholz + + Steinziegel + + + Pilz + + + Pilz + + + Gemeißelter Steinziegel + + + Ziegeltreppe + + + Netherwarze + + + Netherziegeltreppe + + + Netherzaun + + + Kessel + + + Braustand + + + Zaubertisch + + + Netherziegel + + + Silberfisch-Pflasterstein + + + Silberfischstein + + + Steinziegeltreppe + + + Seerosenblatt + + + Myzel + + + Silberfisch-Steinziegel + + + Kameramodus ändern + + + 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. + + + Durch Umherlaufen, Graben und Angreifen leerst du deine Hungerleiste {*ICON_SHANK_01*}. Durch Sprinten und Sprint-Springen verbrauchst du viel mehr Nahrung als durch normales Laufen und Springen. + + + Wenn du 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. + + + Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Öffne dazu die Crafting-Oberfläche.{*PlanksIcon*} + + + 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*} + + + 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. + + + Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Crafting-Oberfläche zu öffnen. + + + 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. + + + Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich umherbewegen. + + + Mit{*CONTROLLER_ACTION_LOOK*} kannst du nach oben, unten und in die anderen Richtungen schauen. + + + 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. + + + 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. + + + Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen. + + + Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Erstell eine Werkbank.{*CraftingTableIcon*} + + + + 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. + + + + Container öffnen + + + 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*} + + + 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 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. + + + + In der Nähe gibt es einen verlassenen Unterstand von Minenarbeitern, den du fertigstellen kannst, um nachts in Sicherheit zu sein. + + + + 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*} + + + 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. + + + Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. + + + 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*} + + + 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*} + + + Zeig mit dem Fadenkreuz auf die Werkbank und drück{*CONTROLLER_ACTION_USE*}, um sie zu öffnen. + + + 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. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Layout 1 + + + Bewegen (beim Fliegen) + + + Spieler/Einladen + + + + + + Layout 3 + + + Layout 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Drück zum Fortfahren{*CONTROLLER_VK_A*}. + + + + + + + + + + + + + + + + + + + + + + + + + + + Silberfischblock + + + Steinstufe + + + Ein kompakter Eisenspeicher. + + + Eisenblock + + + Eichenholzstufe + + + Sandsteinstufe + + + Steinstufe + + + Ein kompakter Goldspeicher. + + + Blume + + + Weiße Wolle + + + Orangefarbene Wolle + + + Goldblock + + + Pilz + + + Rose + + + Pflastersteinstufe + + + Bücherregal + + + TNT + + + Ziegel + + + Fackel + + + Obsidian + + + Bemooster Pflasterstein + + + Netherziegelstufe + + + Eichenholzstufe + + + Steinziegelstufe + + + Ziegelstufe + + + Dschungelholzstufe + + + Birkenholzstufe + + + Fichtenholzstufe + + + Magentafarbene Wolle + + + Birkenblätter + + + Fichtenblätter + + + Eichenblätter + + + Glas + + + Schwamm + + + Dschungelblätter + + + Blätter Eiche @@ -2118,702 +4882,679 @@ Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir Birke - - Blätter + + Fichtenholz - - Eichenblätter + + Birkenholz - - Fichtenblätter - - - Birkenblätter - - - Dschungelblätter - - - Schwamm - - - Glas + + Dschungelholz Wolle - - Schwarze Wolle - - - Rote Wolle - - - Grüne Wolle - - - Braune Wolle - - - Blaue Wolle - - - Lila Wolle - - - Cyanfarbene Wolle - - - Hellgraue Wolle + + Rosa Wolle Graue Wolle - - Rosa Wolle - - - Hellgrüne Wolle - - - Gelbe Wolle + + Hellgraue Wolle Hellblaue Wolle - - Magentafarbene Wolle + + Gelbe Wolle - - Orangefarbene Wolle + + Hellgrüne Wolle - - Weiße Wolle + + Cyanfarbene Wolle - - Blume + + Grüne Wolle - - Rose + + Rote Wolle - - Pilz + + Schwarze Wolle - - Goldblock + + Lila Wolle - - Ein kompakter Goldspeicher. + + Blaue Wolle - - Eisenblock - - - Ein kompakter Eisenspeicher. - - - Steinstufe - - - Steinstufe - - - Sandsteinstufe - - - Eichenholzstufe - - - Pflastersteinstufe - - - Ziegelstufe - - - Steinziegelstufe - - - Eichenholzstufe - - - Fichtenholzstufe - - - Birkenholzstufe - - - Dschungelholzstufe - - - Netherziegelstufe - - - Ziegel - - - TNT - - - Bücherregal - - - Bemooster Pflasterstein - - - Obsidian - - - Fackel + + Braune Wolle Fackel (Kohle) - - Fackel (Holzkohle) - - - Feuer - - - Monster-Spawner - - - Eichenholztreppe - - - Truhe - - - Redstone-Staub - - - Diamanterz - - - Diamantblock - - - Ein kompakter Diamantspeicher. - - - Werkbank - - - Getreide - - - Ackerland - - - Ofen - - - Schild - - - Holztür - - - Leiter - - - Schiene - - - Booster-Schiene - - - Detektor-Schiene - - - Steintreppe - - - Hebel - - - Druckplatte - - - Eisentür - - - Redstone-Erz - - - Redstone-Fackel - - - Taste - - - Schnee - - - Eis - - - Kaktus - - - Lehm - - - Zuckerrohr - - - Jukebox - - - Zaun - - - Kürbis - - - Kürbislaterne - - - Netherrack + + Glowstone Seelensand - - Glowstone - - - Portal - - - Lapislazulierz + + Netherrack Lapislazuliblock + + Lapislazulierz + + + Portal + + + Kürbislaterne + + + Zuckerrohr + + + Lehm + + + Kaktus + + + Kürbis + + + Zaun + + + Jukebox + Ein kompakter Lapislazulispeicher. - - Dispenser - - - Notenblock - - - Kuchen - - - Bett - - - Netz - - - Hohes Gras - - - Toter Strauch - - - Diode - - - Verschlossene Truhe - Falltür - - Wolle (beliebige Farbe) + + Verschlossene Truhe - - Kolben + + Diode Haftender Kolben - - Silberfischblock + + Kolben - - Steinziegel + + Wolle (beliebige Farbe) - - Bemooste Steinziegel + + Toter Strauch - - Rissige Steinziegel + + Kuchen - - Gemeißelter Steinziegel + + Notenblock - - Pilz + + Dispenser - - Pilz - - - Eisengitter - - - Glasscheibe - - - Melone - - - Kürbispflanze - - - Melonenpflanze - - - Ranken - - - Zauntor - - - Ziegeltreppe - - - Steinziegeltreppe - - - Silberfischstein - - - Silberfisch-Pflasterstein - - - Silberfisch-Steinziegel - - - Myzel - - - Seerosenblatt - - - Netherziegel - - - Netherzaun - - - Netherziegeltreppe - - - Netherwarze - - - Zaubertisch - - - Braustand - - - Kessel - - - Endportal - - - Endportalrahmen - - - Endstein - - - Drachenei - - - Strauch - - + Hohes Gras - - Sandsteintreppe + + Netz - - Fichtenholztreppe + + Bett - - Birkenholztreppe + + Eis - - Dschungelholztreppe + + Werkbank - - Redstone-Lampe + + Ein kompakter Diamantspeicher. - - Kakao + + Diamantblock - - Schädel + + Ofen - - Derzeitige Steuerung + + Ackerland - - Layout + + Getreide - - Bewegen/Sprinten + + Diamanterz - - Schauen + + Monster-Spawner - - Pause + + Feuer - - Springen + + Fackel (Holzkohle) - - Springen/Hochfliegen + + Redstone-Staub - - Inventar + + Truhe - - Gegenstand wechseln + + Eichenholztreppe - - Aktion + + Schild - - Verwenden + + Redstone-Erz - - Crafting + + Eisentür - - Ablegen + + Druckplatte - - Schleichen + + Schnee - - Schleichen/Runterfliegen + + Taste - - Kameramodus ändern + + Redstone-Fackel - - Spieler/Einladen + + Hebel - - Bewegen (beim Fliegen) + + Schiene - - Layout 1 + + Leiter - - Layout 2 + + Holztür - - Layout 3 + + Steintreppe - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Detektor-Schiene - - <![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;]]> - - - <![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*}Drück zum Fortfahren{*CONTROLLER_VK_A*}. - - - {*B*}Drück{*CONTROLLER_VK_A*}, um das Tutorial zu starten.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du denkst, dass du so weit bist, dass du allein spielen kannst. - - - Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was du dir vorstellen kannst. -Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor sie herauskommen. - - - Mit{*CONTROLLER_ACTION_LOOK*} kannst du nach oben, unten und in die anderen Richtungen schauen. - - - Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich umherbewegen. - - - Um zu sprinten, drücke {*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn. Solange du {*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du, bis dir die Sprintzeit oder die Nahrung ausgeht. - - - Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen. - - - Halte{*CONTROLLER_ACTION_ACTION*} gedrückt, um mit deiner Hand oder dem Werkzeug in deiner Hand zu graben oder zu hacken. Um manche Blöcke abbauen zu können, wirst du dir ein Werkzeug herstellen müssen. - - - Halte{*CONTROLLER_ACTION_ACTION*} gedrückt, um 4 Blöcke von Baumstämmen abzuhacken.{*B*}Wenn ein Block abbricht, kannst du ihn aufnehmen, indem du dich dicht neben das auftauchende, schwebende Objekt stellst, wodurch es in deinem Inventar erscheint. - - - Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Crafting-Oberfläche zu öffnen. - - - Wenn du zunehmend mehr Gegenstände einsammelst und herstellst, wird sich dein Inventar langsam füllen.{*B*} - Drück{*CONTROLLER_ACTION_INVENTORY*}, um das Inventar zu öffnen. - - - Durch Umherlaufen, Graben und Angreifen leerst du deine Hungerleiste {*ICON_SHANK_01*}. Durch Sprinten und Sprint-Springen verbrauchst du viel mehr Nahrung als durch normales Laufen und Springen. - - - Wenn du Gesundheit verlierst, aber eine Hungerleiste mit 9 oder mehr{*ICON_SHANK_01*} darin hast, regeneriert sich deine Gesundheit automatisch. Wenn du Nahrung isst, regeneriert sich deine Hungerleiste. - - - Halte{*CONTROLLER_ACTION_USE*} gedrückt, wenn du Nahrung in der Hand hast, um sie zu essen und deine Hungerleiste aufzufüllen. Du kannst nichts essen, wenn deine Hungerleiste voll ist. - - - Deine Hungerleiste ist fast leer, und du hast etwas Gesundheit verloren. Iss das Steak aus deinem Inventar, um deine Hungerleiste aufzufüllen und deine Gesundheit zu regenerieren.{*ICON*}364{*/ICON*} - - - Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Öffne dazu die Crafting-Oberfläche.{*PlanksIcon*} - - - Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Erstell eine Werkbank.{*CraftingTableIcon*} - - - Um Blöcke schneller einsammeln zu können, kannst du dir besser geeignete Werkzeuge herstellen. Manche Werkzeuge haben einen Griff, der aus Stöcken hergestellt wird. Stell jetzt ein paar Stöcke her.{*SticksIcon*} - - - Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. - - - Drück{*CONTROLLER_ACTION_USE*}, um Gegenstände zu verwenden, mit Objekten zu interagieren und geeignete Gegenstände zu platzieren. Platzierte Gegenstände kannst du wieder aufnehmen, indem du sie mit dem geeigneten Werkzeug abbaust. - - - Wenn du die Werkbank ausgewählt hast, zeig mit dem Fadenkreuz dahin, wo du sie aufstellen möchtest, und platzier sie, indem du{*CONTROLLER_ACTION_USE*} drückst. - - - Zeig mit dem Fadenkreuz auf die Werkbank und drück{*CONTROLLER_ACTION_USE*}, um sie zu öffnen. - - - Eine Schaufel hilft dir, weiche Blöcke wie Erde und Schnee schneller abzubauen. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten kannst und die länger halten. Stell eine Holzschaufel her.{*WoodenShovelIcon*} - - - Mit einer Axt kannst du schneller Stämme und hölzerne 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*} - - - Eine Spitzhacke hilft dir, harte Blöcke wie Stein und Erz schneller abzubauen. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten sowie härtere Materialien abbauen kannst und die länger halten. Stell eine Holzspitzhacke her.{*WoodenPickaxeIcon*} - - - Container öffnen - - - - Die Nacht kann schnell hereinbrechen, und dann wird es gefährlich, sich unvorbereitet im Freien aufzuhalten. Du kannst Rüstungen und Waffen herstellen, es ist aber eine gute Idee, einen sicheren Unterstand zu haben. - - - - In der Nähe gibt es einen verlassenen Unterstand von Minenarbeitern, den du fertigstellen kannst, um nachts in Sicherheit zu sein. - - - - Du wirst die nötigen Materialien sammeln müssen, um den Unterstand fertig zu bauen. Wände und Dach können aus beliebigem Material bestehen, aber du wirst eine Tür, ein paar Fenster und Beleuchtung brauchen. - - - - Bau mithilfe deiner Spitzhacke ein paar Steinblöcke ab. Steinblöcke erzeugen beim Abbauen Pflastersteine. Wenn du 8 Blöcke Pflasterstein sammelst, kannst du einen Ofen bauen. Möglicherweise musst du dich durch Erde graben, um auf Stein zu stoßen. Verwende dazu deine Schaufel.{*StoneIcon*} + + Booster-Schiene Du hast genügend Pflastersteine gesammelt, um einen Ofen zu bauen. Verwende deine Werkbank, um einen herzustellen. - - Drück{*CONTROLLER_ACTION_USE*}, um den Ofen in der Welt zu platzieren, und öffne ihn dann. + + Angel - - 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? + + Uhr - - 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? + + Glowstone-Staub - - 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*} + + Lore mit Ofen - - 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. + + Ei - - 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*} + + Kompass - - Du hast den ersten Teil des Tutorials abgeschlossen. + + Roher Fisch - - {*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. + + Rosenrot + + + Kaktusgrün + + + Kakaobohnen + + + Gekochter Fisch + + + Farbpulver + + + Tintensack + + + Lore mit Truhe + + + Schneeball + + + Boot + + + Leder + + + Lore + + + Sattel + + + Redstone + + + Milcheimer + + + Papier + + + Buch + + + Schleimball + + + Ziegel + + + Lehm + + + Zuckerrohr + + + Lapislazuli + + + Karte + + + Schallplatte - „13“ + + + Schallplatte - „cat“ + + + Bett + + + Redstone-Repeater + + + Keks + + + Schallplatte - „blocks“ + + + Schallplatte - „mellohi“ + + + Schallplatte - „stal“ + + + Schallplatte - „strad“ + + + Schallplatte - „chirp“ + + + Schallplatte - „far“ + + + Schallplatte - „mall“ + + + Kuchen + + + Graue Farbe + + + Rosa Farbe + + + Hellgrüne Farbe + + + Lila Farbe + + + Farbe Cyan + + + Hellgraue Farbe + + + Löwenzahngelb + + + Knochenmehl + + + Knochen + + + Zucker + + + Hellblaue Farbe + + + Farbe Magenta + + + Farbe Orange + + + Schild + + + Ledertunika + + + Eisenbrustplatte + + + Diamantbrustplatte + + + Eisenhelm + + + Diamanthelm + + + Goldhelm + + + Goldbrustplatte + + + Goldhose + + + Lederstiefel + + + Eisenstiefel + + + Lederhose + + + Eisenhose + + + Diamanthose + + + Lederkappe + + + Steinhacke + + + Eisenhacke + + + Diamanthacke + + + Diamantaxt + + + Goldaxt + + + Holzhacke + + + Goldhacke + + + Kettenbrustplatte + + + Kettenhose + + + Kettenstiefel + + + Holztür + + + Eisentür + + + Kettenhelm + + + Diamantstiefel + + + Feder + + + Schießpulver + + + Weizensamen + + + Schüssel + + + Pilzsuppe + + + Faden + + + Weizen + + + Gekochtes Schweinefleisch + + + Gemälde + + + Goldener Apfel + + + Brot + + + Feuerstein + + + Rohes Schweinefleisch + + + Stock + + + Eimer + + + Wassereimer + + + Lavaeimer + + + Goldstiefel + + + Eisenbarren + + + Goldbarren + + + Feuerzeug + + + Kohle + + + Holzkohle + + + Diamant + + + Apfel + + + Bogen + + + Pfeil + + + Schallplatte - „ward“ + + + 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*} + + + 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*} + + + 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. + + + 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. + + + 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*} + + + 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*} + + + Mithilfe einer Werkbank kannst du eine größere Auswahl an Gegenständen herstellen. Crafting auf einer Werkbank funktioniert genau wie einfaches Crafting, du hast aber einen größeren Crafting-Bereich, der mehr Zutatenkombinationen erlaubt. + + + Der 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. + + + + 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. + + + + Jetzt wird die Liste der Zutaten angezeigt, die benötigt werden, um den ausgewählten Gegenstand herzustellen. + + + Jetzt wird die Beschreibung des derzeit ausgewählten Gegenstands angezeigt. Die Beschreibung hilft dir zu verstehen, wofür der Gegenstand eingesetzt werden kann. + + + 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. + + + Manche Gegenstände kannst du nicht mit der Werkbank herstellen, sondern brauchst dafür einen Ofen. Stell jetzt einen Ofen her.{*FurnaceIcon*} + + + Kies + + + Golderz + + + Eisenerz + + + Lava + + + Sand + + + Sandstein + + + Kohlenerz + + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man einen Ofen verwendet. + + + 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. + + + 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. + + + Baumstamm + + + Eichenholz + + + 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. + + + {*B*} + Drück{*CONTROLLER_VK_X*}, um wieder das Inventar anzuzeigen. + + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Inventar verwendet wird. 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. + + {*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. + + + Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand ablegen. + + + + 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. + @@ -2821,53 +5562,30 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor Falls es dort mehr als einen Gegenstand gibt, werden alle aufgenommen. Du kannst auch{*CONTROLLER_VK_X*} drücken, um nur die Hälfte von ihnen aufzunehmen. - - Beweg diesen Gegenstand mit dem Cursor an einen anderen Platz im Inventar, und platzier ihn dort, indem du{*CONTROLLER_VK_A*} drückst. - Wenn sich mehrere Gegenstände unter dem Cursor befinden, drück{*CONTROLLER_VK_A*}, um alle abzulegen, oder{*CONTROLLER_VK_X*}, um nur einen abzulegen. - + + Du hast den ersten Teil des Tutorials abgeschlossen. - - Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand ablegen. - + + 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? + + + 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? + + + Drück{*CONTROLLER_ACTION_USE*}, um den Ofen in der Welt zu platzieren, und öffne ihn dann. + + + 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*} + + + 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. + + + 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*} - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück {*CONTROLLER_VK_BACK*}. - - - Drück jetzt{*CONTROLLER_VK_B*}, um das Inventar zu verlassen. - - - Dies ist das Inventar des Kreativmodus. Hier werden die Gegenstände angezeigt, die du in der Hand verwenden kannst, sowie alle anderen Gegenstände, die dir zur Verfügung stehen. - - - {*B*} - Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man das Kreativmodus-Inventar verwendet. - - - Beweg den Cursor mithilfe von{*CONTROLLER_MENU_NAVIGATE*}. - Wähle in der Gegenstandsliste mit{*CONTROLLER_VK_A*} den Gegenstand unter dem Cursor oder mit{*CONTROLLER_VK_Y*} eine ganze Gruppe dieses Gegenstands aus. - - - - - Der Cursor bewegt sich automatisch über ein Feld in der Verwendungsreihe. Du kannst den Gegenstand mit{*CONTROLLER_VK_A*} ablegen. Sobald du den Gegenstand abgelegt hast, kehrt der Cursor in die Gegenstandsliste zurück, wo du einen weiteren Gegenstand auswählen kannst. - - - - Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand in der Welt ablegen. Drück{*CONTROLLER_VK_X*}, um alle Gegenstände in der Schnellauswahlleiste zu löschen. - - - - Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern der einzelnen Gruppen, um die Gruppe des Gegenstands auszuwählen, den du brauchst. - - - - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_BACK*}. - - - Drück jetzt{*CONTROLLER_VK_B*}, um das Kreativmodus-Inventar zu verlassen. + Wenn du mehr Informationen über einen Gegenstand brauchst, bewege den Cursor über den Gegenstand und drücke {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2875,2122 +5593,258 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor Dies ist die Crafting-Oberfläche. Hier kannst du gesammelte Gegenstände kombinieren, um neue Gegenstände herzustellen. - - {*B*} - Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. + + Drück jetzt{*CONTROLLER_VK_B*}, um das Kreativmodus-Inventar zu verlassen. + - - {*B*} - Drück{*CONTROLLER_VK_X*}, um eine Beschreibung des Gegenstands anzuzeigen. + + + Wenn du mehr Informationen über einen Gegenstand brauchst, bewege den Cursor über den Gegenstand und drücke {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + {*B*} Drück{*CONTROLLER_VK_X*}, um die Zutaten anzuzeigen, die du für den aktuellen Gegenstand benötigst. - + {*B*} - Drück{*CONTROLLER_VK_X*}, um wieder das Inventar anzuzeigen. + Drück{*CONTROLLER_VK_X*}, um eine Beschreibung des Gegenstands anzuzeigen. - - Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern der einzelnen Gruppen, um die Gruppe des gewünschten Gegenstands auszuwählen, und wähle dann den herzustellenden Gegenstand mit{*CONTROLLER_MENU_NAVIGATE*} aus. - - - - Der Crafting-Bereich zeigt die Gegenstände an, die du brauchst, um den neuen Gegenstand herzustellen. Drück{*CONTROLLER_VK_A*}, um den Gegenstand herzustellen und in deinem Inventar abzulegen. - - - - Mithilfe einer Werkbank kannst du eine größere Auswahl an Gegenständen herstellen. Crafting auf einer Werkbank funktioniert genau wie einfaches Crafting, du hast aber einen größeren Crafting-Bereich, der mehr Zutatenkombinationen erlaubt. - - - Der untere rechte Bereich der Crafting-Oberfläche zeigt dein Inventar an. In diesem Bereich kannst du dir auch eine Beschreibung des derzeit ausgewählten Gegenstands samt der dafür benötigten Zutaten anzeigen lassen. - - - Jetzt wird die Beschreibung des derzeit ausgewählten Gegenstands angezeigt. Die Beschreibung hilft dir zu verstehen, wofür der Gegenstand eingesetzt werden kann. - - - Jetzt wird die Liste der Zutaten angezeigt, die benötigt werden, um den ausgewählten Gegenstand herzustellen. - - - Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Wähl das Holzsymbol aus und drück{*CONTROLLER_VK_A*}, um Holz herzustellen.{*PlanksIcon*} - - - Du solltest deine Werkbank jetzt in der Welt platzieren, damit du eine größere Auswahl an Gegenständen herstellen kannst.{*B*} - Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. - - - Drück{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*}, um zur Gruppe der Gegenstände zu wechseln, die du herstellen möchtest. Wähl die Gruppe „Werkzeuge“ aus.{*ToolsIcon*} - - - Drück{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*}, um zur Gruppe der Gegenstände zu wechseln, die du herstellen möchtest. Wähl die Gruppe „Strukturen“ aus.{*StructuresIcon*} - - - Ändere mit{*CONTROLLER_MENU_NAVIGATE*} den Gegenstand, den du herstellen möchtest. Von manchen Gegenständen gibt es mehrere Versionen, abhängig vom verwendeten Material. Wähl die Holzschaufel aus.{*WoodenShovelIcon*} - - - Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Ändere mit{*CONTROLLER_MENU_NAVIGATE*} den Gegenstand, den du herstellen möchtest. Wähl die Werkbank aus.{*CraftingTableIcon*} - - - Mit den Werkzeugen, die du gebaut hast, hast du einen guten Start hingelegt. Du bist jetzt in der Lage, eine Vielzahl verschiedener Materialien effektiver zu sammeln.{*B*} - Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. - - - Manche Gegenstände kannst du nicht mit der Werkbank herstellen, sondern brauchst dafür einen Ofen. Stell jetzt einen Ofen her.{*FurnaceIcon*} - - - Platzier den hergestellten Ofen in der Welt. Du wirst ihn in deinen Unterstand stellen wollen.{*B*} - Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. - - - Dies ist die Ofen-Oberfläche. Ein Ofen erlaubt dir, Gegenstände zu verändern, indem du sie erhitzt. Du kannst im Ofen zum Beispiel Eisenbarren aus Eisenerz herstellen. - - + {*B*} Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man einen Ofen verwendet. + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. - - 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. + + 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. + - - Du kannst viele Holzgegenstände als Brennstoff verwenden, aber nicht alles brennt gleich lange. Du wirst auch andere Gegenstände in der Welt finden, die du als Brennstoff verwenden kannst. - - - Wenn dein Gegenstand fertig erhitzt ist, kannst du ihn aus dem Ausgabefeld in dein Inventar verschieben. Du solltest mit verschiedenen Zutaten experimentieren, um zu sehen, was du alles herstellen kannst. - - - Wenn du Baumstämme als Zutat verwendest, kannst du Holzkohle herstellen. Leg Brennstoff in den Ofen und einen Baumstamm in das Zutatenfeld. Es wird eine Weile dauern, bis der Ofen die Holzkohle fertig hat, du kannst währenddessen etwas anderes tun und später wiederkommen, um dir den Fortschritt anzusehen. - - - Holzkohle kann als Brennstoff verwendet werden, du kannst daraus aber auch mit einem Stock eine Fackel herstellen. - - - Wenn du Sand ins Zutatenfeld legst, kannst du Glas herstellen. Erschaff ein paar Glasblöcke, die du als Fenster in deinem Unterstand verwenden kannst. - - - Dies ist die Brau-Oberfläche. Hier kannst du Tränke erschaffen, die die verschiedensten Effekte haben können. - - + {*B*} Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man den Braustand verwendet. + Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man das Kreativmodus-Inventar verwendet. - - Du braust Tränke, indem du in das obere Feld eine Zutat legst und in die unteren Felder je einen Trank oder eine Wasserflasche (du kannst gleichzeitig bis zu 3 Tränke brauen). Sobald eine funktionierende Kombination eingelegt wurde, beginnt der Brauprozess und nach kurzer Zeit entsteht der Trank. + + 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. - - 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. + + Drück jetzt{*CONTROLLER_VK_B*}, um das Inventar zu verlassen. - - 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. + + 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. + - - Wenn du dem Trank ein Fermentiertes Spinnenauge hinzufügst, verdirbt der Trank und kann den entgegengesetzten Effekt hervorrufen. Wenn du dem Trank Schießpulver hinzufügst, wird aus dem Trank ein Wurftrank und du kannst seinen Effekt auf einen ganzen Bereich entfalten. - - - Erzeuge einen Trank der Feuerresistenz, indem du zuerst eine Netherwarze zu einer Wasserflasche hinzufügst und dann Magmacreme. - - - Drück jetzt{*CONTROLLER_VK_B*}, um die Brauoberfläche zu verlassen. - - - In diesem Gebiet gibt es einen Braustand, einen Kessel sowie eine Truhe mit Gegenständen zum Brauen. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, wenn du mehr über das Brauen und Tränke erfahren möchtest. {*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon alles über das Brauen und Tränke weißt. - - - Der erste Schritt zum Brauen eines Trankes ist es, eine Wasserflasche zu erschaffen. Nimm eine Glasflasche aus der Truhe. - - - Du kannst eine Glasflasche aus einem Kessel mit Wasser füllen oder aus einem Wasserblock. Fülle jetzt deine Glasflasche, indem du damit auf eine Wasserquelle zeigst und{*CONTROLLER_ACTION_USE*} drückst. - - - Wenn ein Kessel leer ist, kannst du ihn mit einem Wassereimer wieder auffüllen. - - - Braue mithilfe des Braustandes einen Trank der Feuerresistenz. Du brauchst dazu eine Wasserflasche, eine Netherwarze und Magmacreme. - - - Nimm einen Trank in 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. - - - - Verwende deinen Trank der Feuerresistenz für dich selbst. - - - Jetzt bist du resistent gegenüber Feuer und Lava. Probier doch mal aus, ob du jetzt Orte erreichen kannst, die dir vorher versperrt geblieben sind. - - - Dies ist die Verzauberoberfläche, über die du Waffen, Rüstungen und einige Werkzeuge verzaubern kannst. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Verzauberoberfläche erfahren möchtest. {*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Verzauberoberfläche weißt. - - - Um einen Gegenstand zu verzaubern, lege ihn in das Verzauberfeld. Waffen, Rüstungen und manche Werkzeuge können verzaubert werden, um Spezialeffekte zu erhalten wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. - - - Wenn ein Gegenstand in das Verzauberfeld gelegt wird, ändern sich die Schaltflächen rechts und zeigen eine Auswahl zufälliger Verzauberungen an. - - - Die Zahl auf den Schaltflächen symbolisiert die Kosten in Erfahrungsleveln, um die Verzauberung auf den Gegenstand anzuwenden. Wenn dein Erfahrungslevel nicht hoch genug ist, ist die Schaltfläche deaktiviert. - - - Wähl eine Verzauberung aus und drück{*CONTROLLER_VK_A*}, um den Gegenstand zu verzaubern. Dadurch sinkt dein Erfahrungslevel um die Kosten der Verzauberung. - - - Auch wenn alle Verzauberungen zufällig sind, sind einige der besseren doch nur verfügbar, wenn du einen hohen Erfahrungslevel und viele Bücherregale rund um den Zaubertisch errichtet hast, um die Stärke des Zaubers zu vergrößern. - - - In diesem Gebiet stehen ein Zaubertisch und weitere Gegenstände, die dir helfen, etwas über das Verzaubern zu lernen. - - - {*B*} - Drü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. - - - - Mithilfe eines Zaubertisches kannst du Waffen, Rüstungen und manchen Werkzeugen Spezialeffekte hinzufügen wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. - - - Wenn du Bücherregale rund um den Zaubertisch baust, steigerst du seine Zauberkraft und kannst Verzauberungen höherer Level erhalten. - - - Gegenstände verzaubern kostet Erfahrungslevel, die du durch das Sammeln von Erfahrungskugeln steigerst. Erfahrungskugeln entstehen, wenn du Monster und Tiere tötest, Erz abbaust, Tiere züchtest, angelst und manche Dinge in einem Ofen kochst/einschmilzt. - - - Du kannst Erfahrung auch durch den Einsatz von Erfahrungsfläschchen erhalten. Wenn diese geworfen werden, entstehen Erfahrungskugeln rund um die Stelle, wo es gelandet ist. Diese Kugeln können eingesammelt werden. - - - 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. - - - Du fährst jetzt in einer Lore. Um die Lore zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über Loren zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Loren weißt. - - - Loren fahren auf Schienen. Mit einem Ofen und einer Lore kannst du eine angetriebene Lore erschaffen. Du kannst auch eine Lore mit einer Truhe darin erschaffen. - {*RailIcon*} - - - Du kannst auch Booster-Schienen erschaffen, die Loren mit Strom aus Redstone-Fackeln und -Stromkreisen beschleunigen. Sie können mit Schaltern, Hebeln und Druckplatten verbunden werden, um komplexe Systeme zu erschaffen. - {*PoweredRailIcon*} - - - Du segelst jetzt in einem Boot. Um das Boot zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über Boote zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Boote weißt. - - - Ein Boot erlaubt dir, schneller übers Wasser zu reisen. Du kannst es mit{*CONTROLLER_ACTION_MOVE*} und{*CONTROLLER_ACTION_LOOK*} steuern. - {*BoatIcon*} - - - Du verwendest jetzt eine Angel. Drück{*CONTROLLER_ACTION_USE*}, um sie einzusetzen.{*FishingRodIcon*} - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr übers Angeln zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles übers Angeln weißt. - - - Drück{*CONTROLLER_ACTION_USE*}, um deine Angel auszuwerfen und mit dem Angeln zu beginnen. Drück erneut{*CONTROLLER_ACTION_USE*}, um die Angel einzuholen. - {*FishingRodIcon*} - - - Wenn du mit dem Einholen wartest, bis der Schwimmer unter die Wasseroberfläche versunken ist, kannst du einen Fisch fangen. Fische können roh gegessen oder in einem Ofen gekocht werden, um deine Gesundheit zu regenerieren. - {*FishIcon*} - - - Genau wie viele andere Werkzeuge kann eine Angel nicht unbegrenzt oft eingesetzt werden. Ihr Einsatz beschränkt sich aber nicht aufs Fangen von Fischen. Du solltest mit ihr experimentieren, um zu sehen, was du sonst noch so fangen oder aktivieren kannst ... - {*FishingRodIcon*} - - - Dies ist ein Bett. Drück{*CONTROLLER_ACTION_USE*}, während du nachts darauf zeigst, um die Nacht zu verschlafen und am Morgen wieder zu erwachen.{*ICON*}355{*/ICON*} - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über Betten zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Betten weißt. - - - Ein Bett sollte an einem sicheren, gut beleuchteten Ort stehen, damit du nicht mitten in der Nacht von Monstern geweckt wirst. Sobald du einmal ein Bett verwendet hast und später stirbst, erscheinst du in diesem Bett wieder in der Spielwelt. - {*ICON*}355{*/ICON*} - - - Wenn es in deinem Spiel noch weitere Spieler gibt, müssen sich alle gleichzeitig im Bett befinden, um schlafen zu können. - {*ICON*}355{*/ICON*} - - - In diesem Gebiet gibt es ein paar einfache Redstone-Schaltkreise und Kolben sowie eine Truhe mit weiteren Gegenständen, um diese Schaltkreise zu erweitern. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über Redstone-Schaltkreise und Kolben zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Redstone-Schaltkreise und Kolben weißt. - - - Hebel, Schalter, Druckplatten und auch Redstone-Fackeln können Schaltkreise mit Strom versorgen, indem du sie entweder direkt oder mithilfe von Redstonestaub mit dem Gegenstand verbindest, den du aktivieren möchtest. - - - Sowohl Position als auch Ausrichtung einer Stromquelle können einen Einfluss darauf haben, welchen Effekt sie auf die umgebenden Blöcke hat. Wenn du zum Beispiel eine Redstone-Fackel seitlich an einem Block anbringst, kann sie ausgeschaltet werden, wenn der Block Strom von einer anderen Quelle erhält. - - - Redstone-Staub kannst du beim Abbauen von Redstone-Erz mit einer Spitzhacke aus Eisen, Diamant oder Gold erhalten. Mit seiner Hilfe kannst du Strom 15 Blöcke weit und einen Block nach oben oder unten übertragen. - {*ICON*}331{*/ICON*} - - - - Mit Redstone-Repeatern kannst du die Distanz verlängern, über die du Strom übertragen kannst, oder eine Verzögerung in einem Schaltkreis verursachen. - {*ICON*}356{*/ICON*} - - - + - Wenn Strom an den Kolben angelegt wird, wird der Kolben länger und verschiebt bis zu 12 Blöcke. Wenn ein haftender Kolben zurückgezogen wird, zieht er einen Block der meisten Typen mit sich zurück. - {*ICON*}33{*/ICON*} - + 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. + - - In der Truhe in diesem Gebiet findest du Komponenten, um Schaltkreise mit Kolben herzustellen. Versuch, die Schaltkreise in diesem Gebiet zu verwenden oder sie fertigzustellen, oder bau deine eigenen zusammen. Außerhalb des Tutorial-Gebiets findest du weitere Beispiele. - - - In diesem Gebiet gibt es ein Portal in den Nether! - - - {*B*} - Drück {*CONTROLLER_VK_A*}, um mehr über das Portal und den Nether zu erfahren.{*B*} - Drück {*CONTROLLER_VK_B*}, wenn du schon alles über das Portal und den Nether weißt. - - - Portale werden erzeugt, indem man Obsidian-Blöcke zu einem vier Blöcke breiten und fünf Blöcke hohen Rahmen anordnet. Die Eckblöcke können dabei weggelassen werden. - - - Um ein 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. - - - 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. - - - Der Nether kann ein gefährlicher Ort sein, voller Lava. Er ist aber auch nützlich, um Netherstein zu sammeln, der nach dem Anzünden ewig brennt, sowie Glowstone, der Licht produziert. - - - Mithilfe der Netherwelt kann man in der oberirdischen Welt schneller reisen – eine Entfernung von einem Block im Nether entspricht drei Blöcken in der oberirdischen Welt. - - - Du bist jetzt im Kreativmodus. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, wenn du mehr über den Kreativmodus erfahren möchtest. {*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Kreativmodus weißt. - - - Im Kreativmodus hast du einen unbegrenzten Vorrat aller verfügbaren Gegenstände und Blöcke, du kannst Blöcke ohne Werkzeug mit einem Klick zerstören, bist unverwundbar und kannst fliegen. - - - Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Kreativinventar-Oberfläche zu öffnen. - - - Begib dich auf die andere Seite dieses Lochs. - - - Du hast jetzt das Tutorial zum Kreativmodus abgeschlossen. - - - In diesem Gebiet wurde eine Farm errichtet. Mithilfe von Landwirtschaft kannst du eine erneuerbare Quelle von Nahrung und anderen Gegenständen erschaffen. - - - {*B*} - Drück {*CONTROLLER_VK_A*}, um mehr über Landwirtschaft zu erfahren.{*B*} - Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Landwirtschaft weißt. - - - Weizen, Kürbisse und Melonen zieht man aus Samen. Weizensamen kann man sammeln, indem man Weizen erntet oder Hohes Gras abbaut. Kürbis- und Melonensamen kann man aus Kürbissen bzw. Melonen herstellen. - - - Bevor du Samen pflanzt, musst du Erdblöcke mithilfe einer Hacke in Ackerboden umwandeln. Wenn sich in der Nähe eine Wasserquelle befindet, wird sie den Ackerboden befeuchten, wodurch die Pflanzen schneller wachsen. Denselben Effekt erzielt man, indem man die Gegend permanent beleuchtet. - - - Weizen durchläuft beim Wachstum mehrere Phasen. Er kann geerntet werden, wenn er dunkler aussieht.{*ICON*}59:7{*/ICON*} - - - Kürbisse und Melonen benötigen einen Block Platz neben der Stelle, wo du den Samen gepflanzt hast, damit die Frucht wachsen kann, nachdem der Stängel voll ausgewachsen ist. - - - Zuckerrohr muss auf einem Gras-, Erd- oder Sandblock gepflanzt werden, der sich direkt neben einem Wasserblock befindet. Wenn man einen Zuckerrohrblock entfernt, zerfallen auch alle darüber liegenden Zuckerrohrblöcke.{*ICON*}83{*/ICON*} - - - Kakteen müssen auf Sand gepflanzt werden. Sie wachsen bis zu drei Blöcke hoch. Genau wie bei Zuckerrohrblock musst du nur den untersten Block zerstören, um auch die darüber liegenden Blöcke einsammeln zu können.{*ICON*}81{*/ICON*} - - - Pilze solltest du in einem spärlich beleuchteten Gebiet pflanzen. Sie breiten sich auf umliegende spärlich beleuchtete Blöcke aus.{*ICON*}39{*/ICON*} - - - Man kann Knochenmehl verwenden, um Pflanzen schneller auswachsen zu lassen oder um Pilze zu Riesigen Pilzen wachsen zu lassen.{*ICON*}351:15{*/ICON*} - - - Du hast jetzt das Tutorial zur Landwirtschaft abgeschlossen. - - - In diesem Gebiet sind Tiere untergebracht. Du kannst Tiere dazu bringen, dass sie Tierbabys produzieren. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über Tierzucht zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Tierzucht weißt. - - - - Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den „Liebesmodus“ zu versetzen. - - - Füttere eine Kuh, eine Pilzkuh oder ein Schaf mit Weizen, ein Schwein mit Karotten, ein Huhn mit Weizensamen 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. - - - Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst. - - - Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann. - - - Manche Tiere folgen dir, wenn du Futter in deiner Hand hältst. Das erleichtert es, Tiere zur Paarung in Gruppen zu versammeln.{*ICON*}296{*/ICON*} - - + - 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. - + 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. + - - Du hast jetzt das Tutorial zur Tierzucht abgeschlossen. + + Wasser - - In dieser Gegend gibt es Kürbisse und Blöcke, um einen Schneegolem und einen Eisengolem zu erstellen. + + Glasflasche - - {*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. + + Wasserflasche - - Du erstellst Golems, indem du einen Kürbis auf einen Stapel Blöcke legst. + + Spinnenauge - - Schneegolems bestehen aus zwei aufeinanderliegenden Schneeblöcken mit einem Kürbis darauf. Schneegolems bewerfen deine Feinde mit Schneebällen. + + Goldklumpen - - Eisengolems bestehen aus vier Eisenblöcken im gezeigten Muster mit einem Kürbis auf dem mittleren Block. Eisengolems greifen deine Feinde an. + + Netherwarze - - Eisengolems erscheinen auch auf natürliche Art, um Dörfer zu verteidigen, und greifen dich an, falls du Dorfbewohner attackierst. + + {*prefix*}{*splash*}Trank {*postfix*} - - Du kannst diesen Bereich erst verlassen, wenn du das Tutorial abgeschlossen hast. + + Ferment. Spinnenauge - - Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Schaufel verwenden, um weiches Material wie Erde und Sand abzubauen. + + Kessel - - Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Axt verwenden, um Baumstämme abzuhacken. + + Enderauge - - 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. + + Funkelnde Melone - - Manche Werkzeuge eignen sich besser, um Gegner anzugreifen. Probier zum Angreifen mal ein Schwert aus. + + Lohenstaub - - 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. + + Magmacreme - - Das verwendete Werkzeug ist beschädigt worden. Jedes Mal, wenn du ein Werkzeug einsetzt, erhält es ein wenig Schaden, und irgendwann geht es kaputt. Die farbige Leiste unterhalb des Gegenstands in deinem Inventar zeigt seinen aktuellen Zustand an. - - - Halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um nach oben zu schwimmen. - - - In diesem Gebiet gibt es Schienen, auf denen eine Lore steht. Um die Lore zu betreten, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*} auf dem Schalter, um die Lore in Bewegung zu setzen. - - - In der Truhe neben dem Fluss befindet sich ein Boot. Um das Boot zu verwenden, platzier den Cursor auf Wasser und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*}, während du auf das Boot zeigst, um es zu betreten. - - - In der Truhe neben dem Teich befindet sich eine Angel. Nimm die Angel aus der Truhe, und nimm sie in deine Hand, um sie zu verwenden. - - - Dieser kompliziertere Kolbenmechanismus erzeugt eine selbstreparierende Brücke! Drück zum Aktivieren den Schalter und schau dir dann an, wie die Komponenten interagieren, um alles besser zu verstehen. - - - Wenn du den Cursor über den Rand der Oberfläche hinaus bewegst, während du einen Gegenstand trägst, kannst du den Gegenstand ablegen. - - - Du hast nicht alle Zutaten, die du brauchst, um diesen Gegenstand herzustellen. Das Feld unten links zeigt dir die benötigten Zutaten an. - - - Glückwunsch, du hast das Tutorial abgeschlossen. Die Spielzeit vergeht jetzt mit normaler Geschwindigkeit, und du hast nicht mehr viel Zeit, bis die Nacht hereinbricht und Monster auftauchen! Stell deinen Unterstand fertig! - - - {*EXIT_PICTURE*} Wenn du bereit bist, dich weiter umzusehen, gibt es in der Nähe des Unterstands der Minenarbeiter eine Treppe, die zu einer kleinen Burg führt. - - - - Erinnerung: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Mit der aktuellen Version wurden dem Spiel neue Features hinzugefügt, darunter neue Gebiete in der Tutorial-Welt. - - - {*B*}Drück{*CONTROLLER_VK_A*}, um das Tutorial ganz normal zu spielen.{*B*} - Drück{*CONTROLLER_VK_B*}, um das Haupt-Tutorial zu überspringen. - - - In diesem Gebiet gibt es Bereiche, in denen du mehr über das Angeln, Boote, Kolben und Redstone erfahren kannst. - - - Außerhalb dieses Gebiets findest du Beispiele für Gebäude, Landwirtschaft, Loren und Schienen sowie zum Verzaubern, Brauen, Handeln, Schmieden und noch einiges mehr! - - - Deine Hungerleiste ist so weit geleert, dass du dich nicht mehr regenerieren kannst. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über die Hungerleiste und die Nahrungsaufnahme zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Hungerleiste und die Nahrungsaufnahme weißt. - - - Auswählen - - - Verwenden - - - Zurück - - - Verlassen - - - Abbrechen - - - Beitritt abbrechen - - - Online-Spiele aktualisieren - - - Partyspiele - - - Alle Spiele - - - Gruppe wechseln - - - Inventar - - - Beschreibung - - - Zutaten - - - Crafting - - - Erschaffen - - - Nehmen/Ablegen - - - Nehmen - - - Alles nehmen - - - Hälfte nehmen - - - Platzieren - - - Alles platzieren - - - Eins platzieren - - - Ablegen - - - Alles ablegen - - - Eins ablegen - - - Tauschen - - - Verschieben - - - Schnellauswahl leeren - - - Was ist das? - - - Auf Facebook teilen - - - Filter ändern - - - Freundschaftsanfrage - - - Seite runter - - - Seite hoch - - - Weiter - - - Zurück - - - Spieler ausschließen - - - Färben - - - Abbauen - - - Füttern - - - Zähmen - - - Heilen - - - Sitz - - - Folge mir - - - Auswerfen - - - Leeren - - - Sattel - - - Platzieren - - - Treffen - - - Melken - - - Sammeln - - - Essen - - - Schlafen - - - Aufwachen - - - Spielen - - - Reiten - - - Segeln - - - Anbauen - - - Hochschwimmen - - - Öffnen - - - Tonhöhe ändern - - - Explodieren - - - Lesen - - - Hängen - - - Werfen - - - Pflanzen - - - Umgraben - - - Ernten - - - Weiter - - - Vollständiges Spiel freischalten - - - Spielstand löschen - - - Löschen - - - Optionen - - - Freunde einladen - - - Annehmen - - - Schere - - - Level sperren - - - Skin auswählen - - - Anzünden - - - Navigieren - - - Vollständiges Spiel installieren - - - Testversion installieren - - - Installieren - - - Neu installieren - - - Optionen - - - Kommando ausführen - - - Kreativ - - - Zutat verschieben - - - Brennstoff verschieben - - - Beweg-Werkzeug - - - Rüstung bewegen - - - Waffe bewegen - - - Verwenden - - - Ziehen - - - Loslassen - - - Privilegien - - - Blocken - - - Seite hoch - - - Seite runter - - - Liebesmodus - - - Trinken - - - Drehen - - - Ausblenden - - - Alle Plätze leeren - - - O. K. - - - Abbrechen - - - Minecraft Store - - - Möchtest du dieses Spiel wirklich verlassen und dem neuen beitreten? Dabei gehen nicht gespeicherte Fortschritte verloren. - - - Spiel verlassen - - - Spiel speichern - - - Verlassen ohne Speichern - - - Willst du wirklich mit der aktuellen Version dieser Welt alle früheren Speicherdateien für diese Welt überschreiben? - - - Möchtest du wirklich ohne Speichern aufhören? Du verlierst dabei alle Fortschritte in dieser Welt! - - - Spiel starten - - - Speicherdatei beschädigt - - - Diese Speicherdatei ist ungültig oder beschädigt. Möchtest du sie löschen? - - - Möchtest du wirklich zum Hauptmenü zurückkehren und alle Spieler vom Spiel trennen? Dabei gehen nicht gespeicherte Fortschritte verloren. - - - Verlassen und speichern - - - Verlassen ohne speichern - - - Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei gehen nicht gespeicherte Fortschritte verloren. - - - Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei geht dein Fortschritt verloren! - - - Neue Welt erschaffen - - - Tutorial spielen - - - Tutorial - - - Benenne deine Welt - - - Gib einen Namen für deine Welt ein. - - - Gib den Seed fürs Erstellen deiner Welt ein - - - Gespeicherte Welt laden - - - Drück START, um beizutreten - - - Spiel verlassen - - - Es ist ein Fehler aufgetreten. Zurück zum Hauptmenü. - - - Fehler beim Herstellen der Verbindung - - - Verbindung verloren. - - - Die Verbindung zum Server wurde unterbrochen. Zurück zum Hauptmenü. - - - Die Verbindung zum Server wurde getrennt. - - - Du wurdest aus dem Spiel ausgeschlossen. - - - Du wurdest wegen Fliegens aus dem Spiel ausgeschlossen. - - - Verbindungsversuch dauert zu lange. - - - Der Server ist voll. - - - Der Host hat das Spiel verlassen. - - - Du kannst diesem Spiel nicht beitreten, da du mit niemandem in diesem Spiel befreundet bist. - - - Du kannst diesem Spiel nicht beitreten, da du vom Host aus dem Spiel ausgeschlossen wurdest. - - - Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine ältere Spielversion verwendet. - - - Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine neuere Spielversion verwendet. - - - Neue Welt - - - Preis freigeschaltet! - - - Hurra – du hast ein Spielerbild mit Steve von Minecraft gewonnen! - - - Hurra – du hast ein Spielerbild mit einem Creeper gewonnen! - - - 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: - - - Freunde - - - Meine Punkte - - - Insgesamt - - - Einträge: - - - Rang - - - Vorbereiten fürs Speichern des Levels - - - Teile werden vorbereitet ... - - - Wird finalisiert ... - - - Gelände bauen - - - Welt simulieren - - - Server initialisieren - - - Startbereich generieren - - - Startbereich laden - - - Nether betreten - - - Nether verlassen - - - Erneut erscheinen - - - Level generieren - - - Level laden - - - Spieler speichern - - - Mit dem Host verbinden - - - Gelände herunterladen - - - Wechsel in den Offline-Modus. - - - Warte bitte, bis der Host das Spiel gespeichert hat. - - - Das ENDE betreten - - - Das ENDE verlassen - - - Dieses Bett ist belegt. - - - Du kannst nur nachts schlafen. - - - %s schläft in einem Bett. Um zum Sonnenaufgang vorzuspringen, müssen alle Spieler gleichzeitig in Betten schlafen. - - - Dein Bett fehlt oder ist versperrt. - - - Du kannst dich jetzt nicht ausruhen, es sind Monster in der Nähe. - - - Du schläfst in einem Bett. Um zum Sonnenaufgang zu wechseln, müssen alle Spieler gleichzeitig schlafen. - - - Werkzeuge und Waffen - - - Waffen - - - Nahrung - - - Strukturen - - - Rüstung - - - Mechanismen - - - Transport - - - Dekorationen - - - Blöcke bauen - - - Redstone und Transport - - - Verschiedenes - - - Brauen - - - Werkzeuge, Waffen und Rüstungen - - - Materialien - - - Abgemeldet - - - Schwierigkeit - - - Musik - - - Sound - - - Gamma - - - Spielempfindlichkeit - - - Menüempfindlichkeit - - - Friedlich - - - Leicht - - - Normal - - - Schwierig - - - In diesem Modus regeneriert sich deine Gesundheit mit der Zeit, und es gibt keine Gegner in der Welt. - - - In diesem Modus erscheinen Gegner in der Umgebung, sie fügen dem Spieler aber weniger Schaden zu als im normalen Modus. - - - In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine normale Menge Schaden zu. - - - In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine große Menge Schaden zu. Achte auch auf die Creeper, sie brechen ihren Explosionsangriff nicht ab, wenn du dich von ihnen entfernst! - - - Testversion abgelaufen - - - Spiel voll - - - Fehler beim Spielbeitritt, da keine Plätze mehr frei sind. - - - Schildtext eingeben - - - Gib eine Textzeile für dein Schild ein. - - - Titel eingeben - - - Gib einen Titel für deinen Beitrag ein. - - - Überschrift eingeben - - - Gib eine Überschrift für deinen Beitrag ein. - - - Beschreibung eingeben - - - Gib eine Beschreibung für deinen Beitrag ein. - - - Inventar - - - Zutaten - - + Braustand - - Truhe + + Ghastträne - - Verzaubern + + Kürbissamen - - Ofen + + Melonensamen - - Zutat + + Rohes Hühnchen - - Brennstoff + + Schallplatte - „11“ - - Dispenser + + Schallplatte - „where are we now“ - - Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. + + Schere - - %s ist dem Spiel beigetreten. + + Gebratenes Hühnchen - - %s hat das Spiel verlassen. + + Enderperle - - %s wurde aus dem Spiel ausgeschlossen. + + Melonenscheibe - - Möchtest du diesen Spielstand wirklich löschen? + + Lohenrute - - Wird genehmigt ... + + Rohes Rindfleisch - - Zensiert + + Steak - - Jetzt wird gespielt: + + Verrottetes Fleisch - - Einstellungen zurücksetzen + + Erfahrungsfläschchen - - Möchtest du deine Einstellungen wirklich auf die Standardwerte zurücksetzen? + + Eichenholzbretter - - Ladefehler + + Fichtenholzbretter - - Spiel von %s + + Birkenholzbretter - - Unbekanntes Hostspiel + + Grasblock - - Gast abgemeldet + + Erde - - Ein Gastspieler hat sich abgemeldet, dadurch wurden alle Gastspieler aus dem Spiel entfernt. + + Pflasterstein - - Anmelden + + Dschungelholzbretter - - Du bist derzeit nicht angemeldet. Du musst angemeldet sein, um dieses Spiel zu spielen. Möchtest du dich jetzt anmelden? + + Birkensetzling - - Multiplayer nicht möglich + + Dschungelbaumsetzling - - Fehler beim Erstellen des Spiels + + Bedrock - - Automatisch ausgewählt + + Setzling - - Kein Paket: Standard-Skins + + Eichensetzling - - Skin-Favoriten + + Fichtensetzling - - Gesperrter Level + + Stein - - 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. + + Gegenstandsrahmen - - Diesen Level sperren? + + {*CREATURE*} erzeugen - - Möchtest du diesen Level wirklich deiner Liste gesperrter Level hinzufügen? -Wenn du O. K. auswählst, verlässt du dieses Spiel. + + Netherziegel - - Von Liste gesperrter Level entfernen + + Feuerkugel - - Speicherintervall + + Feuerkugel (Holzkohle) - - Speicherintervall: AUS + + Feuerkugel (Kohle) - - Min + + Schädel - - Kann hier nicht platziert werden! + + Kopf - - Das Platzieren von Lava neben dem Wiedereintrittspunkt ist nicht gestattet, da sonst Spieler beim Wiedereintritt in den Level sofort sterben könnten. + + Kopf von %s - - Durchsichtigkeit + + Creeper-Kopf - - Autospeichern des Levels wird vorbereitet + + Skelettschädel - - Displaygröße + + Dörrskelettschädel - - Displaygr. (geteilter Bildsch.) + + Zombiekopf - - Seed - - - Skinpaket freischalten - - - Um die ausgewählte Skin zu verwenden, musst du dieses Skinpaket freischalten. -Möchtest du dieses Skinpaket jetzt freischalten? - - - Texturpaket freischalten - - - Du musst das Texturpaket freischalten, um es für deine Welt zu verwenden. -Möchtest du es jetzt freischalten? - - - Texturpaket-Testversion - - - Du verwendest nun eine Testversion des Texturpakets. Du kannst diese Welt erst speichern, wenn du die Vollversion freischaltest. -Möchtest du die Vollversion des Texturpakets freischalten? - - - Texturpaket nicht verfügbar - - - Vollversion freischalten - - - Testversion herunterladen - - - Vollversion herunterladen - - - Diese Welt verwendet ein Mash-up-Paket oder Texturpaket, das dir fehlt! -Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? - - - Testversion holen - - - Vollständiges Spiel holen - - - Spieler ausschließen - - - Möchtest du diesen Spieler wirklich aus dem Spiel ausschließen? Er wird bis zum Neustart der Welt dem Spiel nicht mehr beitreten können. - - - Spielerbilder-Paket - - - Themen - - - Skinpaket - - - Freunde von Freunden zulassen - - - Du kannst diesem Spiel nicht beitreten, da es auf Spieler beschränkt wurde, die mit dem Host befreundet sind. - - - Spielbeitritt nicht möglich - - - Ausgewählt - - - Ausgewählte Skin: - - - Inhalte zum Herunterladen def. - - - Diese Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü „Minecraft Store“ aus neu installieren. - - - Einige deiner Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü „Minecraft Store“ aus neu installieren. - - - Dein Spielmodus wurde geändert. - - - Welt umbenennen - - - Gib den neuen Namen für deine Welt ein. - - - Spielmodus: Überleben - - - Spielmodus: Kreativ - - - Überleben - - - Kreativ - - - Im Überlebensmodus - - - Im Kreativmodus - - - Wolken erstellen - - - Was möchtest du mit diesem Spielstand tun? - - - Spielstand umbenennen - - - Automatisches Speichern in %d ... - - - Ein - - - Aus - - - Normal - - - Superflach - - - Wenn dies aktiviert ist, ist das Spiel online. - - - Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. - - - Wenn dies aktiviert ist, können nur Freunde von Leuten auf deiner Freundeliste dem Spiel beitreten. - - - Aktiviert, dass Spieler sich gegenseitig Schaden zufügen können. Hat nur Einfluss auf den Überlebensmodus. - - - Wenn deaktiviert, können Spieler, die dem Spiel beitreten, nicht bauen oder abbauen, bis sie autorisiert wurden. - - - Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. - - - Aktiviert, dass aktiviertes TNT explodiert. - - - Sorgt bei Aktivierung dafür, dass der Nether neu erstellt wird. Dies ist nützlich, wenn du einen alten Spielstand hast, der keine Netherfestungen enthält. - - - Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. - - - Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird. - - - Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. - - - Skinpakete - - - Themen - - - Spielerbilder - - - Avatargegenstände - - - Texturpakete - - - Mash-up-Pakete - - - {*PLAYER*} ist in Flammen aufgegangen. - - - {*PLAYER*} ist zu Tode verbrannt. - - - {*PLAYER*} hat versucht, in Lava zu schwimmen. - - - {*PLAYER*} ist in einer Wand erstickt. - - - {*PLAYER*} ist ertrunken. - - - {*PLAYER*} ist verhungert. - - - {*PLAYER*} wurde erstochen. - - - {*PLAYER*} ist zu hart auf dem Boden aufgeschlagen. - - - {*PLAYER*} ist aus der Welt herausgefallen. - - - {*PLAYER*} ist gestorben. - - - {*PLAYER*} ist in die Luft gegangen. - - - {*PLAYER*} wurde durch Magie getötet. - - - {*PLAYER*} wurde durch Enderdrachen-Odem getötet. - - - {*PLAYER*} wurde durch {*SOURCE*} getötet. - - - {*PLAYER*} wurde durch {*SOURCE*} getötet. - - - {*PLAYER*} wurde von {*SOURCE*} erschossen. - - - {*PLAYER*} starb durch einen Feuerball von {*SOURCE*}. - - - {*PLAYER*} wurde von {*SOURCE*} erschlagen. - - - {*PLAYER*} wurde durch {*SOURCE*} getötet. - - - Grundgesteinnebel - - - Display anzeigen - - - Hand anzeigen - - - Todesmeldungen - - - Animierte Spielfigur - - - Eigene Skin-Animation - - - Du kannst nicht mehr graben und keine Gegenstände mehr verwenden. - - - Du kannst jetzt graben und Gegenstände verwenden. - - - Du kannst keine Blöcke mehr platzieren. - - - Du kannst jetzt Blöcke platzieren. - - - Du kannst jetzt Türen und Schalter verwenden. - - - Du kannst keine Türen und Schalter mehr verwenden. - - - Du kannst jetzt Container (z. B. Truhen) verwenden. - - - Du kannst keine Container (z. B. Truhen) mehr verwenden. - - - Du kannst keine NPCs mehr angreifen. - - - Du kannst jetzt NPCs angreifen. - - - Du kannst keine Spieler mehr angreifen. - - - Du kannst jetzt Spieler angreifen. - - - Du kannst keine Tiere mehr angreifen. - - - Du kannst jetzt Tiere angreifen. - - - Du bist jetzt ein Moderator. - - - Du bist kein Moderator mehr. - - - Du kannst jetzt fliegen. - - - Du kannst nicht mehr fliegen. - - - Du wirst keine Erschöpfung mehr spüren. - - - Du wirst jetzt wieder Erschöpfung spüren. - - - Du bist jetzt unsichtbar. - - - Du bist nicht mehr unsichtbar. - - - Du bist jetzt unverwundbar. - - - Du bist nicht mehr unverwundbar. - - - %d MSP - - - Enderdrache - - - %s hat das Ende betreten. - - - %s hat das Ende verlassen. - - - {*C3*}Ich sehe das spielende Wesen, das du meinst.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Ja. Sei auf der Hut. Es hat eine höhere Stufe erreicht. Es kann unsere Gedanken lesen.{*EF*}{*B*}{*B*} -{*C2*}Das ist gleichgültig. Es denkt, wir gehören zum Spiel.{*EF*}{*B*}{*B*} -{*C3*}Ich mag dieses spielende Wesen. Es hat gut gespielt. Es hat nicht aufgegeben.{*EF*}{*B*}{*B*} -{*C2*}Es liest unsere Gedanken, als wären sie Worte auf einem Bildschirm.{*EF*}{*B*}{*B*} -{*C3*}So stellt es sich vielerlei Dinge vor, wenn es sich tief im Traum eines Spiels befindet.{*EF*}{*B*}{*B*} -{*C2*}Worte sind eine wunderbare Schnittstelle. Äußerst flexibel. Und weniger 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*} - - - {*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*} - - - {*C2*}Manchmal nannte es sie „Planeten“ und „Sterne“.{*EF*}{*B*}{*B*} -{*C2*}Manchmal glaubte es, es befände sich in einem Universum, das aus Energie bestand, welche wiederum aus Aus- und An-Zuständen bestand, aus Nullen und Einsen; Programmzeilen. Manchmal glaubte es, dass es ein Spiel spielte. Manchmal glaubte es, dass es Worte auf einem Bildschirm las.{*EF*}{*B*}{*B*} -{*C3*}Du bist das spielende Wesen, das die Worte liest ...{*EF*}{*B*}{*B*} -{*C2*}Pssst ... Manchmal las das spielende Wesen Programmzeilen auf einem Bildschirm. Entschlüsselte sie, um Worte zu erhalten; entschlüsselte die Worte, um deren Bedeutung zu erfahren; entschlüsselte die Bedeutung, und gewann daraus Gefühle, Emotionen, Theorien, Ideen. Und das spielende Wesen begann schneller zu atmen, tiefer zu atmen, und es erkannte, dass es am Leben war. Jene tausend Tode waren nicht reell gewesen, das spielende Wesen lebte.{*EF*}{*B*}{*B*} -{*C3*}Du. Du. Du lebst.{*EF*}{*B*}{*B*} -{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Sonnenlicht, das durch die raschelnden Blätter der sommerlichen Bäume drang, zu ihm gesprochen.{*EF*}{*B*}{*B*} -{*C3*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Licht, welches aus dem klaren Nachthimmel des Winters herabschien, zu ihm gesprochen, wo ein Lichtfleck, den das spielende Wesen aus dem Augenwinkel erhaschte, ein Stern sein könnte, dessen Masse die der Sonne um ein Millionenfaches übertrifft und der seine Planeten zu Plasma zerkocht, um für einen kurzen Moment vom spielenden Wesen wahrgenommen zu werden, das am anderen Ende des Universums nach Hause geht, plötzlich Essen riecht, kurz vor der vertrauten Tür, hinter der es bald wieder träumen wird.{*EF*}{*B*}{*B*} -{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch die Nullen und Einsen, durch die Elektrizität der Welt, durch die über den Bildschirm huschenden Worte am Ende eines Traumes zu ihm gesprochen.{*EF*}{*B*}{*B*} -{*C3*}Und das Universum sprach: Ich liebe dich.{*EF*}{*B*}{*B*} -{*C2*}Und das Universum sprach: Du hast gut gespielt.{*EF*}{*B*}{*B*} -{*C3*}Und das Universum sprach: Alles, was du brauchst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} -{*C2*}Und das Universum sprach: Du bist stärker, als du denkst.{*EF*}{*B*}{*B*} -{*C3*}Und das Universum sprach: Du bist das Tageslicht.{*EF*}{*B*}{*B*} -{*C2*}Und das Universum sprach: Du bist die Nacht.{*EF*}{*B*}{*B*} -{*C3*}Und das Universum sprach: Die Finsternis, gegen die du kämpfst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} -{*C2*}Und das Universum sprach: Das Licht, nach dem du trachtest, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} -{*C3*}Und das Universum sprach: Du bist nicht allein.{*EF*}{*B*}{*B*} -{*C2*}Und das Universum sprach: Du existierst nicht getrennt von allem anderen.{*EF*}{*B*}{*B*} -{*C3*}Und das Universum sprach: Du bist das Universum, das von sich selbst kostet, das mit sich selbst spricht und seinen eigenen Code liest.{*EF*}{*B*}{*B*} -{*C2*}Und das Universum sprach: Ich liebe dich, denn du bist die Liebe.{*EF*}{*B*}{*B*} -{*C3*}Und das Spiel war vorbei und das spielende Wesen erwachte aus dem Traum. Und das spielende Wesen begann einen neuen Traum. Und das spielende Wesen träumte wieder, träumte besser. Und das spielende Wesen war das Universum. Und das spielende Wesen war Liebe.{*EF*}{*B*}{*B*} -{*C3*}Du bist das spielende Wesen.{*EF*}{*B*}{*B*} -{*C2*}Wach auf.{*EF*} - - - Nether zurücksetzen - - - Möchtest du wirklich den Nether in diesem Spielstand auf den ursprünglichen Zustand zurücksetzen? Alles, was du im Nether gebaut hast, geht verloren! - - - Nether zurücksetzen - - - Nether nicht zurücksetzen - - - Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. - - - Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. - - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Pilzkühen wurde erreicht. - - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Wölfen in einer Welt wurde erreicht. - - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Hühnern in einer Welt wurde erreicht. - - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. - - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Feinden in einer Welt wurde erreicht. - - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Dorfbewohnern in einer Welt wurde erreicht. - - - Die Höchstanzahl von Gemälden/Gegenstandsrahmen in einer Welt wurde erreicht. - - - Im friedlichen Modus kannst du keine Feinde erscheinen lassen. - - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühe und Katzen wurde erreicht. - - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Wölfe wurde erreicht. - - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Hühner wurde erreicht. - - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pilzkühe wurde erreicht. - - - Die Höchstanzahl von Booten in einer Welt wurde erreicht. - - - Die Höchstanzahl von NPC-Köpfen in einer Welt wurde erreicht. - - - Sicht umkehren - - - Linkshänder - - - Gestorben! - - - Wieder erscheinen - - - Inhalte zum Herunterladen - - - Skin ändern - - - So wird gespielt - - - Steuerung - - - Einstellungen - - - Mitwirkende - - - Inhalte neu installieren - - - Debug-Einstellungen - - - Feuer breitet sich aus - - - TNT explodiert - - - Spieler gegen Spieler - - - Spielern vertrauen - - - Hostprivilegien - - - Strukturen erzeugen - - - Superflache Welt - - - Bonustruhe - - - Weltoptionen - - - Kann bauen und abbauen - - - Kann Türen und Schalter verwenden - - - Kann Container öffnen - - - Kann Spieler angreifen - - - Kann Tiere angreifen - - - Moderator - - - Spieler ausschließen - - - Kann fliegen - - - Erschöpfung deaktivieren - - - Unsichtbar - - - Hostoptionen - - - Spieler/Einladen - - - Online-Spiel - - - Nur mit Einladung - - - Weitere Optionen - - - Laden - - - Neue Welt - - - Weltname - - - Seed für den Weltengenerator - - - Freilassen für zufälligen Seed - - - Spieler - - - Spiel beitreten - - - Spiel starten - - - Keine Spiele gefunden - - - Spielen - - - Bestenlisten - - - Hilfe und Optionen - - - Vollständiges Spiel freischalten - - - Spiel fortsetzen - - - Spiel speichern - - - Schwierigkeit: - - - Spieltyp: - - - Strukturen: - - - Leveltyp: - - - PvP: - - - Spielern vertrauen: - - - TNT: - - - Feuer breitet sich aus: - - - Design neu installieren - - - Spielerbild 1 neu installieren - - - Spielerbild 2 neu installieren - - - Avatar-Gegenstand 1 neu installieren - - - Avatar-Gegenstand 2 neu installieren - - - Avatar-Gegenstand 3 neu installieren - - - Optionen - - - Audio - - - Steuerung - - - Grafik - - - Benutzeroberfläche - - - Standardeinstellungen - - - Kamerabewegung ansehen - - - Tipps - - - Spiel-QuickInfos - - - 2 Spieler, geteilter Bildschirm - - - Fertig - - - Schildnachricht ändern: - - - Gib erklärende Texte zu deinem Screenshot ein. - - - Überschrift - - - Screenshot aus dem Spiel - - - Schildnachricht ändern: - - - Die klassischen Texturen, Symbole und Benutzeroberfläche aus Minecraft! - - - Alle Mash-up-Welten anzeigen - - - Keine Effekte - - - Geschwindigkeit - - - Langsamkeit - - - Grabeile - - - Grabmüdigkeit - - - Stärke - - - Schwäche - - - Sofortgesundheit - - - Sofortschaden - - - Sprungverstärkung - - - Verwirrtheit - - - Regeneration - - - Widerstand - - - Feuerwiderstand - - - Wasseratmung - - - Unsichtbarkeit - - - Blindheit - - - Nachtsicht - - - 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 + + der Langsamkeit + + + der Grabeile + + + der Schwäche + + + der Stärke + + + Feuerwiderstand + + + Sättigung + des Widerstands - - des Feuerwiderstands + + der Sprungverstärkung - - der Wasseratmung + + Austrockung - - der Unsichtbarkeit + + Gesundheitsverstärkung - - der Blindheit - - - der Nachtsicht - - - des Hungers - - - des Gifts + + Absorption @@ -5031,9 +5894,78 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? III + + der Unsichtbarkeit + IV + + der Wasseratmung + + + des Feuerwiderstands + + + der Nachtsicht + + + des Gifts + + + des Hungers + + + der Absorption + + + der Sättigung + + + der Gesundheitsverstärkung + + + der Blindheit + + + des Zerfalls + + + Schlichter + + + Dünner + + + Diffuser + + + Farbloser + + + Milchiger + + + Seltsamer + + + Gebutterter + + + Glatter + + + Gepfuschter + + + Flacher + + + Bauchiger + + + Fader + Wurf- @@ -5043,50 +5975,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Uninteressanter - - Fader + + Schneidiger - - Farbloser + + Belebender - - Milchiger - - - Diffuser - - - Schlichter - - - Dünner - - - Seltsamer - - - Flacher - - - Bauchiger - - - Gepfuschter - - - Gebutterter - - - Glatter - - - Sanfter - - - Gefälliger - - - Dicker + + Charmanter Eleganter @@ -5094,149 +5990,152 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Aparter - - Charmanter - - - Schneidiger - - - Veredelter - - - Belebender - Prickelnder - - Potenter - - - Fauler - - - Geruchloser - Kräftiger Harscher + + Geruchloser + + + Potenter + + + Fauler + + + Sanfter + + + Veredelter + + + Dicker + + + Gefälliger + + + Stellt mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern wieder her. + + + Verschlechtert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + + + 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. + 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. + + + Dient als Basis für alle Tränke. Wird in einem Braustand verwendet, um Tränke zu brauen. + Ekliger Stinkender - - Dient als Basis für alle Tränke. Wird in einem Braustand verwendet, um Tränke zu brauen. - - - Hat keinen Effekt. Kann in einem Braustand verwendet werden, um durch Zugabe weiterer Zutaten Tränke zu brauen. - - - Vergrößert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. - - - Verkleinert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. - - - Vergrößert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. - - - Verringert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. - - - Verbessert sofort die Gesundheit betroffener Spieler, Tiere und Monster. - - - Verschlechtert sofort die Gesundheit betroffener Spieler, Tiere und Monster. - - - Stellt mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern wieder her. - - - Macht die betroffenen Spieler, Tiere und Monster immun gegen Schaden durch Feuer, Lava und Fernangriffe von Lohen. - - - Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. + + Bann Schärfe - - Bann + + Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. - - Nemesis der Gliederfüßer + + Angriffsschaden Rückstoß - - Verbrennung + + Nemesis der Gliederfüßer - - Schutz + + Geschwindigkeit - - Feuerschutz + + Zombie-Verstärkungen - - Federfall + + Pferdesprungstärke - - Explosionsschutz + + Bei Anwendung: - - Schusssicher + + Rückstoßwiderstand - - Atmung + + NPC-Verfolgungsreichweite - - Wasseraffinität - - - Effizienz + + Max. Gesundheit Behutsamkeit - - Haltbarkeit + + Effizienz - - Plünderung + + Wasseraffinität Glück - - Stärke + + Plünderung - - Feuer + + Haltbarkeit - - Schlag + + Feuerschutz - - Unendlichkeit + + Schutz - - I + + Verbrennung - - II + + Federfall - - III + + Atmung + + + Schusssicher + + + Explosionsschutz IV @@ -5247,23 +6146,29 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? VI + + Schlag + VII - - VIII + + III - - IX + + Feuer - - X + + Stärke - - Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Smaragde zu erhalten. + + Unendlichkeit - - Ä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. + + II + + + I Wird aktiviert, wenn sich ein Objekt durch einen angeschlossenen Stolperdraht bewegt. @@ -5274,44 +6179,59 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Ein kompakter Smaragdspeicher. - - Eine Mauer aus Pflasterstein. + + Ä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. - - Damit können Waffen, Werkzeuge und Rüstungen repariert werden. + + IX - - Geschmolzen in einem Ofen, um Netherquarz herzustellen. + + VIII - - Wird als Dekoration verwendet. + + Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Smaragde zu erhalten. - - Kann mit Dorfbewohnern gehandelt werden. - - - Wird als Dekoration verwendet. Blumen, Setzlinge, Kakteen und Pilze können hineingepflanzt werden. + + X Regeneriert 2{*ICON_SHANK_01*} und kann zu einer goldenen Karotte verarbeitet werden. Kann auf Ackerland gepflanzt werden. + + Wird als Dekoration verwendet. Blumen, Setzlinge, Kakteen und Pilze können hineingepflanzt werden. + + + Eine Mauer aus Pflasterstein. + Regeneriert 0,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Kann auf Ackerland gepflanzt werden. - - Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. + + Geschmolzen in einem Ofen, um Netherquarz herzustellen. + + + Damit können Waffen, Werkzeuge und Rüstungen repariert werden. + + + Kann mit Dorfbewohnern gehandelt werden. + + + Wird als Dekoration verwendet. + + + Regeneriert 4{*ICON_SHANK_01*}. - 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. + Regeneriert 1{*ICON_SHANK_01*}. Der Verzehr kann dich vergiften. Wird dazu verwendet, ein gesatteltes Schwein beim Reiten zu lenken. - - Regeneriert 4{*ICON_SHANK_01*}. + + Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. + + + Regeneriert 3{*ICON_SHANK_01*}. Aus einer Karotte und Goldklumpen hergestellt. Wird mit einem Amboss verwendet, um Waffen, Werkzeuge und Rüstungen zu verzaubern. @@ -5319,6 +6239,15 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? 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 + + Kürbiskuchen - - Kartoffel - - - 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,71 +6386,76 @@ 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. + + + + Halsband färben + + + + Um einen Gegenstand zu bearbeiten, lege ihn in den ersten Eingabeplatz. @@ -5540,9 +6465,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Amboss-Oberfläche weißt. - + - Um einen Gegenstand zu bearbeiten, lege ihn in den ersten Eingabeplatz. + Alternativ kann ein zweiter, identischer Gegenstand in den zweiten Platz gelegt werden, um die beiden Gegenstände zu kombinieren. @@ -5550,24 +6475,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? 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. - + - Alternativ kann ein zweiter, identischer Gegenstand in den zweiten Platz gelegt werden, um die beiden Gegenstände zu kombinieren. + 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. Um Gegenstände auf dem Amboss zu verzaubern, lege ein Zauberbuch in den zweiten Eingabeplatz. - - - - - 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. @@ -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. @@ -5627,24 +6542,34 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Handels-Oberfläche weißt. - + - Alle Geschäfte, die ein Dorfbewohner im Moment anbietet, werden am oberen Rand angezeigt. - + 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. - + - Anzahl und Art der Gegenstände, die du dem Dorfbewohner gibst, werden in den beiden Feldern links angezeigt. + Alle Geschäfte, die ein Dorfbewohner im Moment anbietet, werden am oberen Rand angezeigt. Die Gesamtzahl der erforderlichen Gegenstände für ein Geschäft findest du in den beiden Boxen links. + + + + + Anzahl und Art der Gegenstände, die du dem Dorfbewohner gibst, werden in den beiden Feldern links angezeigt. + + + + + 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,37 +1,123 @@  - + + Möchtest du dich bei "PSN" anmelden? + + + 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. + + + SELECT + + + 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. + + + PlayStation®Vita-System + + + 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. + + + Ad-hoc-Netzwerk + + + Netzwerkmodus ändern + + + Netzwerkmodus wählen + + + Online-IDs, geteilter Bildschirm + + + Trophäen + + + 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. + + + Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Trophäen und Bestenlisten-Aktualisierungen. + + + Online-IDs: + + + 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. + + + Patch 1.04 (Titel-Update 14) + + + Online-IDs im Spiel + + + Schau mal, was ich in Minecraft: PlayStation®Vita Edition erschaffen habe! + + + Download fehlgeschlagen. Bitte versuche es später erneut. + + + Beitritt zum Spiel aufgrund eines eingeschränkten NAT-Typs fehlgeschlagen. Bitte überprüfe deine Netzwerkeinstellungen. + + + Upload fehlgeschlagen. Bitte versuche es später erneut. + + + Download abgeschlossen! + + + +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. + + + + Speicherung nicht vollständig. + + + 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. + + + Hochladen abgebrochen + + + Du hast das Hochladen dieses Spielstands in den Spielstandtransferspeicher abgebrochen. + + + Spielstand für PS3™/PS4™ hochladen + + + Daten werden hochgeladen: %d %% + + + "PSN" + + + Spielstand für PS3™ herunterladen + + + Daten werden heruntergeladen: %d %% + + + Speichert ... + + + Upload abgeschlossen! + + + Möchtest du wirklich diesen Spielstand hochladen und damit den derzeit im Spielstandtransferspeicher befindlichen Spielstand überschreiben? + + + Daten werden konvertiert + + NOT USED - - Mit dem Touchscreen des PlayStation®Vita-Systems kannst du durch Menüs navigieren! - - - minecraftforum hat einen eigenen Bereich zur PlayStation®Vita Edition. - - - Die neuesten Informationen von @4JStudios und @Kappische zu diesem Spiel findest du auf Twitter! - - - Schau einem Enderman nie in die Augen! - - - Wir glauben, dass 4J Studios Herobrine aus dem PlayStation®Vita-System entfernt haben, aber wir sind uns nicht ganz sicher. - - - Minecraft: PlayStation®Vita Edition hat jede Menge Rekorde gebrochen! - - - {*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. - - - {*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. + + NOT USED {*T3*}SO WIRD GESPIELT: KREATIVMODUS{*ETW*}{*B*}{*B*} @@ -45,32 +131,80 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um dich nach oben zu bew 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. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Freunde einladen - 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? Diese Welt wurde früher im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. Möchtest du wirklich fortfahren? - - Diese Welt wurde im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. + + "NOT USED" - - 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? + + Freunde einladen + + + minecraftforum hat einen eigenen Bereich zur PlayStation®Vita Edition. + + + Die neuesten Informationen von @4JStudios und @Kappische zu diesem Spiel findest du auf Twitter! + + + NOT USED + + + Mit dem Touchscreen des PlayStation®Vita-Systems kannst du durch Menüs navigieren! + + + Schau einem Enderman nie in die Augen! + + + {*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. + + + {*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. + + + Wir glauben, dass 4J Studios Herobrine aus dem PlayStation®Vita-System entfernt haben, aber wir sind uns nicht ganz sicher. + + + Minecraft: PlayStation®Vita Edition hat jede Menge Rekorde gebrochen! + + + 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? + + + Minecraft: PlayStation®Vita Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden. + + + Brauen + + + Du bist zum Titelbildschirm zurückgekehrt, weil du von "PSN" abgemeldet wurdest. + + + Spielbeitritt nicht möglich: Einer oder mehrere Spieler dürfen aufgrund einer Chat-Beschränkung ihres Sony Entertainment Network-Kontos nicht online spielen. + + + 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. + + + 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. + + + 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. + + + Du kannst dieser Spielsitzung nicht beitreten, weil Online-Funktionen aufgrund von Chat-Beschränkungen deines Sony Entertainment Network-Kontos deaktiviert sind. Die Verbindung zu "PSN" wurde unterbrochen. Zurück zum Hauptmenü. @@ -78,11 +212,23 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um dich nach oben zu bew Die Verbindung zu "PSN" wurde unterbrochen. + + Diese Welt wurde im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. + + + 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? + 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? + + Gastspieler können das vollständige Spiel nicht freischalten. Melde dich mit einem Sony Entertainment Network-Konto an. + + + Online-ID + 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. @@ -92,149 +238,7 @@ Möchtest du jetzt das vollständige Spiel freischalten? 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? - - Gastspieler können das vollständige Spiel nicht freischalten. Melde dich mit einem Sony Entertainment Network-Konto an. - - - Online-ID - - - Brauen - - - Du bist zum Titelbildschirm zurückgekehrt, weil du von "PSN" abgemeldet wurdest. - - - 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? - - - Minecraft: PlayStation®Vita Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden. - - - Spielbeitritt nicht möglich: Einer oder mehrere Spieler dürfen aufgrund einer Chat-Beschränkung ihres Sony Entertainment Network-Kontos nicht online spielen. - - - 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. - - - Du kannst dieser Spielsitzung nicht beitreten, weil Online-Funktionen aufgrund von Chat-Beschränkungen deines Sony Entertainment Network-Kontos deaktiviert sind. - - - 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. - - - 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. - - - 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. - - - Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Trophäen und Bestenlisten-Aktualisierungen. - - - Online-IDs, geteilter Bildschirm - - - Trophäen - - - Online-IDs: - - - Online-IDs im Spiel - - - Schau mal, was ich in Minecraft: PlayStation®Vita Edition erschaffen habe! - - - 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. - - - Patch 1.04 (Titel-Update 14) - - - SELECT - - - 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. - - - Möchtest du dich bei "PSN" anmelden? - - - 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. - - - PlayStation®Vita-System - - - Netzwerkmodus ändern - - - Netzwerkmodus wählen - - - 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. - - - Ad-hoc-Netzwerk - - - "PSN" - - - PlayStation®3-System herunterladen - - - Spielstand für PlayStation®3/PlayStation®4-System hochladen - - - Hochladen abgebrochen - - - Du hast das Hochladen dieses Spielstands in den Spielstandtransferspeicher abgebrochen. - - - Daten werden hochgeladen: %d %% - - - Daten werden heruntergeladen: %d %% - - - Möchtest du wirklich diesen Spielstand hochladen und damit den derzeit im Spielstandtransferspeicher befindlichen Spielstand überschreiben? - - - Daten werden konvertiert - - - Speichert ... - - - Upload abgeschlossen! - - - Upload fehlgeschlagen. Bitte versuche es später erneut. - - - Download abgeschlossen! - - - Download fehlgeschlagen. Bitte versuche es später erneut. - - - Beitritt zum Spiel aufgrund eines eingeschränkten NAT-Typs fehlgeschlagen. Bitte überprüfe deine Netzwerkeinstellungen. - - - - 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. - - - Speicherung nicht vollständig. - - - 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. + + 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 @@  - - Ο χώρος αποθήκευσης του συστήματός σας δεν διαθέτει επαρκή ελεύθερο χώρο για τη δημιουργία αποθήκευσης παιχνιδιού. - - - Επιστρέψατε στην οθόνη τίτλων, επειδή αποσυνδεθήκατε από το "PSN" - - - Ο αγώνας τελείωσε, επειδή αποσυνδεθήκατε από το "PSN" - - - - Αυτήν τη στιγμή δεν είστε συνδεδεμένοι. - - - - Αυτό το παιχνίδι διαθέτει ορισμένες λειτουργίες για τις οποίες απαιτείται να είστε συνδεδεμένοι στο "PSN", όμως προς το παρόν βρίσκεστε εκτός σύνδεσης. - - - Το Δίκτυο Ad Hoc είναι εκτός σύνδεσης. - - - Το παιχνίδι έχει ορισμένες λειτουργίες που απαιτούν σύνδεση δικτύου Ad Hoc, αλλά αυτήν τη στιγμή είστε εκτός σύνδεσης. - - - Για αυτήν τη λειτουργία απαιτείται σύνδεση στο "PSN". - - - - Σύνδεση στο "PSN" - - - Συνδεδεμένο στο Δίκτυο Ad Hoc - - - Πρόβλημα με τα Τρόπαια - - - Προέκυψε πρόβλημα με την πρόσβαση στο λογαριασμό σας στο Sony Entertainment Network. Δεν είναι δυνατή η απονομή του τροπαίου σας προς το παρόν. + + Η αποθήκευση των ρυθμίσεων στο λογαριασμό σας στο Sony Entertainment Network απέτυχε. Πρόβλημα με το λογαριασμό στο Sony Entertainment Network - - Η αποθήκευση των ρυθμίσεων στο λογαριασμό σας στο Sony Entertainment Network απέτυχε. + + Προέκυψε πρόβλημα με την πρόσβαση στο λογαριασμό σας στο Sony Entertainment Network. Δεν είναι δυνατή η απονομή του τροπαίου σας προς το παρόν. Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®3 Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα τρόπαιο! Ξεκλειδώστε το πλήρες παιχνίδι, για να απολαύσετε το Minecraft: PlayStation®3 Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + Συνδεδεμένο στο Δίκτυο Ad Hoc + + + Το παιχνίδι έχει ορισμένες λειτουργίες που απαιτούν σύνδεση δικτύου Ad Hoc, αλλά αυτήν τη στιγμή είστε εκτός σύνδεσης. + + + Το Δίκτυο Ad Hoc είναι εκτός σύνδεσης. + + + Πρόβλημα με τα Τρόπαια + + + Ο αγώνας τελείωσε, επειδή αποσυνδεθήκατε από το "PSN" + + + + Επιστρέψατε στην οθόνη τίτλων, επειδή αποσυνδεθήκατε από το "PSN" + + + Ο χώρος αποθήκευσης του συστήματός σας δεν διαθέτει επαρκή ελεύθερο χώρο για τη δημιουργία αποθήκευσης παιχνιδιού. + + + Αυτήν τη στιγμή δεν είστε συνδεδεμένοι. + + + + Σύνδεση στο "PSN" + + + Για αυτήν τη λειτουργία απαιτείται σύνδεση στο "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,3300 +1,744 @@  - - Υπάρχει διαθέσιμο νέο περιεχόμενο για λήψη! Για να πραγματοποιήσετε τη λήψη πατήστε το κουμπί 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() ήταν τέλειο! - - - Πάντα να υποθέτετε ότι οι φήμες είναι ψεύτικες, παρά ότι είναι αληθινές! - - - {*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*} ενώ ο δείκτης βρίσκεται πάνω από το αντικείμενο που θέλετε να βάψετε. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΣΕΝΤΟΥΚΙ{*ETW*}{*B*}{*B*} -Αφού κατασκευάσετε ένα σεντούκι, μπορείτε να το τοποθετήσετε στον κόσμο και στη συνέχεια να το χρησιμοποιήσετε με{*CONTROLLER_ACTION_USE*} για να αποθηκεύσετε αντικείμενα από το απόθεμά σας.{*B*}{*B*} -Χρησιμοποιήστε το δείκτη για να μετακινήσετε αντικείμενα από το απόθεμα στο σεντούκι και αντίστροφα.{*B*}{*B*} -Τα αντικείμενα που βρίσκονται στο σεντούκι θα αποθηκευτούν εκεί για να τα μεταφέρετε ξανά πίσω στο απόθεμά σας αργότερα. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΜΕΓΑΛΟ ΣΕΝΤΟΥΚΙ{*ETW*}{*B*}{*B*} -Εάν τοποθετήσετε δύο σεντούκια το ένα δίπλα στο άλλο θα συνδυαστούν για να σχηματίσουν ένα Μεγάλο Σεντούκι. Αυτό μπορεί να αποθηκεύσει ακόμη περισσότερα αντικείμενα.{*B*}{*B*} -Χρησιμοποιείται όπως ένα κανονικό σεντούκι. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΚΑΤΑΣΚΕΥΗ{*ETW*}{*B*}{*B*} -Στο περιβάλλον χρήστη Κατασκευής, μπορείτε να συνδυάσετε αντικείμενα από το απόθεμά σας για να δημιουργήσετε νέους τύπους αντικειμένων. Χρησιμοποιήστε το{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη κατασκευής.{*B*}{*B*} -Πραγματοποιήστε κύλιση στις καρτέλες στην επάνω πλευρά χρησιμοποιώντας το{*CONTROLLER_VK_LB*} και το{*CONTROLLER_VK_RB*} για να επιλέξετε τον τύπο αντικειμένου που θέλετε να κατασκευάσετε και στη συνέχεια, χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να επιλέξετε το αντικείμενο που θέλετε να κατασκευάσετε.{*B*}{*B*} -Η περιοχή κατασκευής εμφανίζει τα αντικείμενα που απαιτούνται για την κατασκευή του νέου αντικειμένου. Πατήστε{*CONTROLLER_VK_A*} για να κατασκευάσετε το αντικείμενο και να το τοποθετήσετε στο απόθεμά σας. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΤΡΑΠΕΖΙ ΚΑΤΑΣΚΕΥΗΣ{*ETW*}{*B*}{*B*} -Μπορείτε να κατασκευάσετε μεγαλύτερα αντικείμενα, χρησιμοποιώντας ένα Τραπέζι Κατασκευής.{*B*}{*B*} -Τοποθετήστε το τραπέζι στον κόσμο σας και πατήστε{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε.{*B*}{*B*} -Η κατασκευή σε τραπέζι λειτουργεί όπως και η βασική κατασκευή, αλλά έχετε μεγαλύτερη περιοχή κατασκευής και μεγαλύτερη ποικιλία αντικειμένων που μπορείτε να κατασκευάσετε. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΦΟΥΡΝΟΣ{*ETW*}{*B*}{*B*} -Ο φούρνος επιτρέπει την αλλαγή αντικειμένων φλογίζοντάς τα. Για παράδειγμα, μπορείτε να μετατρέψετε κομμάτια σιδήρου σε ράβδους σιδήρου στο φούρνο.{*B*}{*B*}< -Τοποθετήστε το φούρνο στον κόσμο σας και πατήστε{*CONTROLLER_ACTION_USE*} για να τον χρησιμοποιήσετε.{*B*}{*B*} -Πρέπει να βάλετε καύσιμο στο κάτω μέρος του φούρνου και στη συνέχεια, το αντικείμενο που θέλετε να φλογίσετε στο επάνω μέρος. Ο φούρνος τότε θα ανάψει και θα ξεκινήσει να λειτουργεί.{*B*}{*B*} -Όταν τα αντικείμενά σας φλογιστούν, μπορείτε να τα μετακινήσετε από την εξωτερική περιοχή στο απόθεμά σας.{*B*}{*B*} -Εάν το αντικείμενο πάνω από το οποίο βρίσκεστε είναι συστατικό ή καύσιμο για το φούρνο, θα εμφανιστούν επεξηγήσεις που θα επιτρέπουν τη γρήγορη μετακίνηση του στο φούρνο. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΔΙΑΝΟΜΕΑΣ{*ETW*}{*B*}{*B*} -Ο Διανομέας χρησιμοποιείτε για την εξαγωγή αντικειμένων. Θα πρέπει να τοποθετήσετε ένα διακόπτη, για παράδειγμα ένα μοχλό, δίπλα στο διανομέα για να τον ενεργοποιήσετε.{*B*}{*B*} -Για να γεμίσετε το διανομέα με αντικείμενα πιέστε{*CONTROLLER_ACTION_USE*} και στη συνέχεια μετακινήστε τα αντικείμενα που θέλετε από το απόθεμά σας στο διανομέα.{*B*}{*B*} -Τώρα όταν θα χρησιμοποιήσετε το διακόπτη, ο διανομέας θα εξάγει ένα αντικείμενο. - - - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΠΑΡΑΣΚΕΥΗ ΦΙΛΤΡΩΝ{*ETW*}{*B*}{*B*} -Η παρασκευή φίλτρων απαιτεί μια Βάση Παρασκευής, η οποία μπορεί να δημιουργηθεί σε ένα τραπέζι κατασκευής. Κάθε φίλτρο χρειάζεται ένα μπουκάλι νερό, το οποίο δημιουργείται γεμίζοντας ένα Γυάλινο Μπουκάλι με νερό από ένα Καζάνι ή μια πηγή με νερό.{*B*} -Η Βάση Παρασκευής φίλτρων έχει τρεις υποδοχές για μπουκάλια, έτσι μπορείτε να παρασκευάσετε τρία φίλτρα ταυτόχρονα. Ένα συστατικό μπορεί να χρησιμοποιηθεί και για τα τρία μπουκάλια, έτσι να παρασκευάζετε πάντα τρία φίλτρα ταυτόχρονα για να χρησιμοποιείται τους πόρους σας με τον καλύτερο τρόπο.{*B*} -Εάν βάλετε ένα συστατικό φίλτρου στην επάνω θέση της Βάσης Παρασκευής, θα δημιουργηθεί ένα βασικό φίλτρο μετά από σύντομο χρονικό διάστημα. Αυτό δεν έχει κάποια επίδραση από μόνο του, αλλά εάν παρασκευάσετε ένα άλλο συστατικό με αυτό το βασικό φίλτρο θα δημιουργηθεί ένα φίλτρο με επίδραση.{*B*} -Μόλις παρασκευάσετε αυτό το φίλτρο, μπορείτε να προσθέσετε ένα τρίτο συστατικό έτσι ώστε η επίδραση να διαρκεί περισσότερο (με χρήση Σκόνης Κοκκινόπετρας), να είναι πιο έντονη (με χρήση Σκόνης Λαμψόπετρας) ή να μετατραπεί σε βλαβερό φίλτρο (με χρήση Ζυμωμένου Ματιού Αράχνης).{*B*} -Μπορείτε επίσης να προσθέσετε πυρίτιδα σε οποιοδήποτε φίλτρο για να το μετατρέψετε σε Φίλτρο Εκτόξευσης, το οποίο μπορείτε να πετάξετε στη συνέχεια. Το Φίλτρο Εκτόξευσης που θα πετάξετε θα εφαρμόσει την επίδραση του φίλτρου πάνω στην περιοχή στην οποία θα προσγειωθεί.{*B*} - -Τα βασικά συστατικά για φίλτρα είναι τα εξής :-{*B*}{*B*} -* {*T2*}Φυτό 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*} -Υπάρχει ένα όριο στον αριθμό των ζώων που μπορούν να υπάρχουν σε ένα κόσμο και έτσι ίσως διαπιστώσετε ότι τα ζώα δεν θα αναπαράγονται όταν υπάρχουν πολλά από αυτά. - - - {*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*} για να επιλέξετε την επεξήγηση του Επιπέδου Απαγόρευσης. -Όταν προσπαθήσετε στο μέλλον να συμμετέχετε ξανά σε αυτό το επίπεδο, θα ειδοποιηθείτε ότι το επίπεδο βρίσκεται στη λίστα Αποκλεισμένων Επιπέδων και θα σας δοθεί η επιλογή να το αφαιρέσετε από τη λίστα και να συνεχίσετε στο επίπεδο ή να αποχωρήσετε. - - - {*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*} - Αυτή η δυνατότητα επιτρέπει στον παίκτη να μετακινεί παίκτες ή τον εαυτό του με άλλους παίκτες στον κόσμο. - - - - Επόμενη Σελίδα - - - Προηγούμενη Σελίδα - - - Βασικές Πληροφορίες - - - HUD - - - Απόθεμα - - - Σεντούκια - - - Κατασκευή - - - Φούρνος - - - Διανομέας - - - Κτηνοτροφία - - - Εκτροφή Ζώων - - + Παρασκευή Φίλτρου - - Μάγεμα - - - Πύλη 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 όταν το φορά. + + Αυτά τα δεδομένα αποθήκευσης είναι κατεστραμμένα ή έχουν υποστεί βλάβη. Θα θέλατε να τα διαγράψετε; - - Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού και να αποσυνδέσετε όλους τους παίκτες από το παιχνίδι; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν τις φορά. + + Με αποθήκευση - - Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. + + Δημιουργία Νέου Κόσμου - - Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + Εισαγάγετε ένα όνομα για τον κόσμο σας - - Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + Βάλτε τον seed για τη γενιά του κόσμου σας - - Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. + + Φόρτωση Αποθηκευμένου Κόσμου - - Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + Αρχή Εκπαιδευτικού Μαθήματος - - Δίνει στο χρήστη Πανοπλία επιπέδου 8 όταν το φορά. + + Εκπαιδευτικό Μάθημα - - Δίνει στο χρήστη Πανοπλία επιπέδου 6 όταν το φορά. + + Ονομασία του Κόσμου σας - - Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν τις φορά. + + Βλάβη Δεδομένων Αποθήκευσης - - Μια γυαλιστερή ράβδος που μπορεί να χρησιμοποιηθεί για την κατασκευή εργαλείων από αυτό το υλικό. Δημιουργείται λιώνοντας μεταλλεύματα σε φούρνο. + + OK - - Επιτρέπει την κατασκευή ράβδων, πετραδιών ή βαφών σε μετακινούμενους κύβους. Μπορεί να χρησιμοποιηθεί ως ακριβός κύβος κατασκευής ή χώρος αποθήκευσης των μεταλλευμάτων. + + Ακύρωση - - Χρησιμοποιείται για την μετάδοση ηλεκτρικού φορτίου όταν πατήσει πάνω της ένας παίκτης, ζώο ή τέρας. Οι Ξύλινες Πλάκες Πίεσης μπορούν επίσης να ενεργοποιηθούν εάν ρίξετε κάτι πάνω σε αυτές. + + Minecraft Store - - Χρησιμοποιούνται για σκάλες. + + Περιστροφή - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + Απόκρυψη - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + Απαλοιφή Όλων των Υποδοχών - - Χρησιμοποιείται για τη δημιουργία φωτός. Οι πυρσοί λιώνουν επίσης το χιόνι και τον πάγο. + + Είστε σίγουροι ότι θέλετε να εγκαταλείψετε το τρέχον παιχνίδι σας και να συμμετάσχετε στο νέο; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - Χρησιμοποιούνται ως δομικό υλικό και μπορούν να κατασκευάσουν πολλά πράγματα. Μπορούν να δημιουργηθούν από οποιαδήποτε μορφή ξύλου. + + Είστε σίγουροι ότι θέλετε να αντικαταστήσετε τυχόν προηγούμενα αποθηκευμένα δεδομένα αυτού του κόσμου με την τρέχουσα εκδοχή αυτού του κόσμου; - - Χρησιμοποιείται ως δομικό υλικό. Δεν επηρεάζεται από τη βαρύτητα όπως η κανονική Άμμος. + + Είστε σίγουροι ότι θέλετε να βγείτε από το παιχνίδι χωρίς να το αποθηκεύσετε; Θα χάσετε όλη την πρόοδο που έχετε σημειώσει σε αυτόν τον κόσμο! - - Χρησιμοποιείται ως δομικό υλικό. + + Έναρξη Παιχνιδιού - - Χρησιμοποιείται για την κατασκευή πυρσών, βέλων, σημάτων, σκαλών, φραχτών και ως λαβές για εργαλεία και όπλα. + + Έξοδος - - Χρησιμοποιείται για να προχωρά το χρόνο προς τα εμπρός οποιαδήποτε στιγμή τη νύχτα προς το ξημέρωμα εάν όλοι οι παίκτες στον κόσμο βρίσκονται στο κρεβάτι και αλλάζει το σημείο επαναφοράς του παίκτη. -Τα χρώματα του κρεβατιού είναι πάντα τα ίδια, ανεξάρτητα από τα χρώματα του μαλλιού που χρησιμοποιήθηκε. + + Αποθήκευση - - Σας επιτρέπει να δημιουργήσετε μεγαλύτερη ποικιλία αντικειμένων από την κανονική κατασκευή. + + Έξοδος Χωρίς Αποθήκευση - - Σας επιτρέπει να λιώσετε μέταλλα, να δημιουργήσετε ξυλοκάρβουνο και γυαλί και να μαγειρέψετε ψάρι και χοιρινές μπριζόλες. + + START για να παίξετε - - Χρησιμοποιείται για την αποθήκευση κύβων και αντικειμένων. Τοποθετήστε δύο σεντούκια το ένα δίπλα στο άλλο για να δημιουργήσετε ένα μεγαλύτερο σεντούκι με τη διπλή χωρητικότητα. + + Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" του Steve από το Minecraft! - - Χρησιμοποιείται ως φράγμα και δεν μπορείτε να τον υπερπηδήσετε. Υπολογίζεται με ύψος 1,5 κύβου για τους παίκτες, τα ζώα και τα τέρατα αλλά με ύψος 1 κύβου για άλλους κύβους. + + Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" ενός Creeper! - - Χρησιμοποιείται για κατακόρυφο σκαρφάλωμα. + + Ξεκλείδωμα Πλήρους Παιχνιδιού - - Ενεργοποιούνται εάν τις χρησιμοποιήσετε, τις χτυπήσετε ή χρησιμοποιήσετε κοκκινόπετρα. Λειτουργούν ως κανονικές πόρτες αλλά έχουν διάσταση 1x1 κύβους και είναι επίπεδες στο έδαφος. + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει νεότερη έκδοση του παιχνιδιού. - - Εμφανίζει κείμενο που καταχωρήσατε εσείς ή άλλοι παίκτες. + + Νέος Κόσμος - - Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. + + Το Βραβείο Ξεκλειδώθηκε! - - Χρησιμοποιείται για την πρόκληση εκρήξεων. Ενεργοποιείται μετά την τοποθέτηση, αναφλέγοντάς το με το αντικείμενο Πυρόλιθος και Χάλυβας ή με ηλεκτρικό φορτίο. + + Παίζετε τη δοκιμαστική έκδοση του παιχνιδιού, αλλά θα χρειαστείτε το πλήρες παιχνίδι για να μπορέσετε να αποθηκεύσετε την πρόοδό σας. +Θέλετε να ξεκλειδώσετε τώρα το πλήρες παιχνίδι; - - Χρησιμοποιείται για στιφάδο μανιταριών. Μπορείτε να κρατήσετε το μπολ αφού φάτε το στιφάδο. + + Φίλοι - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού, λάβας και γάλακτος. + + Η Βαθμολογία μου - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού. + + Συνολική - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά λάβας. + + Παρακαλώ περιμένετε - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά γάλακτος. + + Δεν βρέθηκαν αποτελέσματα - - Χρησιμοποιείται για τη δημιουργία φωτιάς, την ανάφλεξη 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*}. Δημιουργείται από το ψήσιμο ωμού μοσχαρίσιου κρέατος σε φούρνο. + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν σοβαρές βλάβες στον παίκτη. Προσέξτε τα Creepers, γιατί δύσκολα θα «ξεχάσουν» την εκρηκτική επίθεση, ακόμα και αφού απομακρυνθείτε! - - Αναπληρώνει 1,5{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. + + Θέματα - - Αναπληρώνει 4{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο χοιρινής μπριζόλας σε φούρνο. + + Πακέτα Skin - - Αναπληρώνει 1{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. Μπορείτε να το δώσετε σε έναν Οσελότο για να τον δαμάσετε. + + Να επιτρέπονται οι φίλοι φίλων - - Αναπληρώνει 2,5{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο ωμού ψαριού σε φούρνο. + + Αποβολή παίκτη - - Αναπληρώνει 2{*ICON_SHANK_01*} και μπορεί να χρησιμοποιηθεί για την κατασκευή ενός χρυσού μήλου. + + Είστε σίγουροι ότι θέλετε να αποβάλετε αυτόν τον παίκτη από το παιχνίδι; Δεν θα μπορέσει να συμμετάσχει ξανά έως ότου κάνετε επανεκκίνηση του κόσμου. - - Αναπληρώνει 2{*ICON_SHANK_01*} και θεραπεύει την υγεία σας για 4 δευτερόλεπτα. Κατασκευάζεται από ένα μήλο και ψήγματα χρυσού. + + Πακέτα Εικόνων Παικτών - - Αναπληρώνει 2{*ICON_SHANK_01*}. Αν το φάτε μπορεί να δηλητηριαστείτε. + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί η πρόσβαση σε αυτό επιτρέπεται σε παίκτες που είναι φίλοι του οικοδεσπότη. - - Χρησιμοποιείται στη συνταγή του κέικ και ως συστατικό για την παρασκευή φίλτρων. + + Κατεστραμμένο Περιεχόμενο με Δυνατότητα Λήψης - - Χρησιμοποιείται για τη δημιουργία ηλεκτρικού φορτίου κατά την ενεργοποίηση ή την απενεργοποίηση. Παραμένει σε κατάσταση ενεργοποίησης ή απενεργοποίησης μέχρι να πατηθεί ξανά. + + Αυτό το περιεχόμενο με δυνατότητα λήψης είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. - - Μεταδίδει συνεχώς ηλεκτρικό φορτίο ή μπορεί να χρησιμοποιηθεί ως πομπός/δέκτης, αν συνδεθεί στο πλάι ενός κύβου. -Μπορεί επίσης να χρησιμοποιηθεί για φωτισμό χαμηλής έντασης. + + Μέρος του περιεχομένου με δυνατότητα λήψης που διαθέτετε είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. - - Χρησιμοποιείται σε κυκλώματα Κοκκινόπετρας ως αναμεταδότης, αντίσταση ή/και ως ημιαγωγός. + + Δεν Μπορείτε να Συμμετάσχετε στο Παιχνίδι - - Χρησιμοποιείται για τη μετάδοση ηλεκτρικού φορτίου όταν πατιέται. Παραμένει ενεργό για περίπου ένα δευτερόλεπτο και μετά απενεργοποιείται. + + Επιλεγμένο - - Χρήση για την αποθήκευση και την εκτόξευση αντικειμένων με τυχαία σειρά όταν φορτίζεται μέσω Κοκκινόπετρας. + + Επιλεγμένη skin: - - Παίζει μια νότα όταν ενεργοποιείται. Χτυπήστε το για να αλλάξετε τον τόνο της νότας. Το μουσικό όργανο αλλάζει ανάλογα με τον τύπο κύβου στον οποίο θα τοποθετηθεί. + + Απόκτηση Πλήρους Έκδοσης - - Χρησιμοποιείται για την οδήγηση βαγονιών ορυχείου. + + Ξεκλείδωμα Πακέτου με Υφές - - Όταν τροφοδοτείται με ρεύμα, επιταχύνει τα βαγόνια που περνούν από επάνω του. Όταν δεν τροφοδοτείται με ρεύμα, φρενάρει τα βαγόνια που περνούν από επάνω του. + + Για να χρησιμοποιήσετε αυτό το πακέτο με υφές στον κόσμο σας, πρέπει να το ξεκλειδώσετε. +Θέλετε να το ξεκλειδώσετε τώρα; - - Λειτουργεί σαν Πλάκα Πίεσης (μεταδίδει σήμα Κοκκινόπετρας όταν τροφοδοτείται με ρεύμα), αλλά μπορεί να ενεργοποιηθεί μόνο από ένα βαγόνι ορυχείου. + + Δοκιμαστικό Πακέτο με Υφές - - Χρησιμοποιείται για τη μετακίνησή σας ή για τη μετακίνηση ενός ζώου ή τέρατος σε ράγες. + + Seed - - Χρησιμοποιείται για τη μεταφορά αγαθών σε ράγες. + + Ξεκλείδωμα Πακέτου Skin - - Κινείται σε ράγες και μπορεί να δώσει ώθηση σε άλλα βαγόνια, αν τροφοδοτηθεί με κάρβουνο. + + Για να χρησιμοποιήσετε την εμφάνιση που έχετε επιλέξει, πρέπει να ξεκλειδώσετε αυτό το πακέτο skin. +Θέλετε να ξεκλειδώσετε το πακέτο skin τώρα; - - Χρησιμοποιείται για μετακίνηση στο νερό. Είναι πιο γρήγορο από το κολύμπι. + + Χρησιμοποιείτε μια δοκιμαστική έκδοση του πακέτου με υφές. Δεν θα μπορέσετε να αποθηκεύσετε αυτόν τον κόσμο αν δεν ξεκλειδώσετε την πλήρη έκδοση. +Θέλετε να ξεκλειδώσετε την πλήρη έκδοση του πακέτου με υφές; - - Συλλέγεται από πρόβατα και μπορεί να χρωματιστεί με διάφορες βαφές. + + Λήψη Πλήρους Έκδοσης - - Χρησιμοποιείται ως δομικό υλικό και μπορεί να χρωματιστεί με διάφορες βαφές. Αυτή η συνταγή δεν συνιστάται, καθώς μπορείτε να αποκτήσετε Μαλλί εύκολα από Πρόβατα. + + Αυτός ο κόσμος χρησιμοποιεί ένα μικτό πακέτο ή ένα πακέτο με υφές που δεν διαθέτετε! +Θέλετε να εγκαταστήσετε το μικτό πακέτο ή το πακέτο με υφές τώρα; - - Χρησιμοποιείται ως βαφή για τη δημιουργία μαύρου μαλλιού. + + Απόκτηση Δοκιμαστικής Έκδοσης - - Χρησιμοποιείται ως βαφή για τη δημιουργία πράσινου μαλλιού. + + Το Πακέτο με Υφές δεν Βρίσκεται Εδώ - - Χρησιμοποιείται ως βαφή για τη δημιουργία καφέ μαλλιού, ως συστατικό για μπισκότα ή για την καλλιέργεια Κακαόδεντρων. + + Ξεκλείδωμα Πλήρους Έκδοσης - - Χρησιμοποιείται ως βαφή για τη δημιουργία ασημί μαλλιού. + + Λήψη Δοκιμαστικής Έκδοσης - - Χρησιμοποιείται ως βαφή για τη δημιουργία κίτρινου μαλλιού. + + Η λειτουργία παιχνιδιού έχει αλλάξει - - Χρησιμοποιείται ως βαφή για τη δημιουργία κόκκινου μαλλιού. + + Όταν είναι ενεργοποιημένο, μόνο παίκτες που έχουν προσκληθεί θα μπορούν να συμμετάσχουν. - - Χρησιμοποιείται για τη στιγμιαία ανάπτυξη σοδειών, δέντρων, ψηλού γρασιδιού, μεγάλων μανιταριών και λουλουδιών και μπορεί να χρησιμοποιηθεί και στις συνταγές βαφών. + + Όταν είναι ενεργοποιημένο, φίλοι όσων βρίσκονται στη Λίστα Φίλων σας θα μπορούν να συμμετάσχουν στο παιχνίδι. - - Χρησιμοποιείται ως βαφή για τη δημιουργία ροζ μαλλιού. + + Όταν είναι ενεργοποιημένο, οι παίκτες θα μπορούν να προκαλέσουν βλάβες σε άλλους παίκτες. Επηρεάζει μόνο τη λειτουργία Επιβίωση. - - Χρησιμοποιείται ως βαφή για τη δημιουργία πορτοκαλί μαλλιού. + + Κανονικό - - Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού πράσινου μαλλιού. + + Εντελώς Επίπεδο - - Χρησιμοποιείται ως βαφή για τη δημιουργία γκρι μαλλιού. + + Όταν είναι ενεργοποιημένο, το παιχνίδι θα είναι διαδικτυακό. - - Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού γκρι μαλλιού. -(Σημείωση: Μπορείτε επίσης να δημιουργήσετε ανοιχτή γκρι βαφή, αν συνδυάσετε την γκρι βαφή με πάστα οστών. Με αυτόν τον τρόπο, μπορείτε να δημιουργήσετε τέσσερις ανοιχτές γκρι βαφές από έναν ασκό μελάνης). + + Όταν είναι απενεργοποιημένο, οι παίκτες που συμμετέχουν στο παιχνίδι δεν μπορούν να κάνουν κατασκευές ή εξόρυξη έως ότου λάβουν άδεια. - - Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού μπλε μαλλιού. + + Όταν είναι ενεργοποιημένο, οικοδομήματα όπως Χωριά και Οχυρά θα δημιουργηθούν στον κόσμο. - - Χρησιμοποιείται ως βαφή για τη δημιουργία γαλανού μαλλιού. + + Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένας εντελώς επίπεδος κόσμος στο Overworld και στο Nether. - - Χρησιμοποιείται ως βαφή για τη δημιουργία μοβ μαλλιού. + + Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένα σεντούκι που θα περιέχει ορισμένα χρήσιμα αντικείμενα κοντά στο σημείο που θα κάνει spawn ο παίκτης. - - Χρησιμοποιείται ως βαφή για τη δημιουργία φούξια μαλλιού. + + Όταν είναι ενεργοποιημένο, η φωτιά μπορεί να επεκταθεί σε κοντινούς εύφλεκτους κύβους. - - Χρησιμοποιείται ως βαφή για τη δημιουργία μπλε μαλλιού. + + Όταν είναι ενεργοποιημένο, το ΤΝΤ θα ανατιναχθεί όταν πυροδοτηθεί. - - Παίζει Δίσκους Μουσικής. + + Όταν είναι ενεργοποιημένο, ο κόσμος Nether θα αναδημιουργηθεί. Αυτό είναι χρήσιμο εάν έχετε αποθηκεύσει παλαιότερο παιχνίδι όταν δεν υπήρχαν Κάστρα Nether. - - Χρησιμοποιήστε τα για να δημιουργήστε πολύ ισχυρά εργαλεία, όπλα ή πανοπλίες. + + Ανενεργό - - Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. + + Λειτουργία Παιχνιδιού: Δημιουργία - - Χρησιμοποιείται για τη δημιουργία βιβλίων και χαρτών. + + Επιβίωση - - Μπορεί να χρησιμοποιηθεί για τη δημιουργία ραφιών βιβλιοθήκης ή Μαγεμένων Βιβλίων, αν μαγευτεί. + + Δημιουργία - - Επιτρέπει τη δημιουργία πιο ισχυρών ξορκιών, αν τοποθετηθεί γύρω από το Τραπέζι Μαγέματος. + + Μετονομασία του Κόσμου σας - - Χρησιμοποιείται ως διακοσμητικό. + + Εισαγάγετε το νέο όνομα για τον κόσμο σας - - Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους χρυσού. + + Λειτουργία Παιχνιδιού: Επιβίωση - - Μπορεί να εξορυχτεί με αξίνα από πέτρα ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους σιδήρου. + + Δημιουργήθηκε στην «Επιβίωση» - - Μπορεί να εξορυχτεί με αξίνα και παράγει κάρβουνο. + + Μετονομασία Αποθήκευσης - - Μπορεί να εξορυχτεί με αξίνα και παράγει λάπις λάζουλι. + + Αυτόματη Αποθήκευση σε %d... - - Μπορεί να εξορυχτεί με αξίνα από σίδερο και παράγει διαμάντια. + + Ενεργό - - Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και παράγει σκόνη κοκκινόπετρας. + + Δημιουργήθηκε στη «Δημιουργία» - - Μπορεί να εξορυχτεί με αξίνα και παράγει πέτρα επίστρωσης. + + Αναπαράσταση Σύννεφων - - Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. + + Τι θέλετε να κάνετε με αυτό το αποθηκευμένο παιχνίδι; - - Μπορεί να φυτευτεί και σε βάθος χρόνου θα εξελιχθεί σε δέντρο. + + Μέγεθος HUD (Διαχωρισμός Οθόνης) - - Αυτό είναι άθραυστο. + + Συστατικό - - Βάζει φωτιά σε οτιδήποτε έρχεται σε επαφή μαζί του. Μπορεί να συλλεχθεί σε κουβά. + + Καύσιμο - - Συλλέγεται με φτυάρι. Μπορεί να λιώσει σε φούρνο για να μετατραπεί σε γυαλί. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. - - - Συλλέγεται με φτυάρι. Μερικές φορές παράγει πυρόλιθο κατά την εξόρυξη. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. - - - Κόβεται με τσεκούρι και μπορεί να χρησιμοποιηθεί ως καύσιμο ή για την κατασκευή σανίδων. - - - Δημιουργείται σε φούρνο από λιωμένη άμμο. Μπορεί να χρησιμοποιηθεί για κατασκευή, αλλά θα σπάσει αν προσπαθήσετε να το εξορύξετε. - - - Εξορύσσεται από την πέτρα με χρήση αξίνας. Μπορεί να χρησιμοποιηθεί για την κατασκευή καμινιού ή πέτρινων εργαλείων. - - - Δημιουργείται με το ψήσιμο πηλού σε φούρνο. - - - Μπορεί να ψηθεί σε φούρνο για να μετατραπεί σε τούβλα. - - - Όταν σπάσει, πέφτουν μπάλες πηλού που μπορούν να ψηθούν σε φούρνο για να μετατραπούν σε τούβλα. - - - Ένας πιο βολικός τρόπος για να αποθηκεύετε χιονόμπαλες. - - - Μπορεί να σκαφτεί με αξίνα και δημιουργεί χιονόμπαλες. - - - Όταν σπάσει, μερικές φορές παράγει σπόρους σιταριού. - - - Μπορεί να χρησιμοποιηθεί για τη δημιουργία βαφής. - - - Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία σούπας. - - - Μπορεί να εξορυχτεί μόνο με αδαμάντινη αξίνα. Παράγεται κατά την ανάμιξη νερού και ακίνητης λάβας και χρησιμοποιείται για την κατασκευή πύλης. - - - Δημιουργεί τέρατα στον κόσμο. - - - Τοποθετείται στο έδαφος και μεταφέρει ηλεκτρικά φορτία. Όταν αναμιγνύεται με ένα φίλτρο, αυξάνει τη διάρκεια της επίδρασης. - - - Όταν αναπτυχθεί πλήρως, παράγει σοδειές με σιτάρι. - - - Έδαφος που έχει προετοιμαστεί για τη φύτευση σπόρων. - - - Μπορεί να ψηθεί στο φούρνο για τη δημιουργία πράσινης βαφής. - - - Μπορεί να χρησιμοποιηθεί για τη δημιουργία ζάχαρης. - - - Μπορεί να φορεθεί ως κράνος ή να συνδυαστεί με έναν πυρσό για τη δημιουργία ενός φαναριού από κολοκύθα. Είναι επίσης το βασικό συστατικό της Κολοκυθόπιτας. - - - Όταν ανάψει, καίει για πάντα. - - - Επιβραδύνει την κίνηση οποιουδήποτε πλάσματος περάσει από επάνω του. - - - Αν σταθείτε στην πύλη, μπορείτε να ταξιδεύετε από τον Overworld στο Nether. - - - Χρησιμοποιείται ως καύσιμο για ένα φούρνο ή μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρσού. - - - Συλλέγεται από σκοτωμένες αράχνες και μπορεί να χρησιμοποιηθεί για τη δημιουργία Τόξου ή Καλαμιού Ψαρέματος. Μπορεί να τοποθετηθεί στο έδαφος για τη δημιουργία Σύρματος Ενεργοποίησης. - - - Συλλέγεται από σκοτωμένες κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός βέλους. - - - Συλλέγεται από σκοτωμένα Creeper και μπορεί να χρησιμοποιηθεί για τη δημιουργία TNT ή ως συστατικό για την παρασκευή φίλτρων. - - - Μπορεί να φυτευτεί σε ένα αγρόκτημα για την καλλιέργεια σοδειών. Βεβαιωθείτε ότι υπάρχει αρκετό φως για να αναπτυχθούν οι σπόροι! - - - Συλλέγεται από σοδειές και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. - - - Συλλέγεται με το σκάψιμο χαλικιού και μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρόλιθου και χάλυβα. - - - Αν το χρησιμοποιήσετε σε ένα γουρούνι, μπορείτε να το ιππεύσετε. Στη συνέχεια, μπορείτε να καθοδηγήσετε το γουρούνι με ένα Καρότο σε Ραβδί. - - - Συλλέγεται με το σκάψιμο χιονιού και μπορείτε να το πετάξετε. - - - Συλλέγεται από σκοτωμένες αγελάδες και μπορεί να χρησιμοποιηθεί για η δημιουργία πανοπλιών ή Βιβλίων. - - - Συλλέγεται από σκοτωμένα Slime και μπορεί να χρησιμοποιηθεί για την παρασκευή φίλτρων ή για τη δημιουργία Εμβόλων με Κόλλα. - - - Πέφτει τυχαία από κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. - - - Συλλέγεται με την εξόρυξη Λαμψόπετρας και μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβου Λαμψόπετρας ή να αναμιχθεί σε ένα φίλτρο για να ενισχύσει την επίδρασή του. - - - Συλλέγεται από σκοτωμένους Σκελετούς. Μπορεί να χρησιμοποιηθεί για τη δημιουργία πάστας οστών. Μπορείτε να το ταΐσετε σε έναν λύκο για να τον δαμάσετε. - - - Συλλέγεται από Creeper που σκοτώθηκε από Σκελετούς. Μπορείτε να το ακούσετε σε ένα jukebox. - - - Σβήνει τη φωτιά και ενισχύει την ανάπτυξη των σοδειών. Μπορεί να συλλεχθεί σε κουβά. - - - Όταν σπάει, βγάζει μερικές φορές ένα βλαστάρι που μπορεί να φυτευτεί και να γίνει δέντρο. - - - Βρίσκεται στα μπουντρούμια. Μπορεί να χρησιμοποιηθεί για κατασκευή και διακόσμηση. - - - Χρήση για την παραγωγή μαλλιού από πρόβατα και τη συγκομιδή κύβων φύλλων. - - - Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. - - - Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. Όταν μαζεύεται, τραβά μαζί του και τον κύβο που έρχεται σε επαφή με το εκτεταμένο μέρος του εμβόλου. - - - Κατασκευάζεται από κύβους πέτρας και βρίσκεται συνήθως σε Φρούρια. - - - Χρησιμοποιείται ως φράγμα και λειτουργεί όπως και οι φράκτες. - - - Λειτουργεί ως πόρτα, αλλά χρησιμοποιείται κυρίως σε φράκτες. - - - Μπορεί να δημιουργηθεί από Φέτες Καρπουζιού. - - - Διάφανοι κύβοι που μπορούν να χρησιμοποιηθούν αντί για Γυάλινους Κύβους. - - - Μπορεί να φυτευτεί για την καλλιέργεια κολοκύθας. - - - Μπορεί να φυτευτεί για την καλλιέργεια καρπουζιών. - - - Πέφτει από Enderman όταν πεθαίνουν. Όταν πεταχτεί, ο παίκτης τηλεμεταφέρεται στη θέση που πέφτει το Μαργαριτάρι του Ender και χάνει λίγη ζωή. - - - Ένας κύβος από χώμα με γρασίδι που φυτρώνει στην κορυφή. Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. - - - Μπορεί να χρησιμοποιηθεί για κατασκευές και διακόσμηση. - - - Επιβραδύνει την κίνηση όταν περνάτε από μέσα του. Μπορείτε να το καταστρέψετε με ψαλίδι για να συλλέξετε κλωστή. - - - Όταν καταστραφεί, παράγει ένα Ασημόψαρο. Μπορεί επίσης να δημιουργήσει Ασημόψαρα αν βρίσκεται κοντά σε ένα άλλο Ασημόψαρο που δέχεται επίθεση. - - - Όταν τοποθετηθεί κάπου, μεγαλώνει με το πέρασμα του χρόνου. Μπορεί να συλλεχθεί με ψαλίδι. Μπορείτε να το σκαρφαλώσετε σαν να ήταν σκάλα. - - - Γλιστράει όταν περπατάτε επάνω του. Αν βρίσκεται επάνω από άλλον κύβο, μετατρέπεται σε νερό όταν καταστρέφεται. Λιώνει αν έρθει πολύ κοντά σε μια πηγή φωτός ή όταν τοποθετείται στο Nether. - - - Μπορεί να χρησιμοποιηθεί ως διακοσμητικό. - - - Χρησιμοποιείται στην παρασκευή φίλτρων και για τον εντοπισμό Φρουρίων. Πέφτει από τα Blaze που συνήθως βρίσκονται κοντά σε Φρούρια στο Nether. - - - Χρησιμοποιείται στην παρασκευή φίλτρων. Πέφτει από Ghast όταν πεθαίνουν. - - - Πέφτει από Γουρουνάνθρωπους Ζόμπι όταν πεθαίνουν. Οι Γουρουνάνθρωποι Ζόμπι κατοικούν στο Nether. Χρησιμοποιείται ως συστατικό για την παρασκευή φίλτρων. - - - Χρησιμοποιείται στην παρασκευή φίλτρων. Φυτρώνει φυσικά σε Οχυρά του Nether. Μπορεί επίσης να φυτευτεί σε Άμμο των Ψυχών. - - - Όταν χρησιμοποιείται, μπορεί να έχει διάφορα αποτελέσματα, ανάλογα με το πού χρησιμοποιείται. - - - Μπορεί να γεμίσει με νερό και να χρησιμοποιηθεί ως βασικό συστατικό για ένα φίλτρο στη Βάση Παρασκευής. - - - Ένα δηλητηριώδες τρόφιμο και υλικό για φίλτρα. Πέφτει όταν ο παίκτης σκοτώνει Αράχνες ή Αράχνες των Σπηλαίων. - - - Χρησιμοποιείται στην παρασκευή φίλτρων, συνήθως για τη δημιουργία φίλτρων με αρνητικές επιδράσεις. - - - Χρησιμοποιείται στην παρασκευή φίλτρων ή συνδυάζεται με άλλα αντικείμενα για τη δημιουργία Ματιών του Ender ή Κρέμα Μάγματος. - - - Χρησιμοποιείται στην παρασκευή φίλτρων. - - - Χρησιμοποιείται για τη δημιουργία Φίλτρων και Φίλτρων Εκτόξευσης. - - - Αν το γεμίσετε με νερό της βροχής ή από έναν κουβά, μπορείτε να το χρησιμοποιήσετε για να γεμίσετε Γυάλινα Μπουκάλια με νερό. - - - Όταν πετάγεται, δείχνει την κατεύθυνση στην οποία βρίσκεται η Πύλη του End. Αν τοποθετήσετε δώδεκα τέτοια αντικείμενα σε Πλαίσια Πύλης End, θα ενεργοποιηθεί η Πύλη του End. - - - Χρησιμοποιείται στην παρασκευή φίλτρων. - - - Μοιάζουν με τους Κύβοι Γρασιδιού, ιδανικοί για καλλιέργεια μανιταριών. - - - Επιπλέει στο νερό και μπορεί να περπατήσει κανείς επάνω του. - - - Χρησιμοποιείται για την κατασκευή Οχυρών του Nether. Άτρωτο στις πύρινες σφαίρες των Ghast. - - - Χρησιμοποιείται στα Οχυρά του Nether. - - - Βρίσκεται στα Οχυρά του Nether και ρίχνει Φυτά Nether όταν σπάσει. - - - Επιτρέπει στους παίκτες να μαγεύουν Σπαθιά, Αξίνες, Τσεκούρια, Φτυάρια, Τόξα και Πανοπλίες με τους Πόντους Εμπειρίας που έχουν συλλέξει. - - - Μπορεί να ενεργοποιηθεί με δώδεκα Μάτια του Ender και επιτρέπει στον παίκτη να ταξιδέψει στη διάσταση του End. - - - Χρησιμοποιείται για το σχηματισμό μιας Πύλης End. - - - Ένας τύπος κύβου που βρίσκεται στο End. Είναι πολύ ανθεκτικός στις εκρήξεις, επομένως είναι πολύ χρήσιμος για την κατασκευή κτιρίων. - - - Αυτός ο κύβος δημιουργείται όταν νικηθεί ο Δράκος στο End. - - - Όταν πετάγεται, ρίχνει Σφαίρες Εμπειρίας που αυξάνουν τους πόντους εμπειρίας σας όταν συλλεχθούν. - - - Χρήσιμο για την ανάφλεξη υλικών ή για εμπρηστικά πυρά όταν εκτοξεύεται από Διανομέα. - - - Μοιάζουν με προθήκες επίδειξης και παρουσιάζουν το αντικείμενο ή τον κύβο που περιέχουν. - - - Όταν πετάγεται, μπορεί να δημιουργήσει ένα πλάσμα του τύπου που αναφέρεται. - - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. - - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. - - - Δημιουργείται λιώνοντας Netherrack σε φούρνο. Μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβων Τούβλου Nether. - - - Όταν τροφοδοτούνται με ρεύμα, εκπέμπουν φως. - - - Μπορούν να καλλιεργηθούν για την παραγωγή Καρπών Κακάο. - - - Τα Κεφάλια Mob μπορούν να χρησιμοποιηθούν ως διακοσμητικά ή να φορεθούν ως μάσκες στην υποδοχή κράνους. - - - Καλαμάρι - - - Ρίχνει ασκούς μελάνης όταν σκοτωθεί. - - - Αγελάδα - - - Ρίχνει δέρμα όταν σκοτωθεί. Μπορεί, επίσης, να αρμεχθεί με έναν κουβά. - - - Πρόβατο - - - Ρίχνει μαλλί όταν κουρευτεί (αν δεν έχει κουρευτεί ήδη). Μπορείτε να το βάψετε για να αλλάξετε χρώμα στο μαλλί του. - - - Κότα - - - Ρίχνει φτερά όταν σκοτωθεί και γεννά αυγά με τυχαία συχνότητα. - - - Γουρούνι - - - Ρίχνει χοιρινές μπριζόλες όταν σκοτωθεί. Μπορείτε να το ιππεύσετε, αν χρησιμοποιήσετε μια σέλα. - - - Λύκος - - - Δεν επιτίθεται, εκτός και αν του επιτεθείτε πρώτοι. Μπορεί να δαμαστεί αν του δώσετε κόκκαλα. Σε αυτήν την περίπτωση, σας ακολουθούν παντού και επιτίθενται σε ό,τι σας επιτίθεται. - - - Creeper - - - Εκρήγνυται αν το πλησιάσετε πολύ! - - - Σκελετός - - - Επιτίθεται με βέλη εναντίον σας. Ρίχνει βέλη όταν σκοτωθεί. - - - Αράχνη - - - Σας επιτίθεται όταν βρίσκεστε κοντά. Μπορεί να σκαρφαλώσει τοίχους. Ρίχνει σπάγκο όταν σκοτωθεί. - - - Ζόμπι - - - Σας επιτίθεται όταν βρίσκεστε κοντά. - - - Ζόμπι Γουρουνάνθρωπος - - - Αρχικά ήρεμος, αλλά επιτίθεται μαζικά, αν επιτεθείτε σε κάποιον. - - - Ghast - - - Εκτοξεύει πύρινες σφαίρες εναντίον σας που εκρήγνυνται όταν σας ακουμπήσουν. - - - Slime - - - Όταν δέχεται ζημιά, χωρίζεται σε μικρότερα Slime. - - - Enderman - - - Σας επιτίθενται αν τους κοιτάξετε. Μπορούν επίσης να μετακινούν κύβους. - - - Ασημόψαρα - - - Προσελκύουν τα Ασημόψαρα που κρύβονται στη γύρω περιοχή όταν τους επιτίθεστε. Κρύβονται σε κύβους πέτρας. - - - Αράχνη των Σπηλαίων - - - Το δάγκωμά της είναι δηλητηριώδες. - - - Mooshroom - - - Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία μανιταρόσουπας. Ρίχνει μανιτάρια και μετατρέπεται σε κανονική αγελάδα, αν την κουρέψετε. - - - Γκόλεμ του Χιονιού - - - Το Γκόλεμ του Χιονιού μπορεί να δημιουργηθεί από παίκτες συνδυάζοντας κύβους χιονιού και μια κολοκύθα. Πετάει χιονόμπαλες στους εχθρούς του δημιουργού του. - - - Δράκος του Ender - - - Ένας πελώριος μαύρος δράκος που βρίσκεται στο End. - - - Blaze - - - Εχθροί που κατοικούν στο Nether, συνήθως στα Οχυρά Nether. Ρίχνουν Ράβδους Blaze όταν σκοτωθούν. - - - Κύβος Μάγματος - - - Κατοικούν στο Nether. Όπως και τα Slime, όταν σκοτωθούν σπάνε σε μικρότερες εκδόσεις του εαυτού τους. - - - Χωρικός - - - Αιλουροπάρδαλις - - - Κατοικούν στις Ζούγκλες. Μπορείτε να τις δαμάσετε, αν τις ταΐσετε Ωμό Ψάρι. Θα πρέπει πρώτα να αφήσετε την Αιλουροπάρδαλις να σας πλησιάσει, καθώς οι απότομες κινήσεις τον τρομάζουν. - - - Σιδερένιο Γκόλεμ - - - Εμφανίζονται σε Χωριά για να τα προστατεύσουν και μπορούν να δημιουργηθούν συνδυάζοντας Σιδερένιους Κύβους και Κολοκύθες. - - - Κίνηση Εκρηκτικών - - - Καλλιτεχνική Σχεδίαση - - - Υπολογισμοί και Στατιστικά Στοιχεία - - - Συντονιστής Εχθρών - - - Αρχική Σχεδίαση και Προγραμματισμός - - - Υπεύθυνος Έργου/Παραγωγός - - - Το Υπόλοιπο Εργατικό Δυναμικό της Mojang - - - Επικεφαλής Προγραμματισμού Minecraft για PC - - - Προγραμματιστής-Νίντζα - - - Διευθύνων Σύμβουλος - - - Υπάλληλος Γραφείου - - - Υποστήριξη Πελατών - - - DJ Γραφείου - - - Σχεδιαστής/Προγραμματιστής Minecraft - Pocket Edition - - - Προγραμματιστής - - - Βασικός Αρχιτέκτονας - - - Καλλιτεχνική Διεύθυνση - - - Δημιουργός Παιχνιδιού - - - Διευθυντής Διασκέδασης - - - Μουσική και Ήχοι - - - Προγραμματισμός - - - Γραφικά - - - Ποιοτικός Έλεγχος - - - Διευθυντής Παραγωγής - - - Επικεφαλής Παραγωγής - - - Παραγωγός - - - Επικεφαλής Δοκιμαστών - - - Βασικός Δοκιμαστής - - - Ομάδα Σχεδίασης - - - Ομάδα Ανάπτυξης - - - Διαχείριση Κυκλοφορίας - - - Διευθυντής Έκδοσης XBLA - - - Επιχειρηματικός Σχεδιασμός - - - Διευθυντής Χαρτοφυλακίου - - - Υπεύθυνος Προϊόντος - - - Μάρκετινγκ - - - Διαχειριστής Κοινότητας - - - Ομάδα Μετάφρασης - Ευρώπη - - - Ομάδα Μετάφρασης - Redmond - - - Ομάδα Μετάφρασης – Ασία - - - Ομάδα Έρευνας Χρηστών - - - Κεντρικές Ομάδες MGS - - - Δοκιμαστής Αποδοχής Οροσήμων - - - Ειδικές Ευχαριστίες - - - Συντονιστής Δοκιμών - - - Υπεύθυνος Δοκιμών - - - SDET - - - Αξιολόγηση Δοκιμής Συστήματος Έργου - - - Επιπλέον Αξιολόγηση Δοκιμής Συστήματος - - - Συνεργάτες Δοκιμών - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Ξύλινο Σπαθί - - - Πέτρινο Σπαθί - - - Σιδερένιο Σπαθί - - - Αδαμάντινο Σπαθί - - - Χρυσό Σπαθί - - - Ξύλινο Φτυάρι - - - Πέτρινο Φτυάρι - - - Σιδερένιο Φτυάρι - - - Αδαμάντινο Φτυάρι - - - Χρυσό Φτυάρι - - - Ξύλινη Αξίνα - - - Πέτρινη Αξίνα - - - Σιδερένια Αξίνα - - - Αδαμάντινη Αξίνα - - - Χρυσή Αξίνα - - - Ξύλινο Τσεκούρι - - - Πέτρινο Τσεκούρι - - - Σιδερένιο Τσεκούρι - - - Αδαμάντινο Τσεκούρι - - - Χρυσό Τσεκούρι - - - Ξύλινο Σκαλιστήρι - - - Πέτρινο Σκαλιστήρι - - - Σιδερένιο Σκαλιστήρι - - - Αδαμάντινο Σκαλιστήρι - - - Χρυσό Σκαλιστήρι - - - Ξύλινη Πόρτα - - - Σιδερένια Πόρτα - - - Σιδερόπλεκτη Περικεφαλαία - - - Σιδερόπλεκτος Θώρακας - - - Σιδερόπλεκτη Περισκελίδα - - - Σιδερόπλεκτες Μπότες - - - Δερμάτινος Σκούφος - - - Σιδερένια Περικεφαλαία - - - Αδαμάντινη Περικεφαλαία - - - Χρυσή Περικεφαλαία - - - Δερμάτινο Χιτώνιο - - - Σιδερένιος Θώρακας - - - Αδαμάντινος Θώρακας - - - Χρυσός Θώρακας - - - Δερμάτινο Παντελόνι - - - Σιδερένια Περισκελίδα - - - Αδαμάντινη Περισκελίδα - - - Χρυσή Περισκελίδα - - - Δερμάτινες Μπότες - - - Σιδερένιες Μπότες - - - Αδαμάντινες Μπότες - - - Χρυσές Μπότες - - - Ράβδος Σιδήρου - - - Ράβδος Χρυσού - - - Κουβάς - - - Κουβάς Νερού - - - Κουβάς Λάβας - - - Πυρόλιθος και Χάλυβας - - - Μήλο - - - Τόξο - - - Βέλος - - - Κάρβουνο - - - Ξυλοκάρβουνο - - - Διαμάντι - - - Ραβδί - - - Μπολ - - - Μανιταρόσουπα - - - Σπάγκος - - - Φτερό - - - Μπαρούτι - - - Σπόροι Σιταριού - - - Σιτάρι - - - Ψωμί - - - Πυρόλιθος - - - Ωμή Χοιρινή Μπριζόλα - - - Ψημένη Χοιρινή Μπριζόλα - - - Πίνακας - - - Χρυσό Μήλο - - - Πινακίδα - - - Βαγόνι Ορυχείου - - - Σέλα - - - Κοκκινόπετρα - - - Χιονόμπαλα - - - Βάρκα - - - Δέρμα - - - Κουβάς Γάλατος - - - Τούβλο - - - Πηλός - - - Ζαχαρωτά - - - Χαρτί - - - Βιβλίο - - - Μπάλα Κόλλας - - - Βαγόνι με Σεντούκι - - - Βαγόνι με Φούρνο - - - Αυγό - - - Πυξίδα - - - Καλάμι Ψαρέματος - - - Ρολόι - - - Σκόνη Λαμψόπετρας - - - Ωμό Ψάρι - - - Ψημένο Ψάρι - - - Σκόνη Βαφής - - - Ασκός Μελάνης - - - Τριανταφυλλί - - - Πράσινο του Κάκτου - - - Καρποί Κακάο - - - Λάπις Λάζουλι - - - Μοβ Βαφή - - - Γαλανή Βαφή - - - Ανοιχτή Γκρίζα Βαφή - - - Γκρίζα Βαφή - - - Ροζ Βαφή - - - Ανοιχτή Πράσινη Βαφή - - - Κίτρινο Ηλίανθου - - - Ανοιχτή Μπλε Βαφή - - - Φούξια Βαφή - - - Πορτοκαλί Βαφή - - - Πάστα Οστών - - - Κόκκαλο - - - Ζάχαρη - - - Κέικ - - - Κρεβάτι - - - Αγωγός Κοκκινόπετρας - - - Μπισκότο - - - Χάρτης - - - Δίσκος Μουσικής - "13" - - - Δίσκος Μουσικής - "Γάτα" - - - Δίσκος Μουσικής - "Κύβοι" - - - Δίσκος Μουσικής - "Τιτίβισμα" - - - Δίσκος Μουσικής - "Μακριά" - - - Δίσκος Μουσικής - "Ψώνια" - - - Δίσκος Μουσικής - "Ήρεμη" - - - Δίσκος Μουσικής - "Τζαζ" - - - Δίσκος Μουσικής - "Τροπικό" - - - Δίσκος Μουσικής - "Σκοτάδι" - - - Δίσκος μουσικής - "11" - - - Δίσκος Μουσικής - "Πού Είμαστε Τώρα" - - - Ψαλίδια - - - Σπόροι Κολοκύθας - - - Σπόροι Καρπουζιού - - - Ωμό Κοτόπουλο - - - Ψημένο Κοτόπουλο - - - Ωμό Μοσχάρι - - - Μπριζόλα - - - Σάπιο Κρέας - - - Μαργαριτάρι του Ender - - - Φέτα Καρπουζιού - - - Ράβδος Blaze - - - Δάκρυ Ghast - - - Ψήγμα Χρυσού - - - Φυτό Nether - - - {*splash*}{*prefix*}Φίλτρο {*postfix*} - - - Γυάλινο Μπουκάλι - - - Μπουκάλι Νερού - - - Μάτι Αράχνης - - - Ζυμωμένο Μάτι Αράχν. - - - Σκόνη Blaze - - - Κρέμα Μάγματος - - - Βάση Παρασκευής - - - Καζάνι - - - Μάτι του Ender - - - Γυαλιστερό Καρπούζι - - - Μπουκάλι Μαγέματος - - - Μπάλα Φωτιάς - - - Μπάλα Φωτιάς (Ξυλοκ.) - - - Μπάλα Φωτιάς (Κάρβ.) - - - Πλαίσιο Αντικειμένου - - - Δημιουργία {*CREATURE*} - - - Τούβλο Nether - - - Κρανίο - - - Κρανίο Σκελετού - - - Κρανίο Μαύρου Σκελετού - - - Κεφάλι Ζόμπι - - - Κεφάλι - - - Κεφάλι από %s - - - Κεφάλι Creeper - - - Πέτρα - - - Κύβοι Γρασιδιού - - - Χώμα - - - Πέτρα Επίστρωσης - - - Σανίδες από Βελανιδιά - - - Σανίδες από Έλατο - - - Σανίδες από Σημύδα - - - Σανίδ. Ξύλου Ζούγκλας - - - Βλαστάρι - - - Βλαστάρι Βελανιδιάς - - - Βλαστάρι Ελάτου - - - Βλαστάρι Σημύδας - - - Βλαστάρι Ζούγκλας - - - Καθαρός Βράχος - - - Νερό - - - Λάβα - - - Άμμος - - - Αμμόλιθος - - - Χαλίκι - - - Ορυκτός Χρυσός - - - Ορυκτός Σίδηρος - - - Ορυκτό Κάρβουνο - - - Ξύλο - - - Ξύλο Βελανιδιάς - - - Ξύλο Ελάτου - - - Ξύλο Σημύδας - - - Ξύλο Ζούγκλας - - - Βελανιδιά - - - Έλατο - - - Σημύδα - - - Φύλλα - - - Φύλλα Βελανιδιάς - - - Φύλλα Ελάτου - - - Φύλλα Σημύδας - - - Φύλλα Ζούγκλας - - - Σφουγγάρι - - - Γυαλί - - - Μαλλί - - - Μαύρο Μαλλί - - - Κόκκινο Μαλλί - - - Πράσινο Μαλλί - - - Καφέ Μαλλί - - - Μπλε Μαλλί - - - Μοβ Μαλλί - - - Γαλανό Μαλλί - - - Ανοιχτό Γκρι Μαλλί - - - Γκρι Μαλλί - - - Ροζ Μαλλί - - - Ανοιχτό Πράσινο Μαλλί - - - Κίτρινο Μαλλί - - - Ανοιχτό Μπλε Μαλλί - - - Φούξια Μαλλί - - - Πορτοκαλί Μαλλί - - - Λευκό Μαλλί - - - Λουλούδι - - - Τριαντάφυλλο - - - Μανιτάρι - - - Κύβος Χρυσού - - - Ένας συμπαγής τρόπος αποθήκευσης Χρυσού. - - - Κύβος Σιδήρου - - - Ένας συμπαγής τρόπος αποθήκευσης Σιδήρου. - - - Πέτρινη Πλάκα - - - Πέτρινη Πλάκα - - - Πλάκα από Αμμόλιθο - - - Πλάκα από Βελανιδιά - - - Πέτρινη Πλάκα - - - Πλάκα από Τούβλα - - - Πλάκα από Πέτρινα Τούβλα - - - Πλάκα από Βελανιδιά - - - Πλάκα από Έλατο - - - Πλάκα από Σημύδα - - - Πλάκα Ξύλου Ζούγκλας - - - Πλάκα από Τούβλα Nether - - - Τούβλα - - - TNT - - - Ράφι Βιβλιοθήκης - - - Πέτρα με Βρύα - - - Οψιανός - - - Πυρσός - - - Πυρσός (Κάρβουνο) - - - Πυρσός (Ξυλοκάρβουνο) - - - Φωτιά - - - Κλουβί Δημιουργίας Τεράτων - - - Σκαλοπάτια από Βελανιδιά - - - Σεντούκι - - - Σκόνη Κοκκινόπετρας - - - Ορυκτό Διαμάντι - - - Κύβος Διαμαντιού - - - Ένας συμπαγής τρόπος αποθήκευσης Διαμαντιών. - - - Τραπέζι Κατασκευής - - - Σοδειές - - - Αγρόκτημα - - - Φούρνος - - - Πινακίδα - - - Ξύλινη Πόρτα - - - Σκάλα - - - Ράγα - - - Ηλεκτρική Ράγα - - - Ράγα Εντοπισμού - - - Πέτρινα Σκαλοπάτια - - - Μοχλός - - - Πλάκα Πίεσης - - - Σιδερένια Πόρτα - - - Ορυκτή Κοκκινόπετρα - - - Πυρσός Κοκκινόπετρας - - - Κουμπί - - - Χιόνι - - - Πάγος - - - Κάκτος - - - Πηλός - - - Ζαχαρωτό - - - Jukebox - - - Φράκτης - - - Κολοκύθα - - - Φανάρι από Κολοκύθα - - - Netherrack - - - Άμμος των Ψυχών - - - Λαμψόπετρα - - - Πύλη - - - Ορυκτό Λάπις Λάζουλι - - - Κύβος Λάπις Λάζουλι - - - Ένας συμπαγής τρόπος αποθήκευσης Λάπις Λάζουλι. - - + Διανομέας - - Κύβος Νότας + + Σεντούκι - - Κέικ + + Μαγεία - - Κρεβάτι + + Φούρνος - - Ιστός + + Δεν υπάρχουν προσφορές για περιεχόμενο με δυνατότητα λήψης αυτού του τύπου για τον συγκεκριμένο τίτλο αυτή τη στιγμή. - - Ψηλό Γρασίδι + + Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αποθηκευμένο παιχνίδι; - - Νεκρός Θάμνος + + Αναμονή έγκρισης - - Ημιαγωγός + + Λογοκριμένο - - Κλειδωμένο Σεντούκι + + Ο/Η %s συμμετέχει στο παιχνίδι. - - Καταπακτή + + Ο/Η %s εγκατέλειψε το παιχνίδι. - - Μαλλί (οποιοδήποτε χρώμα) + + Ο/Η %s αποβλήθηκε από το παιχνίδι. - - Έμβολο + + Βάση Παρασκευής Φίλτρων - - Έμβολο με Κόλλα + + Εισαγωγή Κειμένου Πινακίδας - - Κύβος Ασημόψαρου + + Εισαγάγετε ένα κείμενο για την πινακίδα σας - - Πέτρινα Τούβλα + + Εισαγωγή Τίτλου - - Τούβλα από Πέτρα με Βρύα + + Χρονικό Όριο Δοκιμαστικής Έκδοσης - - Ραγισμένα Πέτρινα Τούβλα + + Το παιχνίδι είναι πλήρες - - Τούβλα από Λαξευμένη Πέτρα + + Δεν ολοκληρώθηκε η συμμετοχή στο παιχνίδι, καθώς δεν υπάρχουν άλλες διαθέσιμες θέσεις - - Μανιτάρι + + Εισαγάγετε έναν τίτλο για τη δημοσίευσή σας - - Μανιτάρι + + Εισαγάγετε μια περιγραφή για τη δημοσίευσή σας - - Σιδερένια Κάγκελα - - - Γυάλινο Τζάμι - - - Καρπούζι - - - Μίσχος Κολοκύθας - - - Μίσχος Καρπουζιού - - - Κλήματα - - - Πύλη Φράκτη - - - Σκαλοπάτια από Τούβλα - - - Σκαλοπ. Πέτρινων Τούβλων - - - Πέτρα Ασημόψαρου - - - Πέτρα Επίστρωσης Ασημόψαρου - - - Πέτρινο Τούβλο Ασημόψαρου - - - Μυκήλιο - - - Νούφαρο - - - Τούβλο Nether - - - Φράκτης από Τούβλα Nether - - - Σκαλοπάτια Τούβλων Nether - - - Φυτό Nether - - - Τραπέζι Μαγέματος - - - Βάση Παρασκευής - - - Καζάνι - - - Πύλη End - - - Πλαίσιο Πύλης End - - - Πέτρα End - - - Αυγό Δράκου - - - Χαμόκλαδο - - - Φτέρη - - - Σκαλοπάτια από Αμμόλιθο - - - Σκαλοπάτια από Έλατο - - - Σκαλοπάτια από Σημύδα - - - Σκαλοπάτια Ξύλου Ζούγκλας - - - Φανάρι Κοκκινόπετρας - - - Κακάο - - - Κρανίο - - - Τρέχουσες Ρυθμίσεις Ελέγχου - - - Διάταξη - - - Κίνηση/Τρέξιμο - - - Κάμερα - - - Παύση - - - Άλμα - - - Άλμα/Αύξηση Υψόμετρου - - + Απόθεμα - - Εναλλαγή Αντικειμένων στο Χέρι + + Συστατικά - - Ενέργεια + + Εισαγωγή Λεζάντας - - Χρήση + + Εισαγάγετε μια λεζάντα για τη δημοσίευσή σας - - Κατασκευή + + Εισαγωγή Περιγραφής - - Ξεσκαρτάρισμα + + Παίζει τώρα: + - - Αθόρυβη Κίνηση + + Είστε σίγουροι ότι θέλετε να προσθέσετε αυτό το επίπεδο στη λίστα σας με αποκλεισμένα επίπεδα; +Εάν επιλέξετε OK θα βγείτε και από το παιχνίδι. - - Αθόρυβη Κίνηση/Μείωση Υψόμετρου + + Αφαίρεση από τη Λίστα Αποκλεισμένων - - Αλλαγή Λειτουργίας Κάμερας + + Διάστημα Αυτόματης Αποθήκευσης - - Παίκτες/Πρόσκληση + + Αποκλεισμένο Επίπεδο - - Κίνηση (Κατά την Πτήση) + + Το παιχνίδι στο οποίο θα συμμετάσχετε βρίσκεται στη λίστα σας με αποκλεισμένα επίπεδα. +Εάν επιλέξετε να συμμετάσχετε στο παιχνίδι, το επίπεδο θα αφαιρεθεί από τη λίστα σας με αποκλεισμένα επίπεδα. - - Διάταξη 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;]]> + + Μέγεθος HUD - - <![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;]]> + + Η τοποθέτηση λάβας κοντά στο σημείο spawn επιπέδου δεν επιτρέπεται, λόγω πιθανότητας άμεσου θανάτου των παικτών που κάνουν spawn. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Αγαπημένα Skin - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Παιχνίδι του/της %s - - <![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;]]> + + Σφάλμα Φόρτωσης - - <![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;]]> + + Προεπιλεγμένα Skin - - <![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*} προς τα εμπρός, ο χαρακτήρας θα συνεχίσει να τρέχει, εκτός και αν εξαντληθεί ο χρόνος σπριντ ή το φαγητό. - - - Πατήστε{*CONTROLLER_ACTION_JUMP*} για να κάνετε άλμα. - - - Πατήστε παρατεταμένα{*CONTROLLER_ACTION_ACTION*} για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... - - - Πατήστε παρατεταμένα{*CONTROLLER_ACTION_ACTION*} για να κόψετε 4 κύβους ξύλου (κορμούς δέντρων).{*B*}Όταν σπάσει ένας κύβος, μπορείτε να σταθείτε δίπλα στο αντικείμενο που αιωρείται για το συλλέξετε και αυτό θα εμφανιστεί στο απόθεμά σας. - - - Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη κατασκευής. - - - Καθώς συλλέγετε και δημιουργείτε περισσότερα αντικείμενα, το απόθεμά σας θα γεμίζει.{*B*}
 Πατήστε{*CONTROLLER_ACTION_INVENTORY*} για να ανοίξετε το απόθεμα. - - - Καθώς μετακινείστε, σκάβετε και επιτίθεστε, η μπάρα φαγητού μειώνεται{*ICON_SHANK_01*}. Το τρέξιμο και το άλμα με φόρα καταναλώνουν πολύ περισσότερο φαγητό σε σύγκριση με το απλό περπάτημα και άλμα. - - - Αν χάσετε ζωή, αλλά έχετε μπάρα φαγητού με 9 ή περισσότερα{*ICON_SHANK_01*}, η ζωή σας θα αναπληρωθεί αυτόματα. Όταν τρώτε κάτι, αναπληρώνεται η μπάρα φαγητού. - - - Όταν έχετε στο χέρι σας ένα τρόφιμο, πατήστε παρατεταμένα{*CONTROLLER_ACTION_USE*} για να το φάτε και να αναπληρώσετε την μπάρα φαγητού. Δεν μπορείτε να φάτε κάτι, αν η μπάρα φαγητού είναι γεμάτη. - - - Η μπάρα φαγητού έχει μειωθεί σε μεγάλο βαθμό και έχετε χάσει ζωή. Φάτε την μπριζόλα που έχετε στο απόθεμά σας για να αναπληρώσετε την μπάρα φαγητού και να θεραπευτείτε σταδιακά.{*ICON*}364{*/ICON*} - - - Μπορείτε να μετατρέψετε το ξύλο που έχει συλλέξει σε σανίδες. Ανοίξτε το περιβάλλον χρήστη κατασκευής για να τις κατασκευάσετε.{*PlanksIcon*} - - - Πολλές διαδικασίες δημιουργίας μπορεί να αποτελούνται από πολλά βήματα. Τώρα που έχετε μερικές σανίδες, μπορείτε να δημιουργήσετε περισσότερα αντικείμενα. Κατασκευάστε ένα τραπέζι δημιουργίας.{*CraftingTableIcon*} - - - Για να συλλέξετε πιο γρήγορα τους κύβους που χρειάζεστε, μπορείτε να δημιουργήσετε τα κατάλληλα εργαλεία για κάθε εργασία. Ορισμένα εργαλεία απαιτούν λαβές από ραβδιά. Δημιουργήστε τώρα μερικά ραβδιά.{*SticksIcon*} - - - Χρησιμοποιήστε το{*CONTROLLER_ACTION_LEFT_SCROLL*} και το{*CONTROLLER_ACTION_RIGHT_SCROLL*} για να αλλάξετε το αντικείμενο που κρατάτε. - - - Πατήστε το{*CONTROLLER_ACTION_USE*} για να χρησιμοποιήσετε και να τοποθετήσετε αντικείμενα. Μπορείτε να συλλέξετε και πάλι τα αντικείμενα που έχετε τοποθετήσει, αν τα εξορύξετε με το κατάλληλο εργαλείο. - - - Επιλέξτε το τραπέζι κατασκευής, σημαδέψτε με το σταυρόνημα το σημείο που θέλετε και πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε το τραπέζι κατασκευής. - - - Σημαδέψτε το τραπέζι κατασκευής με το σταυρόνημα και πατήστε{*CONTROLLER_ACTION_USE*} για να το ανοίξετε. - - - Με το φτυάρι, μπορείτε να σκάψετε πιο γρήγορα μαλακούς κύβους, όπως το χώμα και το χιόνι. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα και αντέχουν περισσότερο. Δημιουργήστε ένα ξύλινο φτυάρι.{*WoodenShovelIcon*} - - - Με το τσεκούρι, μπορείτε να κόψετε πιο γρήγορα δέντρα και ξύλινα πλακίδια. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα και αντέχουν περισσότερο. Δημιουργήστε ένα ξύλινο τσεκούρι.{*WoodenHatchetIcon*} - - - Με την αξίνα, μπορείτε να σκάψετε πιο γρήγορα σκληρούς κύβους, όπως πέτρα και μεταλλεύματα. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα, αντέχουν περισσότερο και σας επιτρέπουν να εξορύσσετε πιο σκληρά υλικά. Δημιουργήστε μια ξύλινη αξίνα.{*WoodenPickaxeIcon*} - - - Ανοίξτε το δοχείο - - - - Η νύχτα μπορεί να φτάσει πριν το καταλάβατε, για αυτό δεν πρέπει να βρίσκεστε έξω αν δεν έχετε προετοιμαστεί κατάλληλα. Μπορείτε να δημιουργήσετε πανοπλία και όπλα, αλλά το πιο σημαντικό είναι να έχετε ένα ασφαλές καταφύγιο. - - - + - Εδώ κοντά βρίσκεται ένα εγκαταλελειμμένο καταφύγιο Μεταλλωρύχων που μπορείτε να επισκευάσετε για να προστατευτείτε τη νύχτα. + Σε αυτήν την περιοχή, έχει στηθεί μια φάρμα. Οι γεωργικές ασχολίες σάς δίνουν τη δυνατότητα να δημιουργείτε ανανεώσιμες πηγές τροφών και άλλα αντικείμενα. - + - Θα πρέπει να συλλέξετε τα υλικά που χρειάζονται για την επισκευή του καταφυγίου. Μπορείτε να κατασκευάσετε τοίχους και οροφή από οποιονδήποτε τύπο πλακιδίου, αλλά θα πρέπει επίσης να δημιουργήσετε μια πόρτα, μερικά παράθυρα και κάποια πηγή φωτισμού. + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις γεωργικές ασχολίες.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις γεωργικές ασχολίες. - - Χρησιμοποιήστε την αξίνα σας για να εξορύξετε μερικούς κύβους πέτρας. Όταν εξορύσετε κύβους πέτρας, αυτοί παράγουν πέτρα επίστρωσης. Αν συλλέξετε 8 κύβους πέτρας επίστρωσης, μπορείτε να κατασκευάσετε ένα φούρνο. Ενδεχομένως να πρέπει να σκάψετε λίγο στο χώμα για να βρείτε πέτρα, επομένως θα χρειαστείτε το φτυάρι σας.{*StoneIcon*} + + Το Σιτάρι, οι Κολοκύθες και τα Καρπούζια καλλιεργούνται φυτεύοντας σπόρους. Η συλλογή των σπόρων σιταριού γίνεται κόβοντας Ψηλό Γρασίδι ή θερίζοντας σιτάρι, ενώ οι Σπόροι Κολοκύθας και Καρπουζιού δημιουργούνται από Κολοκύθες και Καρπούζια αντίστοιχα. - - Έχετε συλλέξει αρκετή πέτρα επίστρωσης για να κατασκευάσετε ένα φούρνο. Δημιουργήστε τον με το τραπέζι κατασκευής. + + Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη αποθέματος δημιουργίας. - - Πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε το φούρνο στον κόσμο και ανοίξτε τον. + + Για να συνεχίσετε, πρέπει να φτάσετε στην αντίθετη πλευρά αυτής της τρύπας. - - Χρησιμοποιήστε το φούρνο για να δημιουργήσετε ξυλοκάρβουνο. Ενώ περιμένετε, γιατί δεν συγκεντρώνετε περισσότερα υλικά για να ολοκληρώσετε το καταφύγιο; + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τη λειτουργία Δημιουργίας. - - Χρησιμοποιήστε το φούρνο για να δημιουργήσετε γυαλί. Ενώ περιμένετε, γιατί δεν συγκεντρώνετε περισσότερα υλικά για να ολοκληρώσετε το καταφύγιο; + + Πριν από τη φύτευση των σπόρων, θα πρέπει να μετατραπούν οι κύβοι χώματος σε Αγρόκτημα με τη βοήθεια ενός Σκαλιστηριού. Μια κοντινή πηγή νερού θα συμβάλλει στο καλό πότισμα του Αγροκτήματος και τη γρήγορη ανάπτυξη της σοδειάς, όπως επίσης και η διασφάλιση φωτός για την περιοχή. - - Τα σωστά καταφύγια διαθέτουν πόρτες που σας επιτρέπουν να μπαινοβγαίνετε, χωρίς να πρέπει να σκάβετε και να ξαναχτίζετε τους τοίχους. Δημιουργήστε μια ξύλινη πόρτα τώρα.{*WoodenDoorIcon*} + + Οι Κάκτοι πρέπει να φυτεύονται στην Άμμο και μεγαλώνοντας το ύψος του μπορεί να φτάσει έως και τρεις κύβους. Όπως συμβαίνει με τα Ζαχαροκάλαμα, εάν καταστρέψετε τον χαμηλότερο κύβο, θα μπορείτε να συλλέξετε τους κύβους από επάνω του.{*ICON*}81{*/ICON*} - - Πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε την πόρτα. Μπορείτε να χρησιμοποιήσετε το {*CONTROLLER_ACTION_USE*} για να ανοίξετε και να κλείσετε τις ξύλινες πόρτες που βρίσκετε στον κόσμο. + + Τα Μανιτάρια πρέπει να φυτεύονται σε περιοχή με λίγο φως. Εξαπλώνονται στις κοντινές, φτωχά φωτισμένες περιοχές.{*ICON*}39{*/ICON*} - - Τη νύχτα το σκοτάδι είναι πολύ πυκνό, επομένως θα χρειαστείτε κάποια πηγή φωτισμού στο καταφύγιο για να μπορείτε να βλέπετε. Δημιουργήστε έναν πυρσό από ραβδιά και ξυλοκάρβουνο στο περιβάλλον χρήστη κατασκευής.{*TorchIcon*} + + Η Πάστα Οστών μπορεί να χρησιμοποιηθεί για την πλήρη ανάπτυξη των σοδειών ή για την καλλιέργεια Μανιταριών ώστε να γίνουν Τεράστια Μανιτάρια.{*ICON*}351:15{*/ICON*} - - - Έχετε ολοκληρώσει το πρώτο μέρος του εκπαιδευτικού οδηγού. - + + Το Σιτάρι περνάει από αρκετά στάδια κατά την ανάπτυξή του και είναι έτοιμο για συγκομιδή όταν είναι πιο σκούρο.{*ICON*}59:7{*/ICON*} - - - {*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*} για να επιλέξετε τον τύπο ομάδας του αντικειμένου που θέλετε να επιλέξετε. - - - - - Εάν θέλετε περισσότερες πληροφορίες σχετικά με ένα αντικείμενο, μετακινήστε το δείκτη επάνω από το αντικείμενο και πατήστε{*CONTROLLER_VK_BACK*} . - - - - - Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το απόθεμα της λειτουργίας δημιουργίας. - - - - - Αυτό είναι το περιβάλλον χρήστη κατασκευής. Αυτή η οθόνη σάς επιτρέπει να συνδυάζετε τα αντικείμενα που έχετε συλλέξει για να κατασκευάσετε νέα αντικείμενα. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να κατασκευάσετε αντικείμενα. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστεί η περιγραφή του αντικειμένου. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστούν τα συστατικά που απαιτούνται για την κατασκευή του τρέχοντος αντικειμένου. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστεί ξανά το απόθεμα. - - - - - Πραγματοποιήστε κύλιση στις καρτέλες Τύπου Ομάδας στην επάνω πλευρά χρησιμοποιώντας το{*CONTROLLER_VK_LB*} και το{*CONTROLLER_VK_RB*} για να επιλέξετε τον τύπο ομάδας του αντικειμένου που θέλετε να κατασκευάσετε και έπειτα χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να επιλέξετε το αντικείμενο που θα κατασκευάσετε. - - - - - Η περιοχή κατασκευής εμφανίζει τα αντικείμενα που χρειάζεστε για να κατασκευάσετε το νέο αντικείμενο. Πατήστε{*CONTROLLER_VK_A*} για να κατασκευάσετε το αντικείμενο και να το τοποθετήσετε στο απόθεμά σας. - - - - - Μπορείτε να κατασκευάσετε μια μεγαλύτερη συλλογή αντικειμένων χρησιμοποιώντας ένα τραπέζι κατασκευής. Η κατασκευή σε τραπέζι λειτουργεί όπως και η βασική κατασκευή, αλλά έχετε μεγαλύτερη επιφάνεια κατασκευής που καθιστά δυνατή την πραγματοποίηση περισσότερων συνδυασμών συστατικών. - - - - - Στο κάτω δεξιό μέρος του περιβάλλοντος χρήστη κατασκευής, εμφανίζεται το απόθεμά σας. Σε αυτήν την περιοχή, μπορεί επίσης να εμφανίζεται μια περιγραφή του τρέχοντος επιλεγμένου στοιχείου, καθώς και τα συστατικά που απαιτούνται για την κατασκευή του. - - - - - Τώρα προβάλλεται η περιγραφή του τρέχοντος επιλεγμένου αντικειμένου. Η περιγραφή μπορεί να σας δώσει μια ιδέα σχετικά με τις πιθανές χρήσεις του αντικειμένου. - - - - - Τώρα προβάλλεται η λίστα συστατικών που απαιτούνται για τη δημιουργία του επιλεγμένου αντικειμένου. - - - - Μπορείτε να μετατρέψετε το ξύλο που έχει συλλέξει σε σανίδες. Επιλέξτε το εικονίδιο με τις σανίδες και πατήστε{*CONTROLLER_VK_A*} για να τις δημιουργήσετε.{*PlanksIcon*} - - - - Τώρα κατασκευάσατε ένα τραπέζι κατασκευής που θα πρέπει να τοποθετήσετε στον κόσμο για να μπορείτε να κατασκευάσετε μια μεγαλύτερη συλλογή αντικειμένων.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. - - - - - Πατήστε{*CONTROLLER_VK_LB*} και{*CONTROLLER_VK_RB*} για να αλλάξετε τον τύπο ομάδας των αντικειμένων που θέλετε να κατασκευάσετε. Επιλέξτε την ομάδα εργαλείων.{*ToolsIcon*} - - - - - Πατήστε{*CONTROLLER_VK_LB*} και{*CONTROLLER_VK_RB*} για να αλλάξετε τον τύπο ομάδας των αντικειμένων που θέλετε να κατασκευάσετε. Επιλέξτε την ομάδα κατασκευών.{*StructuresIcon*} - - - - - Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να αλλάξετε το αντικείμενο που θέλετε να κατασκευάσετε. Ορισμένα αντικείμενα έχουν περισσότερες από μία εκδοχές, ανάλογα με τα υλικά που χρησιμοποιούνται. Επιλέξτε το ξύλινο φτυάρι.{*WoodenShovelIcon*} - - - - - Πολλές διαδικασίες κατασκευής μπορεί να αποτελούνται από πολλά βήματα. Τώρα που έχετε μερικές σανίδες, μπορείτε να κατασκευάσετε περισσότερα αντικείμενα. Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να αλλάξετε το αντικείμενο που θέλετε να κατασκευάσετε. Επιλέξτε το τραπέζι κατασκευής.{*CraftingTableIcon*} - - - - - Έχετε κάνει μια εξαιρετική αρχή με τα εργαλεία που έχετε κατασκευάσει και μπορείτε να συλλέγετε διάφορα υλικά με πιο αποτελεσματικό τρόπο.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. - - - - - Ορισμένα αντικείμενα δεν μπορούν να δημιουργηθούν χρησιμοποιώντας το τραπέζι κατασκευής και απαιτείται φούρνος. Κατασκευάστε έναν φούρνο τώρα.{*FurnaceIcon*} - - - - - Τοποθετήστε το φούρνο που κατασκευάσατε στον κόσμο. Καλό θα ήταν να τον βάλετε στο καταφύγιό σας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. - - - - - Αυτό είναι το περιβάλλον χρήστη φούρνου. Ο φούρνος επιτρέπει την αλλαγή αντικειμένων φλογίζοντάς τα. Για παράδειγμα, μπορείτε να μετατρέψετε κομμάτια σιδήρου σε ράβδους σιδήρου στο φούρνο. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε το φούρνο. - - - - - Πρέπει να βάλετε καύσιμο στο κάτω μέρος του φούρνου και στη συνέχεια, το αντικείμενο που θέλετε να αλλάξετε στο επάνω μέρος. Ο φούρνος τότε θα ανάψει και θα ξεκινήσει να δουλεύει. Το αποτέλεσμα βγαίνει στη δεξιά υποδοχή. - - - - - Μπορούν να χρησιμοποιηθούν ως καύσιμο πολλά ξύλινα αντικείμενα, αλλά δεν καίγονται όλα τα αντικείμενα στον ίδιο χρόνο. Μπορείτε επίσης να ανακαλύψετε άλλα αντικείμενα στον κόσμο που μπορούν να χρησιμοποιηθούν ως καύσιμο. - - - - - Όταν τα αντικείμενά σας φλογιστούν, μπορείτε να τα μετακινήσετε από την εξωτερική περιοχή στο απόθεμά σας. Θα πρέπει να πειραματιστείτε με διάφορα συστατικά για να δείτε τι μπορείτε να φτιάξετε. - - - - - Εάν χρησιμοποιήσετε ως συστατικό το ξύλο, τότε μπορείτε να φτιάξετε ξυλοκάρβουνο. Τοποθετήστε κάποιο καύσιμο στο φούρνο και το ξύλο στην υποδοχή συστατικών. Μπορεί να χρειαστεί μερική ώρα για να φτιάξει ο φούρνος το ξυλοκάρβουνο, οπότε μπορείτε να κάνετε κάποια άλλη εργασία και να επιστρέψετε αργότερα για να ελέγξετε την πρόοδο. - + + Τα Ζαχαροκάλαμα πρέπει να φυτεύονται σε κύβους Γρασιδιού, Χώματος ή Άμμου που βρίσκονται ακριβώς δίπλα σε κύβους νερού. Εάν κόψετε έναν κύβο Ζαχαροκάλαμου, θα πέσουν όλοι οι κύβοι που βρίσκονται από επάνω του.{*ICON*}83{*/ICON*} - - - Το ξυλοκάρβουνο μπορεί να χρησιμοποιηθεί ως καύσιμο, αλλά μπορεί και να μετατραπεί σε πυρσό μαζί με ένα ραβδί. - - - - - Εάν βάλετε άμμο στην υποδοχή συστατικών, μπορείτε να φτιάξετε γυαλί. Δημιουργήστε κομμάτια γυαλιού για να τα χρησιμοποιήσετε ως παράθυρα στο καταφύγιό σας. - - - - - Αυτό είναι το περιβάλλον χρήστη παρασκευής φίλτρων. Μπορείτε να το χρησιμοποιείτε για να δημιουργείτε φίλτρα με πολλές και διαφορετικές ιδιότητες. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε τη βάση παρασκευής φίλτρων. - - - - - Παρασκευάζετε φίλτρα τοποθετώντας ένα συστατικό στην επάνω υποδοχή και ένα μπουκαλάκι φίλτρου ή νερού στις κάτω υποδοχές (μπορούν να παρασκευαστούν έως 3 τη φορά). Μόλις τοποθετηθούν συστατικά που μπορούν να συνδυαστούν, ξεκινά η παρασκευαστική διαδικασία και, μετά από λίγη ώρα, δημιουργείται το φίλτρο. - - - - - Όλα τα φίλτρα ξεκινούμε με ένα Μπουκάλι Νερό. Τα περισσότερα φίλτρα δημιουργούνται χρησιμοποιώντας ως πρώτο υλικό ένα Φυτό Nether για τη δημιουργία ενός Δυσάρεστου Φίλτρου, ενώ απαιτείται τουλάχιστον ένα ακόμα συστατικό για τη δημιουργία του τελικού φίλτρου. - - - - - Όταν παρασκευάζετε ένα φίλτρο, μπορείτε να τροποποιήσετε τις ιδιότητές του. Με την προσθήκη Σκόνης Κοκκινόπετρας, αυξάνεται η διάρκεια των ιδιοτήτων του, ενώ με την προσθήκη Σκόνης Λαμψόπετρας, μπορούν να ενισχυθούν οι ιδιότητές του. - - - - - Με την προσθήκη Ζυμωμένου Ματιού Αράχνης, χαλάει η σύσταση του φίλτρου, το οποίο μπορεί να γίνει φίλτρο με αντίθετες ιδιότητες, ενώ με την προσθήκη Πυρίτιδας, το φίλτρο γίνεται Φίλτρο Εκτόξευσης, το οποίο μπορεί να πεταχθεί για να εφαρμοστούν οι ιδιότητές του σε μια κοντινή περιοχή. - - - - - Δημιουργήστε ένα Φίλτρο Πυραντίστασης προσθέτοντας πρώτα το Φυτό Nether σε ένα Μπουκάλι Νερό και έπειτα προσθέτοντας την Κρέμα Μάγματος. - - - - - Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη παρασκευής φίλτρων. - - - - - Σε αυτήν την περιοχή, υπάρχει μια Βάση Παρασκευής Φίλτρων, ένα Καζάνι και ένα σεντούκι γεμάτο υλικά για την παρασκευή φίλτρων. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις παρασκευαστικές διαδικασίες και τα φίλτρα. - - - - - Το πρώτο βήμα για την παρασκευή ενός φίλτρου είναι η δημιουργία ενός Μπουκαλιού Νερού. Πάρτε από το σεντούκι ένα Γυάλινο Μπουκάλι. - - - - - Μπορείτε να γεμίσετε ένα γυάλινο μπουκάλι από ένα Καζάνι που περιέχει νερό ή από έναν κύβο νερού. Γεμίστε το γυάλινο μπουκάλι τώρα τοποθετώντας το δείκτη σε μια πηγή νερού και πατώντας{*CONTROLLER_ACTION_USE*}. - - - - - Εάν αδειάσει ένα καζάνι, μπορείτε να το γεμίσετε ξανά με έναν Κουβά Νερό. - - - - - Χρησιμοποιήστε τη Βάση Παρασκευής για να δημιουργήσετε ένα Φίλτρο Πυραντίστασης. Θα χρειαστείτε ένα Μπουκάλι Νερού, Φυτό Nether και Κρέμα Μάγματος. - - - - - Κρατώντας ένα φίλτρο στο χέρι σας, πατήστε παρατεταμένα{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε. Για ένα κανονικό φίλτρο, θα το πιείτε και οι ιδιότητές του θα εφαρμοστούν σε εσάς, ενώ για ένα Φίλτρο Εκτόξευσης, θα το πετάξετε και οι ιδιότητές του θα εφαρμοστούν στα πλάσματα που βρίσκονται κοντά στο σημείο που θα πέσει. - Μπορείτε να δημιουργήσετε Φίλτρα Εκτόξευσης προσθέτοντας πυρίτιδα σε κανονικά φίλτρα. - - - - - Χρησιμοποιήστε το Φίλτρο Πυραντίστασης στον εαυτό σας. - - - - - Τώρα που είστε ανθεκτικοί στη φωτιά και τη λάβα, καλό θα ήταν να εξερευνήσετε εάν υπάρχουν μέρη τα οποία δεν μπορούσατε να επισκεφτείτε μέχρι τώρα. - - - - - Αυτό είναι το περιβάλλον χρήστη μαγέματος το οποίο μπορείτε να χρησιμοποιείτε για να προσθέτετε μαγικές ιδιότητες σε όπλα, πανοπλίες και ορισμένα εργαλεία. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη μαγέματος.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με το περιβάλλον χρήστη μαγέματος. - - - - - Για να μαγέψετε ένα αντικείμενο, πρώτα τοποθετήστε το στην υποδοχή μαγέματος. Μπορείτε να μαγέψετε όπλα, πανοπλίες και ορισμένα εργαλεία για να τους δώσετε ειδικές δυνάμεις, όπως βελτιωμένη αντίσταση στη ζημιά ή αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους. - - - - - Όταν ένα αντικείμενο τοποθετείται στην υποδοχή μαγέματος, τα κουμπιά στη δεξιά πλευρά αλλάζουν και παρέχουν μια ευρεία γκάμα διάφορων ειδών μαγέματος. - - - - - Ο αριθμός στο κουμπί αναπαριστά το κόστος σε επίπεδα εμπειρίας που θα εφαρμόσει το συγκεκριμένο είδος μαγέματος στο αντικείμενο. Εάν δεν έχετε αρκετά υψηλό επίπεδο, το κουμπί θα είναι απενεργοποιημένο. - - - - - Επιλέξτε ένα είδος μαγέματος και πατήστε{*CONTROLLER_VK_A*} για να μαγέψετε το αντικείμενο. Αυτό θα έχει ως αποτέλεσμα τη μείωση του επιπέδου εμπειρίας σας βάσει του κόστους του μαγέματος. - - - - - Τα διάφορα μαγέματα είναι εντελώς τυχαία, ωστόσο, ορισμένα καλύτερα είδη μαγέματος είναι διαθέσιμα μόνο όταν έχετε υψηλό επίπεδο εμπειρίας και έχετε πολλές βιβλιοθήκες γύρω από το Τραπέζι Μαγέματος, για να αυξηθεί η δύναμή του. - - - - - Σε αυτήν την περιοχή, υπάρχει ένα Τραπέζι Μαγέματος και ορισμένα άλλα αντικείμενα που θα σας βοηθήσουν να εξοικειωθείτε με τη διαδικασία του μαγέματος. - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το μάγεμα.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη διαδικασία του μαγέματος. - - - - - Με τη χρήση του Τραπεζιού Μαγέματος, μπορείτε να προσθέτετε ειδικές δυνάμεις, όπως αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους ή βελτιωμένη αντίσταση ζημιάς, σε όπλα, πανοπλίες και ορισμένα εργαλεία. - - - - - Η τοποθέτηση βιβλιοθηκών γύρω από το Τραπέζι Μαγέματος αυξάνει τη δύναμή του και καθιστά δυνατή την πρόσβαση σε μαγέματα υψηλότερου επιπέδου. - - - - - Η άσκηση μαγέματος αφαιρείται από τα Επίπεδα Εμπειρίας, τα οποία μπορείτε να συγκεντρώσετε συλλέγοντας Σφαίρες Εμπειρίας. Αυτές προκύπτουν με την εξολόθρευση τεράτων, την εξόρυξη μεταλλευμάτων, την εκτροφή ζώων, το ψάρεμα, το λιώσιμο/μαγείρεμα πραγμάτων στο φούρνο. - - - - - Μπορείτε επίσης να συγκεντρώνετε Επίπεδα Εμπειρίας χρησιμοποιώντας ένα Μπουκάλι Μαγέματος, το οποίο όταν το πετάτε, δημιουργούνται Σφαίρες Εμπειρίας στο σημείο όπου προσγειώνεται. Στη συνέχεια, μπορείτε να συλλέγετε αυτές τις σφαίρες. - - - - - Στα σεντούκια αυτής της περιοχής, μπορείτε να βρείτε ορισμένα μαγεμένα αντικείμενα, Μπουκάλια Μαγέματος και ορισμένα αντικείμενα που δεν έχουν ακόμα λάβει μαγικές ιδιότητες και μπορείτε να πειραματιστείτε μαζί τους στο Τραπέζι Μαγέματος. - - - - - Τώρα βρίσκεστε σε ένα βαγόνι ορυχείου. Για να βγείτε από το βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα βαγόνια ορυχείου.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα βαγόνια ορυχείου. - - - - - Τα βαγόνια ορυχείου κινούνται επάνω σε ράγες. Μπορείτε επίσης να κατασκευάσετε ένα ηλεκτροκίνητο βαγόνι τοποθετώντας στο φούρνο ένα βαγόνι που περιέχει ένα σεντούκι. - {*RailIcon*} - - - - - Μπορείτε επίσης να κατασκευάσετε ηλεκτρικές ράγες, οι οποίες τροφοδοτούνται από πυρσούς και κυκλώματα από κοκκινόπετρα για την επιτάχυνση του βαγονιού. Αυτές μπορούν να συνδεθούν σε διακόπτες, μοχλούς και πλάκες πίεσης για τη δημιουργία πιο σύνθετων συστημάτων. - {*PoweredRailIcon*} - - - - - Τώρα κουμαντάρετε μια βάρκα. Για να βγείτε από τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} - - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις βάρκες.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις βάρκες. - - - - - Με τις βάρκες, μπορείτε να μετακινήστε πιο γρήγορα στο νερό. Μπορείτε να την κατευθύνετε χρησιμοποιώντας το{*CONTROLLER_ACTION_MOVE*} και το{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - - - Τώρα χρησιμοποιείτε ένα καλάμι ψαρέματος. Πατήστε{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε.{*FishingRodIcon*} - - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το ψάρεμα.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με το ψάρεμα. - - - - - Πατήστε{*CONTROLLER_ACTION_USE*} για να ρίξετε την πετονιά και να ξεκινήσετε να ψαρεύετε. Πατήστε{*CONTROLLER_ACTION_USE*} ξανά για να τραβήξετε πίσω την πετονιά. - {*FishingRodIcon*} - - - - - Εάν περιμένετε μέχρι να βυθιστεί ο φελλός κάτω από την επιφάνεια του νερού προτού τραβήξετε πίσω την πετονιά, μπορείτε να πιάσετε κάποιο ψάρι. Μπορείτε να φάτε τα ψάρια ωμά ή να τα μαγειρέψετε σε κάποιο φούρνο, για να αποκαταστήσετε την υγεία σας. - {*FishIcon*} - - - - - Όπως συμβαίνει και με άλλα εργαλεία, ένα καλάμι ψαρέματος έχει έναν καθορισμένο αριθμό χρήσεων. Αυτές οι χρήσεις, όμως, δεν περιορίζονται αποκλειστικά στο ψάρεμα. Θα πρέπει να πειραματιστείτε μαζί του για να δείτε τι άλλο μπορείτε να πιάσετε ή να ενεργοποιήσετε με αυτό... - {*FishingRodIcon*} - - - - - Αυτό είναι ένα κρεβάτι. Πατήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω του σε νυχτερινές ώρες, για να κοιμηθείτε το βράδυ και να ξυπνήσετε το πρωί.{*ICON*}355{*/ICON*} - - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα κρεβάτια.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη χρήση των κρεβατιών. - - - - - Τα κρεβάτια θα πρέπει να τοποθετούνται σε ένα ασφαλές, καλοφωτισμένο μέρος, για να μη σας ξυπνάνε τα τέρατα κατά τη διάρκεια της νύχτας. Έχοντας χρησιμοποιήσει κάποιο κρεβάτι, εάν πεθάνετε, θα αναγεννηθείτε στο συγκεκριμένο κρεβάτι. - {*ICON*}355{*/ICON*} - - - - - Εάν υπάρχουν άλλοι παίκτες στο παιχνίδι σας, θα πρέπει όλοι να βρίσκονται στο κρεβάτι τους την ίδια ώρα για να μπορέσουν όλοι οι χαρακτήρες να κοιμηθούν. - {*ICON*}355{*/ICON*} - - - - - Σε αυτήν την περιοχή, υπάρχουν ορισμένα απλά κυκλώματα Κοκκινόπετρας και Εμβόλων, καθώς και ένα σεντούκι με πολλά αντικείμενα για την επέκταση αυτών των κυκλωμάτων. - + + Όταν βρίσκεστε σε λειτουργία Δημιουργίας, έχετε απεριόριστο αριθμό διαθέσιμων αντικειμένων και κύβους, μπορείτε να καταστρέφετε κύβους με ένα κλικ χωρίς εργαλεία, είστε άτρωτοι και μπορείτε να πετάτε. - + - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα κυκλώματα Κοκκινόπετρας και των Εμβόλων.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα κυκλώματα Κοκκινόπετρας και των Εμβόλων. + Στο σεντούκι αυτής της περιοχής, υπάρχουν ορισμένα εξαρτήματα για τη δημιουργία κυκλωμάτων με έμβολα. Δοκιμάστε να χρησιμοποιήσετε ή να ολοκληρώσετε τα κυκλώματα σε αυτήν την περιοχή ή να δημιουργήσετε τα δικά σας. Υπάρχουν περισσότερα παραδείγματα εκτός της περιοχής εκπαίδευσης. - + - Οι Μοχλοί, τα Κουμπιά, οι Πλάκες Πίεσης και οι Πυρσοί Κοκκινόπετρας μπορούν όλα να τροφοδοτούν με ρεύμα τα κυκλώματα, είτε προσαρτώντας τα απευθείας επάνω στο αντικείμενο που θέλετε να ενεργοποιήσετε είτε συνδέοντάς τα με σκόνη Κοκκινόπετρας. + Σε αυτήν την περιοχή, υπάρχει μια Πύλη για τον κόσμο του Nether! - + - Η θέση και η κατεύθυνση στην οποία τοποθετείτε μια πηγή τροφοδοσίας μπορεί να αλλάξει τον τρόπο που επηρεάζει τους γύρω κύβους. Για παράδειγμα, μπορεί να σβηστεί ένας πυρσός Κοκκινόπετρας δίπλα σε έναν κύβο, εάν ο κύβος τροφοδοτείται από κάποια άλλη πηγή. + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις Πύλες και το Nether.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις Πύλες και το Nether. @@ -3313,41 +757,11 @@ Όταν τροφοδοτείται ένα Έμβολο, εκτείνεται σπρώχνοντας έως 12 κύβους. Όταν μαζεύονται, τα Έμβολα με Κόλλα μπορούν να τραβήξουν μαζί τους έναν κύβο από τα περισσότερα διαθέσιμα είδη. {*ICON*}33{*/ICON*} - - - - - Στο σεντούκι αυτής της περιοχής, υπάρχουν ορισμένα εξαρτήματα για τη δημιουργία κυκλωμάτων με έμβολα. Δοκιμάστε να χρησιμοποιήσετε ή να ολοκληρώσετε τα κυκλώματα σε αυτήν την περιοχή ή να δημιουργήσετε τα δικά σας. Υπάρχουν περισσότερα παραδείγματα εκτός της περιοχής εκπαίδευσης. - - - - - Σε αυτήν την περιοχή, υπάρχει μια Πύλη για τον κόσμο του Nether! - - - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις Πύλες και το Nether.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις Πύλες και το Nether. Οι Πύλες δημιουργούνται τοποθετώντας κύβους Οψιανού σε ένα πλαίσιο πλάτους τεσσάρων κύβων και ύψους πέντε κύβων. Οι γωνιακοί κύβοι δεν είναι υποχρεωτικοί. - - - - - Για να ενεργοποιήσετε μια Πύλη για το Nether, βάλτε φωτιά στους κύβους Οψιανού μέσα στο πλαίσιο χρησιμοποιώντας έναν Πυρόλιθο και Χάλυβα. Οι Πύλες μπορούν να απενεργοποιηθούν εάν χαλάσει το πλαίσιο, εάν προκύψει κάποια έκρηξη σε κοντινό μέρος ή περάσει κάποιο υγρό από μέσα τους. - - - - - Για να χρησιμοποιήσετε μια Πύλη για το Nether, μπείτε μέσα της. Η οθόνη σας θα γίνει μωβ και θα ακουστεί ένας ήχος. Μετά από μερικά δευτερόλεπτα, θα μεταφερθείτε σε μια άλλη διάσταση. - - - - - Το Nether είναι ένα μέρος γεμάτο κινδύνους και πολλή λάβα, αλλά μπορεί να σας φανεί χρήσιμο να συλλέξετε το Netherrack, το οποίο αν το ανάψετε μπορεί να καίει για πάντα, καθώς και για τη Λαμψόπετρας, που παράγει φως. @@ -3365,55 +779,75 @@ {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τη λειτουργία Δημιουργίας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη λειτουργία Δημιουργίας. - - Όταν βρίσκεστε σε λειτουργία Δημιουργίας, έχετε απεριόριστο αριθμό διαθέσιμων αντικειμένων και κύβους, μπορείτε να καταστρέφετε κύβους με ένα κλικ χωρίς εργαλεία, είστε άτρωτοι και μπορείτε να πετάτε. - - - Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη αποθέματος δημιουργίας. - - - Για να συνεχίσετε, πρέπει να φτάσετε στην αντίθετη πλευρά αυτής της τρύπας. - - - Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τη λειτουργία Δημιουργίας. - - + - Σε αυτήν την περιοχή, έχει στηθεί μια φάρμα. Οι γεωργικές ασχολίες σάς δίνουν τη δυνατότητα να δημιουργείτε ανανεώσιμες πηγές τροφών και άλλα αντικείμενα. + Για να ενεργοποιήσετε μια Πύλη για το Nether, βάλτε φωτιά στους κύβους Οψιανού μέσα στο πλαίσιο χρησιμοποιώντας έναν Πυρόλιθο και Χάλυβα. Οι Πύλες μπορούν να απενεργοποιηθούν εάν χαλάσει το πλαίσιο, εάν προκύψει κάποια έκρηξη σε κοντινό μέρος ή περάσει κάποιο υγρό από μέσα τους. - + - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις γεωργικές ασχολίες.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις γεωργικές ασχολίες. + Για να χρησιμοποιήσετε μια Πύλη για το Nether, μπείτε μέσα της. Η οθόνη σας θα γίνει μωβ και θα ακουστεί ένας ήχος. Μετά από μερικά δευτερόλεπτα, θα μεταφερθείτε σε μια άλλη διάσταση. - - Το Σιτάρι, οι Κολοκύθες και τα Καρπούζια καλλιεργούνται φυτεύοντας σπόρους. Η συλλογή των σπόρων σιταριού γίνεται κόβοντας Ψηλό Γρασίδι ή θερίζοντας σιτάρι, ενώ οι Σπόροι Κολοκύθας και Καρπουζιού δημιουργούνται από Κολοκύθες και Καρπούζια αντίστοιχα. - - - Πριν από τη φύτευση των σπόρων, θα πρέπει να μετατραπούν οι κύβοι χώματος σε Αγρόκτημα με τη βοήθεια ενός Σκαλιστηριού. Μια κοντινή πηγή νερού θα συμβάλλει στο καλό πότισμα του Αγροκτήματος και τη γρήγορη ανάπτυξη της σοδειάς, όπως επίσης και η διασφάλιση φωτός για την περιοχή. - - - Το Σιτάρι περνάει από αρκετά στάδια κατά την ανάπτυξή του και είναι έτοιμο για συγκομιδή όταν είναι πιο σκούρο.{*ICON*}59:7{*/ICON*} - - - Για τις Κολοκύθες και τα Καρπούζια, θα πρέπει να υπάρχει ένας κύβος δίπλα από το σημείο που φυτέψατε το σπόρο για να μπορέσει να μεγαλώσει το φρούτο, όταν μεγαλώσει το κοτσάνι. - - - Τα Ζαχαροκάλαμα πρέπει να φυτεύονται σε κύβους Γρασιδιού, Χώματος ή Άμμου που βρίσκονται ακριβώς δίπλα σε κύβους νερού. Εάν κόψετε έναν κύβο Ζαχαροκάλαμου, θα πέσουν όλοι οι κύβοι που βρίσκονται από επάνω του.{*ICON*}83{*/ICON*} - - - Οι Κάκτοι πρέπει να φυτεύονται στην Άμμο και μεγαλώνοντας το ύψος του μπορεί να φτάσει έως και τρεις κύβους. Όπως συμβαίνει με τα Ζαχαροκάλαμα, εάν καταστρέψετε τον χαμηλότερο κύβο, θα μπορείτε να συλλέξετε τους κύβους από επάνω του.{*ICON*}81{*/ICON*} - - - Τα Μανιτάρια πρέπει να φυτεύονται σε περιοχή με λίγο φως. Εξαπλώνονται στις κοντινές, φτωχά φωτισμένες περιοχές.{*ICON*}39{*/ICON*} - - - Η Πάστα Οστών μπορεί να χρησιμοποιηθεί για την πλήρη ανάπτυξη των σοδειών ή για την καλλιέργεια Μανιταριών ώστε να γίνουν Τεράστια Μανιτάρια.{*ICON*}351:15{*/ICON*} + + + Το Nether είναι ένα μέρος γεμάτο κινδύνους και πολλή λάβα, αλλά μπορεί να σας φανεί χρήσιμο να συλλέξετε το Netherrack, το οποίο αν το ανάψετε μπορεί να καίει για πάντα, καθώς και για τη Λαμψόπετρας, που παράγει φως. + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τις γεωργικές ασχολίες. + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα τσεκούρι για να κόψετε κορμούς δέντρων. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε μια αξίνα για να εξορύσσετε πέτρες και μεταλλεύματα. Μπορεί να χρειαστεί να φτιάξετε την αξίνα από καλύτερα υλικά για να εξάγετε πόρους από ορισμένους κύβους. + + + Ορισμένα εργαλεία είναι καλύτερα για επίθεση κατά των εχθρών. Συνιστάται η χρήση σπαθιού για τις επιθέσεις σας. + + + Τα Σιδερένια Γκόλεμ επίσης εμφανίζονται φυσικά για να προστατεύουν χωριά και σε περίπτωση που επιτεθείτε στους χωρικούς, θα αντεπιτεθούν. + + + Δεν μπορείτε να φύγετε από αυτήν την περιοχή μέχρι να ολοκληρώσετε τον εκπαιδευτικό οδηγό. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα φτυάρι για να εξορύσσετε μαλακά υλικά, όπως χώμα και άμμο. + + + Συμβουλή: Πατήστε παρατεταμένα {*CONTROLLER_ACTION_ACTION*}για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... + + + Στο σεντούκι δίπλα στο ποτάμι, υπάρχει μια βάρκα. Για να χρησιμοποιήσετε τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω στη βάρκα για να ανεβείτε επάνω. + + + Στο σεντούκι δίπλα στη λίμνη, υπάρχει ένα καλάμι ψαρέματος. Πάρτε το καλάμι από το σεντούκι και επιλέξτε το ως το τρέχον αντικείμενο στο χέρι σας για να το χρησιμοποιήσετε. + + + Αυτός ο πιο προηγμένος μηχανισμός εμβόλου δημιουργεί μια αυτοεπισκευαζόμενη γέφυρα! Πατήστε το κουμπί για να ενεργοποιηθεί και έπειτα παρακολουθήστε πώς αλληλεπιδρούν τα εξαρτήματα για να μάθετε περισσότερα. + + + Το εργαλείο που χρησιμοποιείτε έχει καταστραφεί. Κάθε φορά που χρησιμοποιείτε ένα εργαλείο, αυτό καταστρέφεται σιγά σιγά και στο τέλος διαλύεται. Η χρωματιστή μπάρα κάτω από το αντικείμενο στο απόθεμά σας δείχνει την τρέχουσα κατάσταση ζημιάς. + + + Πατήστε παρατεταμένα{*CONTROLLER_ACTION_JUMP*} για να κολυμπήσετε προς τα επάνω. + + + Σε αυτήν την περιοχή, υπάρχει ένα βαγόνι ορυχείου σε μια πλατφόρμα. Για να μπείτε στο βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} στο κουμπί για να μετακινήσετε το βαγόνι. + + + Τα Σιδερένια Γκόλεμ δημιουργούνται με τέσσερις Σιδερένιους Κύβους στο προβαλλόμενο μοτίβο, με μια κολοκύθα επάνω στον μεσαίο κύβο. Τα Σιδερένια Γκόλεμ επιτίθενται στους εχθρούς σας. + + + Δώστε Σιτάρι στις αγελάδες, τα mooshroom ή τα πρόβατα, Καρότα στα γουρούνια, Σπόρους Σιταριού ή Φυτά Nether στις κότες ή οποιοδήποτε είδος κρέατος στους λύκους και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να υπάρχει κοντά τους το οποίο βρίσκεται επίσης σε Λειτουργία Αγάπης. + + + Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μικρό ζωάκι θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο. + + + Αφού βρεθεί σε Λειτουργία Αγάπης, το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά. + Σε αυτήν την περιοχή, είναι συγκεντρωμένα ζώα. Μπορείτε να εκθρέψετε ζώα με σκοπό να αναπαραχθούν. @@ -3427,18 +861,20 @@ Για να αναπαραχθούν τα ζώα, θα πρέπει να τα ταΐζετε με την κατάλληλη τροφή για να ενεργοποιηθεί η "Λειτουργία Αγάπης". - - Δώστε Σιτάρι στις αγελάδες, τα mooshroom ή τα πρόβατα, Καρότα στα γουρούνια, Σπόρους Σιταριού ή Φυτά Nether στις κότες ή οποιοδήποτε είδος κρέατος στους λύκους και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να υπάρχει κοντά τους το οποίο βρίσκεται επίσης σε Λειτουργία Αγάπης. - - - Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μικρό ζωάκι θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο. - - - Αφού βρεθεί σε Λειτουργία Αγάπης, το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά. - Ορισμένα ζώα θα σας ακολουθήσουν, εάν έχετε την αγαπημένη τους τροφή στο χέρι σας. Αυτό κάνει εύκολη τη συγκέντρωση των ζώων σε ένα μέρος για να αναπαραχθούν.{*ICON*}296{*/ICON*} + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα Γκόλεμ.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα Γκόλεμ. + + + + Τα Γκόλεμ δημιουργούνται με την τοποθέτηση μιας κολοκύθας επάνω σε μια στοίβα κύβων. + + + Τα Γκόλεμ του Χιονιού δημιουργούνται με δύο Κύβους Χιονιού, ο ένας επάνω στον άλλο, με μια κολοκύθα στην κορυφή. Τα Γκόλεμ του Χιονιού πετάνε χιονόμπαλες στους εχθρούς σας. + Μπορείτε να εξημερώσετε τους άγριους λύκους δίνοντάς τους κόκαλα. Μόλις εξημερωθούν, εμφανίζονται Καρδιές Αγάπης τριγύρω τους. Οι εξημερωμένοι λύκοι ακολουθούν τον παίκτη και τον υπερασπίζονται, εάν δεν τους έχει δοθεί εντολή να κάτσουν κάτω. @@ -3452,62 +888,514 @@ Σε αυτήν την περιοχή, υπάρχουν ορισμένες κολοκύθες και κύβοι για να δημιουργήσετε ένα Γκόλεμ του Χιονιού και ένα Σιδερένιο Γκόλεμ. - + - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα Γκόλεμ.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα Γκόλεμ. + Η θέση και η κατεύθυνση στην οποία τοποθετείτε μια πηγή τροφοδοσίας μπορεί να αλλάξει τον τρόπο που επηρεάζει τους γύρω κύβους. Για παράδειγμα, μπορεί να σβηστεί ένας πυρσός Κοκκινόπετρας δίπλα σε έναν κύβο, εάν ο κύβος τροφοδοτείται από κάποια άλλη πηγή. - - Τα Γκόλεμ δημιουργούνται με την τοποθέτηση μιας κολοκύθας επάνω σε μια στοίβα κύβων. + + + Εάν αδειάσει ένα καζάνι, μπορείτε να το γεμίσετε ξανά με έναν Κουβά Νερό. + - - Τα Γκόλεμ του Χιονιού δημιουργούνται με δύο Κύβους Χιονιού, ο ένας επάνω στον άλλο, με μια κολοκύθα στην κορυφή. Τα Γκόλεμ του Χιονιού πετάνε χιονόμπαλες στους εχθρούς σας. + + + Χρησιμοποιήστε τη Βάση Παρασκευής για να δημιουργήσετε ένα Φίλτρο Πυραντίστασης. Θα χρειαστείτε ένα Μπουκάλι Νερού, Φυτό Nether και Κρέμα Μάγματος. + - - Τα Σιδερένια Γκόλεμ δημιουργούνται με τέσσερις Σιδερένιους Κύβους στο προβαλλόμενο μοτίβο, με μια κολοκύθα επάνω στον μεσαίο κύβο. Τα Σιδερένια Γκόλεμ επιτίθενται στους εχθρούς σας. + + + Κρατώντας ένα φίλτρο στο χέρι σας, πατήστε παρατεταμένα{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε. Για ένα κανονικό φίλτρο, θα το πιείτε και οι ιδιότητές του θα εφαρμοστούν σε εσάς, ενώ για ένα Φίλτρο Εκτόξευσης, θα το πετάξετε και οι ιδιότητές του θα εφαρμοστούν στα πλάσματα που βρίσκονται κοντά στο σημείο που θα πέσει. + Μπορείτε να δημιουργήσετε Φίλτρα Εκτόξευσης προσθέτοντας πυρίτιδα σε κανονικά φίλτρα. + - - Τα Σιδερένια Γκόλεμ επίσης εμφανίζονται φυσικά για να προστατεύουν χωριά και σε περίπτωση που επιτεθείτε στους χωρικούς, θα αντεπιτεθούν. + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις παρασκευαστικές διαδικασίες και τα φίλτρα. + - - Δεν μπορείτε να φύγετε από αυτήν την περιοχή μέχρι να ολοκληρώσετε τον εκπαιδευτικό οδηγό. + + + Το πρώτο βήμα για την παρασκευή ενός φίλτρου είναι η δημιουργία ενός Μπουκαλιού Νερού. Πάρτε από το σεντούκι ένα Γυάλινο Μπουκάλι. + - - Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα φτυάρι για να εξορύσσετε μαλακά υλικά, όπως χώμα και άμμο. + + + Μπορείτε να γεμίσετε ένα γυάλινο μπουκάλι από ένα Καζάνι που περιέχει νερό ή από έναν κύβο νερού. Γεμίστε το γυάλινο μπουκάλι τώρα τοποθετώντας το δείκτη σε μια πηγή νερού και πατώντας{*CONTROLLER_ACTION_USE*}. + - - Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα τσεκούρι για να κόψετε κορμούς δέντρων. + + + Χρησιμοποιήστε το Φίλτρο Πυραντίστασης στον εαυτό σας. + - - Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε μια αξίνα για να εξορύσσετε πέτρες και μεταλλεύματα. Μπορεί να χρειαστεί να φτιάξετε την αξίνα από καλύτερα υλικά για να εξάγετε πόρους από ορισμένους κύβους. + + + Για να μαγέψετε ένα αντικείμενο, πρώτα τοποθετήστε το στην υποδοχή μαγέματος. Μπορείτε να μαγέψετε όπλα, πανοπλίες και ορισμένα εργαλεία για να τους δώσετε ειδικές δυνάμεις, όπως βελτιωμένη αντίσταση στη ζημιά ή αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους. + - - Ορισμένα εργαλεία είναι καλύτερα για επίθεση κατά των εχθρών. Συνιστάται η χρήση σπαθιού για τις επιθέσεις σας. + + + Όταν ένα αντικείμενο τοποθετείται στην υποδοχή μαγέματος, τα κουμπιά στη δεξιά πλευρά αλλάζουν και παρέχουν μια ευρεία γκάμα διάφορων ειδών μαγέματος. + - - Συμβουλή: Πατήστε παρατεταμένα {*CONTROLLER_ACTION_ACTION*}για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... + + + Ο αριθμός στο κουμπί αναπαριστά το κόστος σε επίπεδα εμπειρίας που θα εφαρμόσει το συγκεκριμένο είδος μαγέματος στο αντικείμενο. Εάν δεν έχετε αρκετά υψηλό επίπεδο, το κουμπί θα είναι απενεργοποιημένο. + - - Το εργαλείο που χρησιμοποιείτε έχει καταστραφεί. Κάθε φορά που χρησιμοποιείτε ένα εργαλείο, αυτό καταστρέφεται σιγά σιγά και στο τέλος διαλύεται. Η χρωματιστή μπάρα κάτω από το αντικείμενο στο απόθεμά σας δείχνει την τρέχουσα κατάσταση ζημιάς. + + + Τώρα που είστε ανθεκτικοί στη φωτιά και τη λάβα, καλό θα ήταν να εξερευνήσετε εάν υπάρχουν μέρη τα οποία δεν μπορούσατε να επισκεφτείτε μέχρι τώρα. + - - Πατήστε παρατεταμένα{*CONTROLLER_ACTION_JUMP*} για να κολυμπήσετε προς τα επάνω. + + + Αυτό είναι το περιβάλλον χρήστη μαγέματος το οποίο μπορείτε να χρησιμοποιείτε για να προσθέτετε μαγικές ιδιότητες σε όπλα, πανοπλίες και ορισμένα εργαλεία. + - - Σε αυτήν την περιοχή, υπάρχει ένα βαγόνι ορυχείου σε μια πλατφόρμα. Για να μπείτε στο βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} στο κουμπί για να μετακινήσετε το βαγόνι. + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη μαγέματος.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με το περιβάλλον χρήστη μαγέματος. + - - Στο σεντούκι δίπλα στο ποτάμι, υπάρχει μια βάρκα. Για να χρησιμοποιήσετε τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω στη βάρκα για να ανεβείτε επάνω. + + + Σε αυτήν την περιοχή, υπάρχει μια Βάση Παρασκευής Φίλτρων, ένα Καζάνι και ένα σεντούκι γεμάτο υλικά για την παρασκευή φίλτρων. + - - Στο σεντούκι δίπλα στη λίμνη, υπάρχει ένα καλάμι ψαρέματος. Πάρτε το καλάμι από το σεντούκι και επιλέξτε το ως το τρέχον αντικείμενο στο χέρι σας για να το χρησιμοποιήσετε. + + + Το ξυλοκάρβουνο μπορεί να χρησιμοποιηθεί ως καύσιμο, αλλά μπορεί και να μετατραπεί σε πυρσό μαζί με ένα ραβδί. + - - Αυτός ο πιο προηγμένος μηχανισμός εμβόλου δημιουργεί μια αυτοεπισκευαζόμενη γέφυρα! Πατήστε το κουμπί για να ενεργοποιηθεί και έπειτα παρακολουθήστε πώς αλληλεπιδρούν τα εξαρτήματα για να μάθετε περισσότερα. + + + Εάν βάλετε άμμο στην υποδοχή συστατικών, μπορείτε να φτιάξετε γυαλί. Δημιουργήστε κομμάτια γυαλιού για να τα χρησιμοποιήσετε ως παράθυρα στο καταφύγιό σας. + + + + + Αυτό είναι το περιβάλλον χρήστη παρασκευής φίλτρων. Μπορείτε να το χρησιμοποιείτε για να δημιουργείτε φίλτρα με πολλές και διαφορετικές ιδιότητες. + + + + + Μπορούν να χρησιμοποιηθούν ως καύσιμο πολλά ξύλινα αντικείμενα, αλλά δεν καίγονται όλα τα αντικείμενα στον ίδιο χρόνο. Μπορείτε επίσης να ανακαλύψετε άλλα αντικείμενα στον κόσμο που μπορούν να χρησιμοποιηθούν ως καύσιμο. + + + + + Όταν τα αντικείμενά σας φλογιστούν, μπορείτε να τα μετακινήσετε από την εξωτερική περιοχή στο απόθεμά σας. Θα πρέπει να πειραματιστείτε με διάφορα συστατικά για να δείτε τι μπορείτε να φτιάξετε. + + + + + Εάν χρησιμοποιήσετε ως συστατικό το ξύλο, τότε μπορείτε να φτιάξετε ξυλοκάρβουνο. Τοποθετήστε κάποιο καύσιμο στο φούρνο και το ξύλο στην υποδοχή συστατικών. Μπορεί να χρειαστεί μερική ώρα για να φτιάξει ο φούρνος το ξυλοκάρβουνο, οπότε μπορείτε να κάνετε κάποια άλλη εργασία και να επιστρέψετε αργότερα για να ελέγξετε την πρόοδο. + + + + {*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*}, εάν είστε ήδη εξοικειωμένοι με τις βάρκες. + + + + + Με τη χρήση του Τραπεζιού Μαγέματος, μπορείτε να προσθέτετε ειδικές δυνάμεις, όπως αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους ή βελτιωμένη αντίσταση ζημιάς, σε όπλα, πανοπλίες και ορισμένα εργαλεία. + + + + + Η τοποθέτηση βιβλιοθηκών γύρω από το Τραπέζι Μαγέματος αυξάνει τη δύναμή του και καθιστά δυνατή την πρόσβαση σε μαγέματα υψηλότερου επιπέδου. + + + + + Η άσκηση μαγέματος αφαιρείται από τα Επίπεδα Εμπειρίας, τα οποία μπορείτε να συγκεντρώσετε συλλέγοντας Σφαίρες Εμπειρίας. Αυτές προκύπτουν με την εξολόθρευση τεράτων, την εξόρυξη μεταλλευμάτων, την εκτροφή ζώων, το ψάρεμα, το λιώσιμο/μαγείρεμα πραγμάτων στο φούρνο. + + + + + Τα διάφορα μαγέματα είναι εντελώς τυχαία, ωστόσο, ορισμένα καλύτερα είδη μαγέματος είναι διαθέσιμα μόνο όταν έχετε υψηλό επίπεδο εμπειρίας και έχετε πολλές βιβλιοθήκες γύρω από το Τραπέζι Μαγέματος, για να αυξηθεί η δύναμή του. + + + + + Σε αυτήν την περιοχή, υπάρχει ένα Τραπέζι Μαγέματος και ορισμένα άλλα αντικείμενα που θα σας βοηθήσουν να εξοικειωθείτε με τη διαδικασία του μαγέματος. + + + + {*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*}, εάν είστε ήδη εξοικειωμένοι με τα βαγόνια ορυχείου. + Εάν μετακινήσετε το δείκτη εκτός του περιβάλλοντος χρήστη ενώ μεταφέρετε ένα αντικείμενο, μπορείτε να ξεσκαρτάρετε το συγκεκριμένο αντικείμενο. + + Ανάγνωση + + + Κρέμασμα + + + Βολή + + + Άνοιγμα + + + Αλλαγή Τόνου + + + Πυροκρότηση + + + Φύτεμα + + + Ξεκλείδωμα Πλήρους Παιχνιδιού + + + Διαγραφή Αποθήκευσης + + + Διαγραφή + + + Όργωμα + + + Συγκομιδή + + + Συνέχεια + + + Κολύμπι προς τα Επάνω + + + Χτύπημα + + + Γάλα + + + Συλλογή + + + Άδειασμα + + + Σέλα + + + Τοποθέτηση + + + Τροφή + + + Ίππευση + + + Πλεύση + + + Καλλιέργεια + + + Ύπνος + + + Αφύπνιση + + + Παιχνίδι + + + Επιλογές + + + Μετακίνηση Πανοπλίας + + + Μετακίνηση Όπλου + + + Εξοπλισμός + + + Μετακίνηση Συστατικού + + + Μετακίνηση Καυσίμου + + + Μετακίνηση Εργαλείου + + + Τράβηγμα + + + Κύλιση Σελίδας προς τα Επάνω + + + Κύλιση Σελίδας προς τα Κάτω + + + Λειτουργία Αγάπης + + + Αποδέσμευση + + + Προνόμια + + + Αποκλεισμός + + + Δημιουργία + + + Επίπεδο Αποκλεισμού + + + Επιλογή Skin + + + Ανάφλεξη + + + Πρόσκληση Φίλων + + + Αποδοχή + + + Ψαλίδι + + + Περιήγηση + + + Επανεγκατάσταση + + + Επιλογές Αποθήκευσης + + + Εκτέλεση Εντολής + + + Εγκατάσταση Πλήρους Έκδοσης + + + Εγκατάσταση Δοκιμαστικής Έκδοσης + + + Εγκατάσταση + + + Εξαγωγή + + + Ανανέωση Λίστας Διαδικτυακών Παιχνιδιών + + + Ομαδικά Παιχνίδια + + + Όλα τα Παιχνίδια + + + Έξοδος + + + Ακύρωση + + + Ακύρωση Συμμετοχής + + + Αλλαγή Ομάδας + + + Κατασκευή + + + Δημιουργία + + + Λήψη/Τοποθέτηση + + + Προβολή Αποθέματος + + + Προβολή Περιγραφής + + + Προβολή Συστατικών + + + Πίσω + + + Υπενθύμιση: + + + + + + Έχουν προστεθεί νέες λειτουργίες στο παιχνίδι στην πιο πρόσφατη έκδοσή του, όπως ενδεικτικά νέες περιοχές στον κόσμο του εκπαιδευτικού οδηγού. + Δεν έχετε όλα τα συστατικά που απαιτούνται για να φτιάξετε αυτό το αντικείμενο. Το πλαίσιο κάτω αριστερά δείχνει τα συστατικά που απαιτούνται για να το φτιάξετε. @@ -3519,29 +1407,9 @@ {*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*}, εάν είστε ήδη εξοικειωμένοι με την μπάρα φαγητού και την κατανάλωση τροφών. @@ -3553,102 +1421,20 @@ Χρήση - - Πίσω + + Σε αυτήν την περιοχή, θα βρείτε περιοχές που έχουν διαμορφωθεί για να εξοικειωθείτε με το ψάρεμα, τις βάρκες, τα έμβολα και την κοκκινόπετρα. - - Έξοδος + + Έξω από αυτήν την περιοχή, θα βρείτε παραδείγματα κτισμάτων, γεωργικών ασχολιών, βαγονιών ορυχείου και πλατφορμών, ειδών μαγέματος, παρασκευής φίλτρων, ανταλλαγών, σιδηρουργικής και πολλών άλλων! - - Ακύρωση - - - Ακύρωση Συμμετοχής - - - Ανανέωση Λίστας Διαδικτυακών Παιχνιδιών - - - Ομαδικά Παιχνίδια - - - Όλα τα Παιχνίδια - - - Αλλαγή Ομάδας - - - Προβολή Αποθέματος - - - Προβολή Περιγραφής - - - Προβολή Συστατικών - - - Κατασκευή - - - Δημιουργία - - - Λήψη/Τοποθέτηση + + + Η μπάρα φαγητού έχει εξαντληθεί σε σημείο που δεν θα μπορέσετε να αναρρώσετε. + Λήψη - - Λήψη Όλων - - - Λήψη Μισής Ποσότητας - - - Τοποθέτηση - - - Τοποθέτηση Όλων - - - Τοποθέτηση Ενός Στοιχείου - - - Ξεσκαρτάρισμα - - - Ξεσκαρτάρισμα Όλων - - - Ξεσκαρτάρισμα Ενός Στοιχείου - - - Εναλλαγή - - - Γρήγορη Κίνηση - - - Απαλοιφή Γρήγορης Επιλογής - - - Τι Είναι Αυτό; - - - Κοινοποίηση στο Facebook - - - Αλλαγή Φίλτρου - - - Αποστολή Αιτήματος Φιλίας - - - Κύλιση Σελίδας προς τα Κάτω - - - Κύλιση Σελίδας προς τα Επάνω - Επόμενο @@ -3658,18 +1444,18 @@ Αποβολή Παίκτη + + Αποστολή Αιτήματος Φιλίας + + + Κύλιση Σελίδας προς τα Κάτω + + + Κύλιση Σελίδας προς τα Επάνω + Βαφή - - Εξόρυξη - - - Τάισμα - - - Εξημέρωση - Επούλωση @@ -3679,1070 +1465,829 @@ Ακολούθησέ με - - Εξαγωγή + + Εξόρυξη - - Άδειασμα + + Τάισμα - - Σέλα + + Εξημέρωση - + + Αλλαγή Φίλτρου + + + Τοποθέτηση Όλων + + + Τοποθέτηση Ενός Στοιχείου + + + Ξεσκαρτάρισμα + + + Λήψη Όλων + + + Λήψη Μισών + + Τοποθέτηση - - Χτύπημα + + Ξεσκαρτάρισμα Όλων - - Γάλα + + Απαλοιφή Επιλογής - - Συλλογή + + Τι Είναι Αυτό; - - Τροφή + + Κοινοποίηση στο Facebook - - Ύπνος + + Ξεσκαρτάρισμα Ενός Στοιχείου - - Αφύπνιση + + Εναλλαγή - - Παιχνίδι - - - Ίππευση - - - Πλεύση - - - Καλλιέργεια - - - Κολύμπι προς τα Επάνω - - - Άνοιγμα - - - Αλλαγή Τόνου - - - Πυροκρότηση - - - Ανάγνωση - - - Κρέμασμα - - - Βολή - - - Φύτεμα - - - Όργωμα - - - Συγκομιδή - - - Συνέχεια - - - Ξεκλείδωμα Πλήρους Παιχνιδιού - - - Διαγραφή Αποθήκευσης - - - Διαγραφή - - - Επιλογές - - - Πρόσκληση Φίλων - - - Αποδοχή - - - Ψαλίδι - - - Επίπεδο Αποκλεισμού - - - Επιλογή Skin - - - Ανάφλεξη - - - Περιήγηση - - - Εγκατάσταση Πλήρους Έκδοσης - - - Εγκατάσταση Δοκιμαστικής Έκδοσης - - - Εγκατάσταση - - - Επανεγκατάσταση - - - Επιλογές Αποθήκευσης - - - Εκτέλεση Εντολής - - - Δημιουργία - - - Μετακίνηση Συστατικού - - - Μετακίνηση Καυσίμου - - - Μετακίνηση Εργαλείου - - - Μετακίνηση Πανοπλίας - - - Μετακίνηση Όπλου - - - Εξοπλισμός - - - Τράβηγμα - - - Αποδέσμευση - - - Προνόμια - - - Αποκλεισμός - - - Κύλιση Σελίδας προς τα Επάνω - - - Κύλιση Σελίδας προς τα Κάτω - - - Λειτουργία Αγάπης - - - Ποτό - - - Περιστροφή - - - Απόκρυψη - - - Απαλοιφή Όλων των Υποδοχών - - - OK - - - Ακύρωση - - - Minecraft Store - - - Είστε σίγουροι ότι θέλετε να εγκαταλείψετε το τρέχον παιχνίδι σας και να συμμετάσχετε στο νέο; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - - Έξοδος από το Παιχνίδι - - - Αποθήκευση Παιχνιδιού - - - Έξοδος Χωρίς Αποθήκευση - - - Είστε σίγουροι ότι θέλετε να αντικαταστήσετε τυχόν προηγούμενα αποθηκευμένα δεδομένα αυτού του κόσμου με την τρέχουσα εκδοχή αυτού του κόσμου; - - - Είστε σίγουροι ότι θέλετε να βγείτε από το παιχνίδι χωρίς να το αποθηκεύσετε; Θα χάσετε όλη την πρόοδο που έχετε σημειώσει σε αυτόν τον κόσμο! - - - Έναρξη Παιχνιδιού - - - Βλάβη Δεδομένων Αποθήκευσης - - - Αυτά τα δεδομένα αποθήκευσης είναι κατεστραμμένα ή έχουν υποστεί βλάβη. Θα θέλατε να τα διαγράψετε; - - - Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού και να αποσυνδέσετε όλους τους παίκτες από το παιχνίδι; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - - Έξοδος και αποθήκευση - - - Έξοδος χωρίς αποθήκευση - - - Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - - Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Η πρόοδός σας θα χαθεί! - - - Δημιουργία Νέου Κόσμου - - - Αρχή Εκπαιδευτικού Μαθήματος - - - Εκπαιδευτικό Μάθημα - - - Ονομασία του Κόσμου σας - - - Εισαγάγετε ένα όνομα για τον κόσμο σας - - - Βάλτε τον seed για τη γενιά του κόσμου σας - - - Φόρτωση Αποθηκευμένου Κόσμου - - - START για να παίξετε - - - Έξοδος από το παιχνίδι - - - Προέκυψε σφάλμα. Μετάβαση στο βασικό μενού. - - - Η σύνδεση απέτυχε - - - Η σύνδεση χάθηκε - - - Η σύνδεση με τον διακομιστή χάθηκε. Μετάβαση στο βασικό μενού. - - - Αποσύνδεση από τον διακομιστή - - - Αποβληθήκατε από το παιχνίδι - - - Αποβληθήκατε από το παιχνίδι γιατί πετούσατε - - - Η προσπάθεια σύνδεσης είχε υπερβολικά μεγάλη διάρκεια - - - Ο διακομιστής είναι πλήρης - - - Ο οικοδεσπότης έχει βγει από το παιχνίδι. - - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί δεν είστε φίλος με κανέναν από τους συμμετέχοντες. - - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο οικοδεσπότης σας έχει αποβάλει από το παιχνίδι στο παρελθόν. - - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει παλαιότερη έκδοση του παιχνιδιού. - - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει νεότερη έκδοση του παιχνιδιού. - - - Νέος Κόσμος - - - Το Βραβείο Ξεκλειδώθηκε! - - - Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" του Steve από το Minecraft! - - - Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" ενός Creeper! - - - Ξεκλείδωμα Πλήρους Παιχνιδιού - - - Παίζετε τη δοκιμαστική έκδοση του παιχνιδιού, αλλά θα χρειαστείτε το πλήρες παιχνίδι για να μπορέσετε να αποθηκεύσετε την πρόοδό σας. -Θέλετε να ξεκλειδώσετε τώρα το πλήρες παιχνίδι; - - - Παρακαλώ περιμένετε - - - Δεν βρέθηκαν αποτελέσματα - - - Φίλτρο: - - - Φίλοι - - - Η Βαθμολογία μου - - - Συνολική - - - Συμμετοχές: - - - Κατάταξη - - - Προετοιμασία Αποθήκευσης Επιπέδου - - - Προετοιμασία Κομματιών... - - - Ολοκλήρωση... - - - Κατασκευή Πεδίου - - - Προσομοίωση κόσμου για λίγο - - - Προετοιμασία διακομιστή - - - Δημιουργία περιοχής spawn - - - Φόρτωση περιοχής spawn - - - Είσοδος στο Nether - - - Έξοδος από το Nether - - - Respawn - - - Δημιουργία επιπέδου - - - Φόρτωση επιπέδου - - - Αποθήκευση παικτών - - - Σύνδεση με τον οικοδεσπότη - - - Λήψη πεδίου - - - Μετάβαση στο παιχνίδι εκτός διαδικτύου - - - Περιμένετε έως ότου ο οικοδεσπότης αποθηκεύσει το παιχνίδι - - - Είσοδος στο END - - - Έξοδος από το END - - - Αυτό το κρεβάτι είναι κατειλημμένο - - - Μόνο τη νύχτα μπορείτε να κοιμηθείτε - - - Ο/Η %s κοιμάται σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. - - - Το κρεβάτι στο σπίτι σας έλειπε ή κάτι εμπόδιζε την πρόσβαση σε αυτό - - - Δεν μπορείτε να ξεκουραστείτε αυτή τη στιγμή, τριγυρίζουν τέρατα - - - Κοιμάστε σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. - - - Εργαλεία και Όπλα - - - Όπλα - - - Τροφή - - - Οικοδομήματα - - - Πανοπλία - - - Μηχανισμοί - - - Μεταφορά - - - Διακοσμητικά - - - Κύβοι για Κατασκευές - - - Κοκκινόπετρα και Μεταφορά - - - Διάφορα - - - Παρασκευή Φίλτρου - - - Εργαλεία, Όπλα και Πανοπλία - - - Υλικά - - - Αποσυνδέθηκε - - - Δυσκολία - - - Μουσική - - - Ήχος - - - Γάμμα - - - Ευαισθησία Παιχνιδιού - - - Ευαισθησία Περιβάλλοντος Χρήστη - - - Γαλήνιο - - - Εύκολο - - - Κανονικό - - - Δύσκολο - - - Σε αυτή τη λειτουργία, ο παίκτης ανακτά την υγεία του με την πάροδο του χρόνου και δεν υπάρχουν εχθροί στο περιβάλλον. - - - Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον, αλλά προκαλούν μικρότερες βλάβες στον παίκτη σε σχέση με τη λειτουργία Κανονικό. - - - Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν τυπικές βλάβες στον παίκτη. - - - Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν σοβαρές βλάβες στον παίκτη. Έχετε τον νου σας και στα Creepers, γιατί δύσκολα θα «ξεχάσουν» την εκρηκτική τους επίθεση, ακόμα και αφού απομακρυνθείτε! - - - Χρονικό Όριο Δοκιμαστικής Έκδοσης - - - Το παιχνίδι είναι πλήρες - - - Δεν ολοκληρώθηκε η συμμετοχή στο παιχνίδι, καθώς δεν υπάρχουν άλλες διαθέσιμες θέσεις - - - Εισαγωγή Κειμένου Πινακίδας - - - Εισαγάγετε ένα κείμενο για την πινακίδα σας - - - Εισαγωγή Τίτλου - - - Εισαγάγετε έναν τίτλο για τη δημοσίευσή σας - - - Εισαγωγή Λεζάντας - - - Εισαγάγετε μια λεζάντα για τη δημοσίευσή σας - - - Εισαγωγή Περιγραφής - - - Εισαγάγετε μια περιγραφή για τη δημοσίευσή σας - - - Απόθεμα - - - Συστατικά - - - Βάση Παρασκευής Φίλτρων - - - Σεντούκι - - - Μαγεία - - - Φούρνος - - - Συστατικό - - - Καύσιμο - - - Διανομέας - - - Δεν υπάρχουν προσφορές για περιεχόμενο με δυνατότητα λήψης αυτού του τύπου για τον συγκεκριμένο τίτλο αυτή τη στιγμή. - - - Ο/Η %s συμμετέχει στο παιχνίδι. - - - Ο/Η %s εγκατέλειψε το παιχνίδι. - - - Ο/Η %s αποβλήθηκε από το παιχνίδι. - - - Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αποθηκευμένο παιχνίδι; - - - Αναμονή έγκρισης - - - Λογοκριμένο - - - Παίζει τώρα: - - - - Επαναφορά Ρυθμίσεων - - - Είστε σίγουροι ότι θέλετε να επαναφέρετε τις ρυθμίσεις σας στις προεπιλεγμένες τιμές; - - - Σφάλμα Φόρτωσης - - - Παιχνίδι του/της %s - - - Παιχνίδι άγνωστου οικοδεσπότη - - - Ο προσκεκλημένος παίκτης αποσυνδέθηκε - - - Ένας προσκεκλημένος παίκτης αποσυνδέθηκε, προκαλώντας την απομάκρυνση όλων των προσκεκλημένων παικτών από το παιχνίδι. - - - Σύνδεση - - - Δεν έχετε συνδεθεί. Για να παίξετε αυτό το παιχνίδι, θα πρέπει να συνδεθείτε. Θέλετε να συνδεθείτε τώρα; - - - Δεν επιτρέπεται το παιχνίδι για πολλούς παίκτες - - - Αποτυχία δημιουργίας παιχνιδιού - - - Αυτόματη Επιλογή - - - Χωρίς Πακέτο: Προεπιλεγμένα Skin - - - Αγαπημένα Skin - - - Αποκλεισμένο Επίπεδο - - - Το παιχνίδι στο οποίο θα συμμετάσχετε βρίσκεται στη λίστα σας με αποκλεισμένα επίπεδα. -Εάν επιλέξετε να συμμετάσχετε στο παιχνίδι, το επίπεδο θα αφαιρεθεί από τη λίστα σας με αποκλεισμένα επίπεδα. - - - Αποκλεισμός Αυτού του Επιπέδου; - - - Είστε σίγουροι ότι θέλετε να προσθέσετε αυτό το επίπεδο στη λίστα σας με αποκλεισμένα επίπεδα; -Εάν επιλέξετε OK θα βγείτε και από το παιχνίδι. - - - Αφαίρεση από τη Λίστα Αποκλεισμένων - - - Διάστημα Αυτόματης Αποθήκευσης - - - Διάστημα Αυτόματης Αποθήκευσης: ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ - - - Λεπτά - - - Δεν Μπορείτε να την Τοποθετήσετε Εδώ! - - - Η τοποθέτηση λάβας κοντά στο σημείο spawn επιπέδου δεν επιτρέπεται, λόγω πιθανότητας άμεσου θανάτου των παικτών που κάνουν spawn. - - - Αδιαφάνεια Περιβάλλοντος Χρήστη - - - Προετοιμασία Αυτόματης Αποθήκευσης Επιπέδου - - - Μέγεθος HUD - - - Μέγεθος HUD (Διαχωρισμός Οθόνης) - - - Seed - - - Ξεκλείδωμα Πακέτου Skin - - - Για να χρησιμοποιήσετε την εμφάνιση που έχετε επιλέξει, πρέπει να ξεκλειδώσετε αυτό το πακέτο skin. -Θέλετε να ξεκλειδώσετε το πακέτο skin τώρα; - - - Ξεκλείδωμα Πακέτου με Υφές - - - Για να χρησιμοποιήσετε αυτό το πακέτο με υφές στον κόσμο σας, πρέπει να το ξεκλειδώσετε. -Θέλετε να το ξεκλειδώσετε τώρα; - - - Δοκιμαστικό Πακέτο με Υφές - - - Χρησιμοποιείτε μια δοκιμαστική έκδοση του πακέτου με υφές. Δεν θα μπορέσετε να αποθηκεύσετε αυτόν τον κόσμο αν δεν ξεκλειδώσετε την πλήρη έκδοση. -Θέλετε να ξεκλειδώσετε την πλήρη έκδοση του πακέτου με υφές; - - - Το Πακέτο με Υφές δεν Βρίσκεται Εδώ - - - Ξεκλείδωμα Πλήρους Έκδοσης - - - Λήψη Δοκιμαστικής Έκδοσης - - - Λήψη Πλήρους Έκδοσης - - - Αυτός ο κόσμος χρησιμοποιεί ένα μικτό πακέτο ή ένα πακέτο με υφές που δεν διαθέτετε! -Θέλετε να εγκαταστήσετε το μικτό πακέτο ή το πακέτο με υφές τώρα; - - - Απόκτηση Δοκιμαστικής Έκδοσης - - - Απόκτηση Πλήρους Έκδοσης - - - Αποβολή παίκτη - - - Είστε σίγουροι ότι θέλετε να αποβάλετε αυτόν τον παίκτη από το παιχνίδι; Δεν θα μπορέσει να συμμετάσχει ξανά έως ότου κάνετε επανεκκίνηση του κόσμου. - - - Πακέτα Εικόνων Παικτών - - - Θέματα - - - Πακέτα Skin - - - Να επιτρέπονται οι φίλοι φίλων - - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί η πρόσβαση σε αυτό επιτρέπεται σε παίκτες που είναι φίλοι του οικοδεσπότη. - - - Δεν Μπορείτε να Συμμετάσχετε στο Παιχνίδι - - - Επιλεγμένο - - - Επιλεγμένη skin: - - - Κατεστραμμένο Περιεχόμενο με Δυνατότητα Λήψης - - - Αυτό το περιεχόμενο με δυνατότητα λήψης είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. - - - Μέρος του περιεχομένου με δυνατότητα λήψης που διαθέτετε είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. - - - Η λειτουργία παιχνιδιού έχει αλλάξει - - - Μετονομασία του Κόσμου σας - - - Εισαγάγετε το νέο όνομα για τον κόσμο σας - - - Λειτουργία Παιχνιδιού: Επιβίωση - - - Λειτουργία Παιχνιδιού: Δημιουργία - - - Επιβίωση - - - Δημιουργία - - - Δημιουργήθηκε στην «Επιβίωση» - - - Δημιουργήθηκε στη «Δημιουργία» - - - Αναπαράσταση Σύννεφων - - - Τι θέλετε να κάνετε με αυτό το αποθηκευμένο παιχνίδι; - - - Μετονομασία Αποθήκευσης - - - Αυτόματη Αποθήκευση σε %d... - - - Ενεργοποίηση - - - Απενεργοποίηση - - - Κανονικό - - - Εντελώς Επίπεδο - - - Όταν είναι ενεργοποιημένο, το παιχνίδι θα είναι διαδικτυακό. - - - Όταν είναι ενεργοποιημένο, μόνο παίκτες που έχουν προσκληθεί θα μπορούν να συμμετάσχουν. - - - Όταν είναι ενεργοποιημένο, φίλοι όσων βρίσκονται στη Λίστα Φίλων σας θα μπορούν να συμμετάσχουν στο παιχνίδι. - - - Όταν είναι ενεργοποιημένο, οι παίκτες θα μπορούν να προκαλέσουν βλάβες σε άλλους παίκτες. Επηρεάζει μόνο τη λειτουργία Επιβίωση. - - - Όταν είναι απενεργοποιημένο, οι παίκτες που συμμετέχουν στο παιχνίδι δεν μπορούν να κάνουν κατασκευές ή εξόρυξη έως ότου λάβουν άδεια. - - - Όταν είναι ενεργοποιημένο, η φωτιά μπορεί να επεκταθεί σε κοντινούς εύφλεκτους κύβους. - - - Όταν είναι ενεργοποιημένο, το ΤΝΤ θα ανατιναχθεί όταν πυροδοτηθεί. - - - Όταν είναι ενεργοποιημένο, ο κόσμος 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 + + Ανοιχτό Μπλε - - Δεν μπορείτε πλέον να επιτίθεστε σε παίκτες + + Φούξια - - Μπορείτε πλέον να επιτίθεστε σε παίκτες + + Καφέ - - Δεν μπορείτε πλέον να επιτίθεστε σε ζώα + + Λευκό Βαμμένο Γυάλινο Τζάμι - - Μπορείτε πλέον να επιτίθεστε σε ζώα + + Μικρή Μπάλα - - Είστε πλέον επόπτης + + Μεγάλη Μπάλα - - Δεν είστε πλέον επόπτης + + Ανοιχτό Μπλε Βαμμένο Γυάλινο Τζάμι - - Μπορείτε πλέον να πετάξετε + + Φούξια Βαμμένο Γυάλινο Τζάμι - - Δεν μπορείτε πλέον να πετάξετε + + Πορτοκαλί Βαμμένο Γυάλινο Τζάμι - - Δεν θα εξαντλείστε πια + + Σε σχήμα αστεριού - - Στο εξής θα εξαντλείστε + + Μαύρο - - Είστε πλέον αόρατος + + Κόκκινο - - Δεν είστε πλέον αόρατος + + Πράσινο - - Είστε πλέον άτρωτος + + Σε σχήμα Creeper - - Δεν είστε πλέον άτρωτος + + Έκρηξη - - %d MSP + + Άγνωστο σχήμα - - Δράκος του End + + Μαύρο Βαμμένο Γυαλί - - Ο/Η %s μπήκε στο End + + Σιδερένια Πανοπλία Αλόγου - - Ο/Η %s βγήκε από το End + + Χρυσή Πανοπλία Αλόγου - + + Διαμαντένια Πανοπλία Αλόγου + + + Συσκευή σύγκρισης Κοκκινόπετρας + + + Βαγόνι ορυχείου με TNT + + + Βαγόνι ορυχείου με Χοάνη + + + Χαλινάρι + + + Φάρος + + + Παγιδευμένο Σεντούκι + + + Σταθμισμένη Πλάκα Πίεσης (Ελαφριά) + + + Καρτελάκι ονόματος + + + Ξύλινες Σανίδες (παντός τύπου) + + + Κύβος Εντολών + + + Πυροτέχνημα Αστέρι + + + Αυτά τα ζώα μπορούν να δαμαστούν και, στη συνέχεια, να ιππευθούν. Μπορείτε να τους προσαρτήσετε σεντούκι. + + + Μουλάρι + + + Γεννιούνται από διασταύρωση Αλόγου και Γαϊδουριού. Αυτά τα ζώα μπορούν να δαμαστούν και, στη συνέχεια, να ιππευθούν. + + + Άλογο + + + Αυτά τα ζώα μπορούν να δαμαστούν και, στη συνέχεια, να ιππευθούν. + + + Γαϊδούρι + + + Άλογο Ζόμπι + + + Άδειος Χάρτης + + + Αστέρι του Nether + + + Πυροτέχνημα-Πύραυλος + + + Άλογο Σκελετός + + + Wither + + + Κατασκευάζονται από Μαύρα Κρανία και Άμμο των Ψυχών. Εκτοξεύουν εκρηκτικά κρανία εναντίον σας. + + + Σταθμισμένη Πλάκα Πίεσης (Βαριά) + + + Ανοιχτός Γκρι Βαμμένος Πηλός + + + Γκρι Βαμμένος Πηλός + + + Ροζ Βαμμένος Πηλός + + + Μπλε Βαμμένος Πηλός + + + Μοβ Βαμμένος Πηλός + + + Γαλανός Βαμμένος Πηλός + + + Ανοιχτός Πράσινος Βαμμένος Πηλός + + + Πορτοκαλί Βαμμένος Πηλός + + + Λευκός Βαμμένος Πηλός + + + Βαμμένο Γυαλί + + + Κίτρινος Βαμμένος Πηλός + + + Ανοιχτός Μπλε Βαμμένος Πηλός + + + Φούξια Βαμμένος Πηλός + + + Καφέ Βαμμένος Πηλός + + + Χοάνη + + + Ράγα ενεργοποίησης + + + Εκτοξευτής + + + Συσκευή σύγκρισης Κοκκινόπετρας + + + Αισθητήρας φωτός της ημέρας + + + Κύβος Κοκκινόπετρας + + + Βαμμένος Πηλός + + + Μαύρος Βαμμένος Πηλός + + + Κόκκινος Βαμμένος Πηλός + + + Πράσινος Βαμμένος Πηλός + + + Δέμα Σανό + + + Ενισχυμένος Πηλός + + + Κύβος από Κάρβουνο + + + Ξεθώριασμα + + + Όταν η επιλογή είναι απενεργοποιημένη, εμποδίζει τα τέρατα και τα ζώα να αλλάξουν κύβους (για παράδειγμα, οι εκρήξεις των Creeper δεν θα καταστρέφουν κύβους και τα Πρόβατα δεν θα αφαιρούν Γρασίδι) ή τη συλλογή αντικειμένων. + + + Όταν η επιλογή είναι ενεργή, οι παίκτες θα διατηρήσουν το απόθεμά τους όταν πεθάνουν. + + + Όταν είναι απενεργοποιημένη, τα mob δεν παράγονται φυσικά. + + + Λειτουργία Παιχνιδιού: Adventure + + + Adventure + + + Τοποθετήστε έναν σπόρο για να δημιουργήσετε ξανά το ίδιο έδαφος. + + + Όταν η επιλογή είναι απενεργοποιημένη, τα τέρατα και τα ζώα δεν θα ρίχνουν λάφυρα (για παράδειγμα τα Creeper δεν θα ρίχνουν μπαρούτι). + + + Ο/Η {*PLAYER*} έπεσε από μια σκάλα + + + Ο/Η {*PLAYER*} έπεσε από αναρριχητικά φυτά + + + Ο/Η {*PLAYER*} έπεσε έξω από το νερό + + + Όταν η επιλογή είναι απενεργοποιημένη, οι κύβοι δεν θα ρίχνουν αντικείμενα όταν καταστρέφονται (για παράδειγμα, οι κύβοι πέτρας δεν θα ρίχνουν Πέτρα Επίστρωσης). + + + Όταν είναι απενεργοποιημένη, οι παίκτες δεν θα αναγεννούν την υγεία φυσικά. + + + Όταν η επιλογή είναι απενεργοποιημένη, η ώρα της ημέρας δεν θα αλλάζει. + + + Βαγόνι Ορυχείου + + + Χαλινάρι + + + Αποδέσμευση + + + Προσάρτηση + + + Ξεκαβαλίκεμα + + + Προσάρτηση Σεντουκιού + + + Εκτόξευση + + + Όνομα + + + Φάρος + + + Κύρια Δύναμη + + + Δευτερεύουσα Δύναμη + + + Άλογο + + + Εκτοξευτής + + + Χοάνη + + + Ο/Η {*PLAYER*} έπεσε από ψηλά + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Νυχτερίδων για έναν κόσμο. + + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφομένων Αλόγων. + + + Επιλογές Παιχνιδιού + + + Ο/Η {*PLAYER*} δέχθηκε χτύπημα με φλεγόμενη σφαίρα από {*SOURCE*} με χρήση {*ITEM*} + + + Ο/Η {*PLAYER*} γρονθοκοπήθηκε από {*SOURCE*} με χρήση {*ITEM*} + + + Ο/Η {*PLAYER*} σκοτώθηκε από {*SOURCE*} με χρήση {*ITEM*} + + + Δολιοφθορά από Mob + + + Ρίψεις πλακιδίων + + + Φυσική Αναδημιουργία + + + Κύκλος φωτός ημέρας + + + Διατήρηση αποθέματος + + + Δημιουργία mob + + + Λάφυρα mob + + + Ο/Η {*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*} + + + Καβαλίκεμα + + + Για να καθοδηγήσει ένα άλογο, ο παίκτης πρέπει να εξοπλίσει το άλογο με Σέλα. Τις Σέλες μπορείτε να τις αγοράσετε από χωρικούς ή να τις βρείτε μέσα σε Σεντούκια κρυμμένα στον κόσμο. + + -{*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*} + Τα ήμερα Γαϊδούρια και Μουλάρια μπορούν να αποκτήσουν σακίδια σέλας, προσαρτώντας ένα Σεντούκι. Μπορείτε να έχετε πρόσβαση σε αυτά τα σακίδια σέλας ενώ ιππεύετε ή χρησιμοποιείτε αθόρυβη κίνηση. + + + + Μπορείτε να εκθρέψετε Άλογα και Γαϊδούρια (όχι όμως Μουλάρια) όπως τα υπόλοιπα ζώα, χρησιμοποιώντας Χρυσά Μήλα ή Χρυσά Καρότα. Με την πάροδο του χρόνου, τα Πουλάρια θα γίνουν ενήλικα άλογα, μολονότι αν τα ταΐζετε Σιτάρι ή Σανό η διαδικασία θα επισπευσθεί. + + + Για να χρησιμοποιήσετε τα Άλογα, τα Γαϊδούρια και τα Μουλάρια, πρέπει πρώτα να τα δαμάσετε. Για να δαμάσετε ένα άλογο, πρέπει να προσπαθήσετε να το ιππεύσετε και να καταφέρετε να μείνετε πάνω του, όσο αυτό προσπαθεί να ρίξει τον αναβάτη. + + + Όταν γύρω από το άλογο εμφανιστούν Καρδιές Αγάπης, το άλογο είναι ήμερο και δεν θα αποπειραθεί ξανά να ρίξει κάτω τον παίκτη. + + + Try to ride this horse now. Χρησιμοποιήστε {*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*} αν είστε ήδη εξοικειωμένοι με τις Χοάνες. + + + + Οι χοάνες χρησιμοποιούνται για την εισαγωγή ή την αφαίρεση αντικειμένων από δοχεία και για την αυτόματη συλλογή αντικειμένων που έχουν ριχτεί σε αυτά. + + + Οι ενεργοί Φάροι εκπέμπουν μια έντονη δέσμη φωτός στον ουρανό και παρέχουν δυνάμεις σε κοντινούς παίκτες. Κατασκευάζονται με Γυαλί, Οψιανό και Αστέρια του Nether, τα οποία μπορείτε να αποκτήσετε νικώντας το Wither. + + + Οι Φάροι πρέπει να τοποθετούνται με τρόπο που να είναι στο φως του ήλιου κατά τη διάρκεια της ημέρας. Οι Φάροι πρέπει να τοποθετούνται σε Πυραμίδες από Σίδηρο, Χρυσό, Σμαράγδια ή Διαμάντια. Ωστόσο, η επιλογή του υλικού δεν έχει καμία επίδραση στη δύναμη του φάρου. + + + Προσπαθήστε να χρησιμοποιήσετε το Φάρο, για να ορίσετε τις δυνάμεις που παρέχει. Μπορείτε να χρησιμοποιήσετε τις Ράβδους από Σίδηρο που παρέχονται για την απαιτούμενη πληρωμή. + + + Μπορούν να επηρεάσουν Βάσεις Παρασκευής, Σεντούκια, Διανομείς, Εκτοξευτές, Βαγόνια Ορυχείου με Σεντούκια, Βαγόνια Ορυχείου με Χοάνη, καθώς και άλλες Χοάνες. + + + Σε αυτό το δωμάτιο υπάρχουν διάφορες χρήσιμες διατάξεις Χοάνης, για να τις δείτε και να πειραματιστείτε με αυτές. + + + Αυτό είναι το περιβάλλον χρήστη Πυροτεχνήματος, το οποίο μπορείτε να χρησιμοποιήσετε για την κατασκευή Πυροτεχνημάτων και Πυροτεχνημάτων Αστεριών. + + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη πώς να χρησιμοποιείτε το περιβάλλον χρήστη Πυροτεχνήματος. + + + + Οι Χοάνες θα επιχειρούν συνεχώς να ρουφήξουν αντικείμενα από ένα κατάλληλο δοχείο που έχει τοποθετηθεί επάνω τους. Επίσης, θα επιχειρούν να εισαγάγουν αποθηκευμένα αντικείμενα σε ένα δοχείο εξόδου. + + + + Ωστόσο, αν μια Χοάνη τροφοδοτείται από Κοκκινόπετρα, θα καταστεί ανενεργή και θα σταματήσει τόσο να ρουφάει όσο και να εισαγάγει αντικείμενα. + + + + + Η Χοάνη δείχνει προς την κατεύθυνση που προσπαθεί να εξαγάγει αντικείμενα. Προκειμένου μια χοάνη να δείχνει προς έναν συγκεκριμένο κύβο, τοποθετείστε τη χοάνη απέναντι από αυτόν τον κύβο, ενώ κινείστε αθόρυβα. + + + + + Αυτοί οι εχθροί βρίσκονται σε βάλτους και σας επιτίθενται πετώντας Φίλτρα. Όταν σκοτώνονται, πετάνε Φίλτρα. + + + Έχετε φτάσει τον μέγιστο αριθμό Πινάκων/Πλαισίων Αντικειμένων για έναν κόσμο. + + + Δεν μπορείτε να κάνετε spawn σε εχθρούς στη λειτουργία Γαλήνιο. + + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Καλαμαριών για έναν κόσμο. + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό εχθρών για έναν κόσμο. + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό χωρικών για έναν κόσμο. + + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Λύκων. + + + Έχετε φτάσει τον μέγιστο αριθμό Κεφαλών Mob για έναν κόσμο. + + + Αντίστρ. Κάμερας + + + Αριστερό Κροσέ + + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Κοτόπουλων. + + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Mooshroom. + + + Έχετε φτάσει τον μέγιστο αριθμό Βαρκών για έναν κόσμο. + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Κοτόπουλων για έναν κόσμο. + {*C2*}Πάρε μια ανάσα. Κι άλλη. Νιώσε τον αέρα στα πνευμόνια σου. Άσε τα άκρα σου να ξανασχηματιστούν. Ναι, κούνησε τα δάχτυλά σου. Απόκτησε πάλι σώμα, με βαρύτητα, στον αέρα. Επίστρεψε με σάρκα και οστά στο μακρύ όνειρο. Να 'σαι. Το σώμα σου αγγίζει και πάλι το σύμπαν σε κάθε σημείο, σαν να ήσαστε χωριστές οντότητες. Σαν να ήμαστε χωριστές οντότητες.{*EF*}{*B*}{*B*} @@ -4795,9 +2340,63 @@ Επαναφορά του 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 @@ -4805,104 +2404,19 @@ Να μην γίνει επαναφορά του Nether - Δεν είναι δυνατό το κούρεμα αυτού του Mooshroom αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων και Γατών. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων και Γατών. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Mooshroom. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Λύκων για έναν κόσμο. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Κοτόπουλων για έναν κόσμο. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Καλαμαριών για έναν κόσμο. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό εχθρών για έναν κόσμο. - - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό χωρικών για έναν κόσμο. - - - Έχετε φτάσει τον μέγιστο αριθμό Πινάκων/Πλαισίων Αντικειμένων για έναν κόσμο. - - - Δεν μπορείτε να κάνετε spawn σε εχθρούς στη λειτουργία Γαλήνιο. - - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Γουρουνιών, Προβάτων, Αγελάδων και Γατών. - - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Λύκων. - - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Κοτόπουλων. - - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Mooshroom. - - - Έχετε φτάσει τον μέγιστο αριθμό Βαρκών για έναν κόσμο. - - - Έχετε φτάσει τον μέγιστο αριθμό Κεφαλών Mob για έναν κόσμο. - - - Αντίστρ. Κάμερας - - - Αριστερό Κροσέ + Δεν είναι δυνατό το κούρεμα αυτού του Mooshroom αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. Πεθάνατε! - - Respawn + + Επιλογές Κόσμου - - Προσφορές Περιεχομένου με Δυνατότητα Λήψης + + Δυνατότητα Κατασκευών και Εξόρυξης - - Αλλαγή Skin - - - Πώς να Παίξετε - - - Πλήκτρα Ελέγχου - - - Ρυθμίσεις - - - Συντελεστές - - - - Επανεγκατάσταση Περιεχομένου - - - Ρυθμίσεις Εντοπισμού Σφαλμάτων - - - Εξάπλωση Φωτιάς - - - Ανατίναξη TNT - - - Παίκτης εναντίον Παίκτη - - - Εμπιστοσύνη προς Παίκτες - - - Προνόμια Οικοδεσπότη + + Δυνατότητα Χρήσης Πορτών, Διακοπτών Δημιουργία Οικοδομημάτων @@ -4913,27 +2427,9 @@ Σεντούκι Μπόνους - - Επιλογές Κόσμου - - - Δυνατότητα Κατασκευών και Εξόρυξης - - - Δυνατότητα Χρήσης Πορτών και Διακοπτών - Δυνατότητα Ανοίγματος Δοχείων - - Δυνατότητα Επίθεσης σε Παίκτες - - - Δυνατότητα Επίθεσης σε Ζώα - - - Επόπτης - Αποβολή Παίκτη @@ -4943,185 +2439,307 @@ Απενεργοποίηση Εξάντλησης + + Δυνατότητα Επίθεσης σε Παίκτες + + + Δυνατότητα Επίθεσης σε Ζώα + + + Επόπτης + + + Προνόμια Οικοδεσπότη + + + Πώς να Παίξετε + + + Πλήκτρα Ελέγχου + + + Ρυθμίσεις + + + Επαναγένεση + + + Προσφορές Περιεχομένου Λήψης + + + Αλλαγή 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*} +Όταν ο Εκτοξευτής είναι στραμμένος προς ένα Σεντούκι ή άλλο είδος Δοχείου, το αντικείμενο δεν θα πέσει στο έδαφος αλλά θα μεταφερθεί εκεί. Μπορείτε να δημιουργήσετε μεγάλες διατάξεις Εκτοξευτών για τη μεταφορά αντικειμένων σε απόσταση. Για να λειτουργήσει αυτού του είδους η διάταξη, οι Εκτοξευτές πρέπει να ανάβουν και να σβήνουν εναλλάξ. + - - Seed για το Πρόγραμμα Δημιουργίας Κόσμου + + Όταν χρησιμοποιείται, γίνεται χάρτης του μέρους του κόσμου όπου βρίσκεστε, και γεμίζει όσο εξερευνάτε. - - Αφήστε το κενό για έναν τυχαίο seed + + Έπεσε από τους Wither, χρησιμοποιείται στην κατασκευή Φάρων - - Παίκτες + + Χοάνες - - Συμμετοχή στο Παιχνίδι + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΧΟΑΝΕΣ{*ETW*}{*B*}{*B*} +Οι Χοάνες χρησιμοποιούνται για την εισαγωγή ή την αφαίρεση αντικειμένων από δοχεία και για την αυτόματη συλλογή αντικειμένων που έχουν ριχτεί σε αυτά.{*B*} +Μπορούν να επηρεάσουν Βάσεις Παρασκευής, Σεντούκια, Διανομείς, Εκτοξευτές, Βαγόνια Ορυχείου με Σεντούκια, Βαγόνια Ορυχείου με Χοάνη, καθώς και άλλες Χοάνες.{*B*}{*B*} +Οι Χοάνες θα επιχειρούν συνεχώς να ρουφήξουν αντικείμενα από ένα κατάλληλο δοχείο που έχει τοποθετηθεί επάνω τους. Επίσης, θα επιχειρούν να εισαγάγουν αποθηκευμένα αντικείμενα σε ένα δοχείο εξόδου.{*B*} +Εάν μια Χοάνη τροφοδοτείται από Κοκκινόπετρα, θα καταστεί ανενεργή και θα σταματήσει τόσο να ρουφάει όσο και να εισαγάγει αντικείμενα.{*B*}{*B*} +Η Χοάνη δείχνει προς την κατεύθυνση που προσπαθεί να εξαγάγει αντικείμενα. Προκειμένου μια Χοάνη να δείχνει προς έναν συγκεκριμένο κύβο, τοποθετείστε τη Χοάνη απέναντι από αυτόν τον κύβο, ενώ κινείστε αθόρυβα.{*B*} - - Έναρξη Παιχνιδιού + + Εκτοξευτές - - Δεν Βρέθηκαν Παιχνίδια - - - Παιχνίδι - - - Πίνακες Κορυφαίων - - - Βοήθεια και Επιλογές - - - Ξεκλείδωμα Πλήρους Παιχνιδιού - - - Συνέχιση Παιχνιδιού - - - Αποθήκευση Παιχνιδιού - - - Δυσκολία: - - - Τύπος Παιχνιδιού: - - - Οικοδομήματα: - - - Τύπος Επιπέδου: - - - Παίκτης εναντίον Παίκτη (PvP): - - - Εμπιστοσύνη προς Παίκτες: - - - TNT: - - - Εξάπλωση Φωτιάς: - - - Επανεγκατάσταση Θέματος - - - Επανεγκατάσταση Εικόνας Παίκτη 1 - - - Επανεγκατάσταση Εικόνας Παίκτη 2 - - - Επανεγκατάσταση Άβαταρ 1 - - - Επανεγκατάσταση Άβαταρ 2 - - - Επανεγκατάσταση Άβαταρ 3 - - - Επιλογές - - - Ήχος - - - Έλεγχος - - - Γραφικά - - - Περιβάλλον Χρήστη - - - Επαναφορά Προεπιλογών - - - Προβολή Κίνησης Κάμερας - - - Συμβουλές - - - Συμβουλές Εργαλείων Εντός του Παιχνιδιού - - - Κατακόρυφος Διαχωρισμός Οθόνης για 2 Παίκτες - - - Ολοκληρώθηκε - - - Επεξεργασία μηνύματος πινακίδας: - - - Συμπληρώστε τα στοιχεία που θα συνοδεύουν το στιγμιότυπο οθόνης σας - - - Λεζάντα - - - Στιγμιότυπο οθόνης από το παιχνίδι - - - Επεξεργασία μηνύματος πινακίδας: - - - Οι υφές, τα εικονίδια και το περιβάλλον χρήστη του κλασικού Minecraft! - - - Προβολή όλων των Μικτών Κόσμων - - - Χωρίς Eπίδραση - - - Ταχύτητα - - - Βραδύτητα - - - Βιασύνη - - - Κούραση Λόγω Εξόρυξης - - - Δύναμη - - - Αδυναμία + + NOT USED Άμεση Υγεία @@ -5132,62 +2750,3302 @@ Ώθηση Άλματος + + Κούραση Λόγω Εξόρυξης + + + Δύναμη + + + Αδυναμία + Ναυτία + + NOT USED + + + NOT USED + + + NOT USED + Αναδημιουργία Αντοχή - - Πυραντοχή + + Εύρεση Σπόρου για το Δημιουργό Κόσμων. - - Αναπνοή στο Νερό + + Όταν είναι ενεργοποιημένο, δημιουργεί πολύχρωμες εκρήξεις. Το χρώμα, το εφέ, το σχήμα και το σβήσιμο καθορίζονται από το Πυροτέχνημα-Αστέρι που χρησιμοποιείται κατά τη δημιουργία του Πυροτεχνήματος. - - Αορατότητα + + Ένας τύπος ραγών που μπορεί να ενεργοποιήσει ή να απενεργοποιήσει Βαγόνια Ορυχείου με Χοάνη και να πυροδοτήσει Βαγόνια Ορυχείου με TNT. - - Τυφλότητα + + Χρησιμοποιείται για να κρατήσετε ή να ρίξετε αντικείμενα ή για να σπρώξετε αντικείμενα σε ένα άλλο δοχείο, όταν φορτίζεται μέσω Κοκκινόπετρας. - - Νυχτερινή Όραση + + Χρωματιστοί κύβοι που κατασκευάζονται χρωματίζοντας Ενισχυμένο πηλό. - - Πείνα + + Παρέχει φορτίο Κοκκινόπετρας. Το φορτίο θα είναι ισχυρότερο, εάν στην πλάκα υπάρχουν περισσότερα αντικείμενα. Απαιτεί περισσότερο βάρος από την ελαφριά πλάκα. + + + Χρησιμοποιείται ως πηγή δύναμης κοκκινόπετρας. Μπορεί να μετατραπεί πάλι σε Κοκκινόπετρα. + + + Χρησιμοποιείται για να πιάνετε αντικείμενα ή για να μεταφέρετε αντικείμενα μέσα σε ή έξω από δοχεία. + + + Μπορείτε να το δώσετε σε Άλογα, Γαϊδούρια ή Μουλάρια, για να θεραπευθούν έως 10 Καρδιές. Επιταχύνει την ανάπτυξη των πουλαριών. + + + Νυχτερίδα + + + Αυτά τα ιπτάμενα πλάσματα βρίσκονται σε σπηλιές ή άλλους μεγάλους κλειστούς χώρους. + + + Μάγισσα + + + Δημιουργείται λιώνοντας Πηλό σε φούρνο. + + + Κατασκευάζεται από γυαλί και βαφή. + + + Κατασκευάζεται από Βαμμένο Γυαλί + + + Παρέχει φορτίο Κοκκινόπετρας. Το φορτίο θα είναι ισχυρότερο, εάν στην πλάκα υπάρχουν περισσότερα αντικείμενα. + + + Είναι ένας κύβος που μεταδίδει ένα σήμα Κοκκινόπετρας με βάση το φως του ήλιου (ή την έλλειψη αυτού). + + + Είναι ένας τύπος βαγονιού ορυχείου που λειτουργεί παρόμοια με Χοάνη. Θα συλλέγει αντικείμενα που βρίσκονται σε πλατφόρμες και από δοχεία που βρίσκονται από πάνω του. + + + Ένας ειδικός τύπος Πανοπλίας που μπορεί να τοποθετηθεί σε άλογο. Προσφέρει Πανοπλία επιπέδου 5. + + + Χρησιμοποιούνται για τον καθορισμό του χρώματος, της επίδρασης και τους σχήματος των πυροτεχνημάτων. + + + Χρησιμοποιείται σε κυκλώματα Κοκκινόπετρας, για τη διατήρηση, τη σύγκριση ή την αφαίρεση ισχύος σήματος ή για τη μέτρηση της κατάστασης συγκεκριμένων κύβων. + + + Είναι ένας τύπος βαγονιού ορυχείου που λειτουργεί ως κινούμενος κύβος TNT. + + + Ένας ειδικός τύπος Πανοπλίας που μπορεί να τοποθετηθεί σε άλογο. Προσφέρει Πανοπλία επιπέδου 7. + + + Χρησιμοποιούνται για την εκτέλεση εντολών. + + + Εκπέμπει μια δέσμη φωτός στον ουρανό και μπορεί να παράσχει Επιδράσεις Κατάστασης σε κοντινούς παίκτες. + + + Αποθηκεύει μέσα του κύβους και αντικείμενα. Τοποθετήστε δύο σεντούκια το ένα δίπλα στο άλλο, για να δημιουργήσετε ένα μεγαλύτερο σεντούκι με διπλάσια χωρητικότητα. Το παγιδευμένο σεντούκι δημιουργεί επίσης ένα φορτίο Κοκκινόπετρας όταν ανοίγει. + + + Ένας ειδικός τύπος Πανοπλίας που μπορεί να τοποθετηθεί σε άλογο. Προσφέρει Πανοπλία επιπέδου 11. + + + Χρησιμοποιείται για δέσιμο mob στον παίκτη ή σε πασσάλους Φράχτη + + + Χρησιμοποιείται για την ονομασία mob στον κόσμο. + + + Βιασύνη + + + Ξεκλείδωμα Πλήρους Παιχνιδιού + + + Συνέχιση Παιχνιδιού + + + Αποθήκευση Παιχνιδιού + + + Παιχνίδι + + + Πίνακες Κορυφαίων + + + Βοήθεια και Επιλογές + + + Δυσκολία: + + + Π εναντίον Π: + + + Εμπιστοσύνη: + + + TNT: + + + Τύπος Παιχνιδιού: + + + Οικοδομήματα: + + + Τύπος Επιπέδου: + + + Δεν Βρέθηκαν Παιχνίδια + + + Μόνο Πρόσκληση + + + Περισσότερες Επιλογές + + + Φόρτωση + + + Επιλογές Οικοδεσπότη + + + Παίκτες/Πρόσκληση + + + Διαδικτυακό Παιχνίδι + + + Νέος Κόσμος + + + Παίκτες + + + Συμμετοχή στο Παιχνίδι + + + Έναρξη Παιχνιδιού + + + Όνομα Κόσμου + + + Seed για το Πρόγραμμα Δημιουργίας Κόσμου + + + Αφήστε το κενό για έναν τυχαίο seed + + + Εξάπλωση Φωτιάς: + + + Επεξεργασία μηνύματος πινακίδας: + + + Συμπληρώστε τα στοιχεία που θα συνοδεύουν το στιγμιότυπο οθόνης σας + + + Λεζάντα + + + Συμβουλές Εργαλείων Εντός του Παιχνιδιού + + + Κατακόρυφος Διαχωρισμός Οθόνης για 2 Παίκτες + + + Ολοκληρώθηκε + + + Στιγμιότυπο οθόνης από το παιχνίδι + + + Χωρίς Eπίδραση + + + Ταχύτητα + + + Βραδύτητα + + + Επεξεργασία μηνύματος πινακίδας: + + + Οι υφές, τα εικονίδια και το περιβάλλον χρήστη του κλασικού Minecraft! + + + Προβολή όλων των Μικτών Κόσμων + + + Συμβουλές + + + Επανεγκατάσταση Άβαταρ 1 + + + Επανεγκατάσταση Άβαταρ 2 + + + Επανεγκατάσταση Άβαταρ 3 + + + Επανεγκατάσταση Θέματος + + + Επανεγκατάσταση Εικόνας Παίκτη 1 + + + Επανεγκατάσταση Εικόνας Παίκτη 2 + + + Επιλογές + + + Περιβάλλον Χρήστη + + + Επαναφορά Προεπιλογών + + + Προβολή Κίνησης Κάμερας + + + Ήχος + + + Έλεγχος + + + Γραφικά + + + Χρησιμοποιείται στην παρασκευή φίλτρων. Πέφτει από Ghast όταν πεθαίνουν. + + + Πέφτει από Γουρουνάνθρωπους Ζόμπι όταν πεθαίνουν. Οι Γουρουνάνθρωποι Ζόμπι κατοικούν στο Nether. Χρησιμοποιείται ως συστατικό για την παρασκευή φίλτρων. + + + Χρησιμοποιείται στην παρασκευή φίλτρων. Φυτρώνει φυσικά σε Οχυρά του Nether. Μπορεί επίσης να φυτευτεί σε Άμμο των Ψυχών. + + + Γλιστράει όταν περπατάτε επάνω του. Αν βρίσκεται επάνω από άλλον κύβο, μετατρέπεται σε νερό όταν καταστρέφεται. Λιώνει αν έρθει πολύ κοντά σε μια πηγή φωτός ή όταν τοποθετείται στο Nether. + + + Μπορεί να χρησιμοποιηθεί ως διακοσμητικό. + + + Χρησιμοποιείται στην παρασκευή φίλτρων και για τον εντοπισμό Φρουρίων. Πέφτει από τα Blaze που συνήθως βρίσκονται κοντά σε Φρούρια στο Nether. + + + Όταν χρησιμοποιείται, μπορεί να έχει διάφορα αποτελέσματα, ανάλογα με το πού χρησιμοποιείται. + + + Χρησιμοποιείται στην παρασκευή φίλτρων ή συνδυάζεται με άλλα αντικείμενα για τη δημιουργία Ματιών του Ender ή Κρέμα Μάγματος. + + + Χρησιμοποιείται στην παρασκευή φίλτρων. + + + Χρησιμοποιείται για τη δημιουργία Φίλτρων και Φίλτρων Εκτόξευσης. + + + Μπορεί να γεμίσει με νερό και να χρησιμοποιηθεί ως βασικό συστατικό για ένα φίλτρο στη Βάση Παρασκευής. + + + Ένα δηλητηριώδες τρόφιμο και υλικό για φίλτρα. Πέφτει όταν ο παίκτης σκοτώνει Αράχνες ή Αράχνες των Σπηλαίων. + + + Χρησιμοποιείται στην παρασκευή φίλτρων, συνήθως για τη δημιουργία φίλτρων με αρνητικές επιδράσεις. + + + Όταν τοποθετηθεί κάπου, μεγαλώνει με το πέρασμα του χρόνου. Μπορεί να συλλεχθεί με ψαλίδι. Μπορείτε να το σκαρφαλώσετε σαν να ήταν σκάλα. + + + Λειτουργεί ως πόρτα, αλλά χρησιμοποιείται κυρίως σε φράκτες. + + + Μπορεί να δημιουργηθεί από Φέτες Καρπουζιού. + + + Διάφανοι κύβοι που μπορούν να χρησιμοποιηθούν αντί για Γυάλινους Κύβους. + + + Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. Όταν μαζεύεται, τραβά μαζί του και τον κύβο που έρχεται σε επαφή με το εκτεταμένο μέρος του εμβόλου. + + + Κατασκευάζεται από κύβους πέτρας και βρίσκεται συνήθως σε Φρούρια. + + + Χρησιμοποιείται ως φράγμα και λειτουργεί όπως και οι φράκτες. + + + Μπορεί να φυτευτεί για την καλλιέργεια κολοκύθας. + + + Μπορεί να χρησιμοποιηθεί για κατασκευές και διακόσμηση. + + + Επιβραδύνει την κίνηση όταν περνάτε από μέσα του. Μπορείτε να το καταστρέψετε με ψαλίδι για να συλλέξετε κλωστή. + + + Όταν καταστραφεί, παράγει ένα Ασημόψαρο. Μπορεί επίσης να δημιουργήσει Ασημόψαρα αν βρίσκεται κοντά σε ένα άλλο Ασημόψαρο που δέχεται επίθεση. + + + Μπορεί να φυτευτεί για την καλλιέργεια καρπουζιών. + + + Πέφτει από Enderman όταν πεθαίνουν. Όταν πεταχτεί, ο παίκτης τηλεμεταφέρεται στη θέση που πέφτει το Μαργαριτάρι του Ender και χάνει λίγη ζωή. + + + Ένας κύβος από χώμα με γρασίδι που φυτρώνει στην κορυφή. Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. + + + Αν το γεμίσετε με νερό της βροχής ή από έναν κουβά, μπορείτε να το χρησιμοποιήσετε για να γεμίσετε Γυάλινα Μπουκάλια με νερό. + + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + + Δημιουργείται λιώνοντας Netherrack σε φούρνο. Μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβων Τούβλου Nether. + + + Όταν τροφοδοτούνται με ρεύμα, εκπέμπουν φως. + + + Μοιάζουν με προθήκες επίδειξης και παρουσιάζουν το αντικείμενο ή τον κύβο που περιέχουν. + + + Όταν πετάγεται, μπορεί να δημιουργήσει ένα πλάσμα του τύπου που αναφέρεται. + + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + + Μπορούν να καλλιεργηθούν για την παραγωγή Καρπών Κακάο. + + + Αγελάδα + + + Ρίχνει δέρμα όταν σκοτωθεί. Μπορεί, επίσης, να αρμεχθεί με έναν κουβά. + + + Πρόβατο + + + Τα Κεφάλια Mob μπορούν να χρησιμοποιηθούν ως διακοσμητικά ή να φορεθούν ως μάσκες στην υποδοχή κράνους. + + + Καλαμάρι + + + Ρίχνει ασκούς μελάνης όταν σκοτωθεί. + + + Χρήσιμο για την ανάφλεξη υλικών ή για εμπρηστικά πυρά όταν εκτοξεύεται από Διανομέα. + + + Επιπλέει στο νερό και μπορεί να περπατήσει κανείς επάνω του. + + + Χρησιμοποιείται για την κατασκευή Οχυρών του Nether. Άτρωτο στις πύρινες σφαίρες των Ghast. + + + Χρησιμοποιείται στα Οχυρά του Nether. + + + Όταν πετάγεται, δείχνει την κατεύθυνση στην οποία βρίσκεται η Πύλη του End. Αν τοποθετήσετε δώδεκα τέτοια αντικείμενα σε Πλαίσια Πύλης End, θα ενεργοποιηθεί η Πύλη του End. + + + Χρησιμοποιείται στην παρασκευή φίλτρων. + + + Μοιάζουν με τους Κύβοι Γρασιδιού, ιδανικοί για καλλιέργεια μανιταριών. + + + Βρίσκεται στα Οχυρά του Nether και ρίχνει Φυτά Nether όταν σπάσει. + + + Ένας τύπος κύβου που βρίσκεται στο End. Είναι πολύ ανθεκτικός στις εκρήξεις, επομένως είναι πολύ χρήσιμος για την κατασκευή κτιρίων. + + + Αυτός ο κύβος δημιουργείται όταν νικηθεί ο Δράκος στο End. + + + Όταν πετάγεται, ρίχνει Σφαίρες Εμπειρίας που αυξάνουν τους πόντους εμπειρίας σας όταν συλλεχθούν. + + + Επιτρέπει στους παίκτες να μαγεύουν Σπαθιά, Αξίνες, Τσεκούρια, Φτυάρια, Τόξα και Πανοπλίες με τους Πόντους Εμπειρίας που έχουν συλλέξει. + + + Μπορεί να ενεργοποιηθεί με δώδεκα Μάτια του Ender και επιτρέπει στον παίκτη να ταξιδέψει στη διάσταση του End. + + + Χρησιμοποιείται για το σχηματισμό μιας Πύλης End. + + + Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. + + + Δημιουργείται με το ψήσιμο πηλού σε φούρνο. + + + Μπορεί να ψηθεί σε φούρνο για να μετατραπεί σε τούβλα. + + + Όταν σπάσει, πέφτουν μπάλες πηλού που μπορούν να ψηθούν σε φούρνο για να μετατραπούν σε τούβλα. + + + Κόβεται με τσεκούρι και μπορεί να χρησιμοποιηθεί ως καύσιμο ή για την κατασκευή σανίδων. + + + Δημιουργείται σε φούρνο από λιωμένη άμμο. Μπορεί να χρησιμοποιηθεί για κατασκευή, αλλά θα σπάσει αν προσπαθήσετε να το εξορύξετε. + + + Εξορύσσεται από την πέτρα με χρήση αξίνας. Μπορεί να χρησιμοποιηθεί για την κατασκευή καμινιού ή πέτρινων εργαλείων. + + + Ένας πιο βολικός τρόπος για να αποθηκεύετε χιονόμπαλες. + + + Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία σούπας. + + + Μπορεί να εξορυχτεί μόνο με αδαμάντινη αξίνα. Παράγεται κατά την ανάμιξη νερού και ακίνητης λάβας και χρησιμοποιείται για την κατασκευή πύλης. + + + Δημιουργεί τέρατα στον κόσμο. + + + Μπορεί να σκαφτεί με αξίνα και δημιουργεί χιονόμπαλες. + + + Όταν σπάσει, μερικές φορές παράγει σπόρους σιταριού. + + + Μπορεί να χρησιμοποιηθεί για τη δημιουργία βαφής. + + + Συλλέγεται με φτυάρι. Μερικές φορές παράγει πυρόλιθο κατά την εξόρυξη. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. + + + Μπορεί να εξορυχτεί με αξίνα και παράγει κάρβουνο. + + + Μπορεί να εξορυχτεί με αξίνα και παράγει λάπις λάζουλι. + + + Μπορεί να εξορυχτεί με αξίνα από σίδερο και παράγει διαμάντια. + + + Χρησιμοποιείται ως διακοσμητικό. + + + Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους χρυσού. + + + Μπορεί να εξορυχτεί με αξίνα από πέτρα ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους σιδήρου. + + + Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και παράγει σκόνη κοκκινόπετρας. + + + Αυτό είναι άθραυστο. + + + Βάζει φωτιά σε οτιδήποτε έρχεται σε επαφή μαζί του. Μπορεί να συλλεχθεί σε κουβά. + + + Συλλέγεται με φτυάρι. Μπορεί να λιώσει σε φούρνο για να μετατραπεί σε γυαλί. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. + + + Μπορεί να εξορυχτεί με αξίνα και παράγει πέτρα επίστρωσης. + + + Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. + + + Μπορεί να φυτευτεί και σε βάθος χρόνου θα εξελιχθεί σε δέντρο. + + + Τοποθετείται στο έδαφος και μεταφέρει ηλεκτρικά φορτία. Όταν αναμιγνύεται με ένα φίλτρο, αυξάνει τη διάρκεια της επίδρασης. + + + Συλλέγεται από σκοτωμένες αγελάδες και μπορεί να χρησιμοποιηθεί για η δημιουργία πανοπλιών ή Βιβλίων. + + + Συλλέγεται από σκοτωμένα Slime και μπορεί να χρησιμοποιηθεί για την παρασκευή φίλτρων ή για τη δημιουργία Εμβόλων με Κόλλα. + + + Πέφτει τυχαία από κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. + + + Συλλέγεται με το σκάψιμο χαλικιού και μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρόλιθου και χάλυβα. + + + Αν το χρησιμοποιήσετε σε ένα γουρούνι, μπορείτε να το ιππεύσετε. Στη συνέχεια, μπορείτε να καθοδηγήσετε το γουρούνι με ένα Καρότο σε Ραβδί. + + + Συλλέγεται με το σκάψιμο χιονιού και μπορείτε να το πετάξετε. + + + Συλλέγεται με την εξόρυξη Λαμψόπετρας και μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβου Λαμψόπετρας ή να αναμιχθεί σε ένα φίλτρο για να ενισχύσει την επίδρασή του. + + + Όταν σπάει, βγάζει μερικές φορές ένα βλαστάρι που μπορεί να φυτευτεί και να γίνει δέντρο. + + + Βρίσκεται στα μπουντρούμια. Μπορεί να χρησιμοποιηθεί για κατασκευή και διακόσμηση. + + + Χρήση για την παραγωγή μαλλιού από πρόβατα και τη συγκομιδή κύβων φύλλων. + + + Συλλέγεται από σκοτωμένους Σκελετούς. Μπορεί να χρησιμοποιηθεί για τη δημιουργία πάστας οστών. Μπορείτε να το ταΐσετε σε έναν λύκο για να τον δαμάσετε. + + + Συλλέγεται από Creeper που σκοτώθηκε από Σκελετούς. Μπορείτε να το ακούσετε σε ένα jukebox. + + + Σβήνει τη φωτιά και ενισχύει την ανάπτυξη των σοδειών. Μπορεί να συλλεχθεί σε κουβά. + + + Συλλέγεται από σοδειές και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. + + + Μπορεί να χρησιμοποιηθεί για τη δημιουργία ζάχαρης. + + + Μπορεί να φορεθεί ως κράνος ή να συνδυαστεί με έναν πυρσό για τη δημιουργία ενός φαναριού από κολοκύθα. Είναι επίσης το βασικό συστατικό της Κολοκυθόπιτας. + + + Όταν ανάψει, καίει για πάντα. + + + Όταν αναπτυχθεί πλήρως, παράγει σοδειές με σιτάρι. + + + Έδαφος που έχει προετοιμαστεί για τη φύτευση σπόρων. + + + Μπορεί να ψηθεί στο φούρνο για τη δημιουργία πράσινης βαφής. + + + Επιβραδύνει την κίνηση οποιουδήποτε πλάσματος περάσει από επάνω του. + + + Συλλέγεται από σκοτωμένες κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός βέλους. + + + Συλλέγεται από σκοτωμένα Creeper και μπορεί να χρησιμοποιηθεί για τη δημιουργία TNT ή ως συστατικό για την παρασκευή φίλτρων. + + + Μπορεί να φυτευτεί σε ένα αγρόκτημα για την καλλιέργεια σοδειών. Βεβαιωθείτε ότι υπάρχει αρκετό φως για να αναπτυχθούν οι σπόροι! + + + Αν σταθείτε στην πύλη, μπορείτε να ταξιδεύετε από τον Overworld στο Nether. + + + Χρησιμοποιείται ως καύσιμο για ένα φούρνο ή μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρσού. + + + Συλλέγεται από σκοτωμένες αράχνες και μπορεί να χρησιμοποιηθεί για τη δημιουργία Τόξου ή Καλαμιού Ψαρέματος. Μπορεί να τοποθετηθεί στο έδαφος για τη δημιουργία Σύρματος Ενεργοποίησης. + + + Ρίχνει μαλλί όταν κουρευτεί (αν δεν έχει κουρευτεί ήδη). Μπορείτε να το βάψετε για να αλλάξετε χρώμα στο μαλλί του. + + + Επιχειρηματικός Σχεδιασμός + + + Διευθυντής Χαρτοφυλακίου + + + Υπεύθυνος Προϊόντος + + + Ομάδα Ανάπτυξης + + + Διαχείριση Κυκλοφορίας + + + Διευθυντής Έκδοσης XBLA + + + Μάρκετινγκ + + + Ομάδα Μετάφρασης – Ασία + + + Ομάδα Έρευνας Χρηστών + + + Κεντρικές Ομάδες MGS + + + Διαχειριστής Κοινότητας + + + Ομάδα Μετάφρασης - Ευρώπη + + + Ομάδα Μετάφρασης - Redmond + + + Ομάδα Σχεδίασης + + + Διευθυντής Διασκέδασης + + + Μουσική και Ήχοι + + + Προγραμματισμός + + + Βασικός Αρχιτέκτονας + + + Καλλιτεχνική Διεύθυνση + + + Δημιουργός Παιχνιδιού + + + Γραφικά + + + Παραγωγός + + + Επικεφαλής Δοκιμαστών + + + Βασικός Δοκιμαστής + + + Ποιοτικός Έλεγχος + + + Διευθυντής Παραγωγής + + + Επικεφαλής Παραγωγής + + + Δοκιμαστής Αποδοχής Οροσήμων + + + Σιδερένιο Φτυάρι + + + Αδαμάντινο Φτυάρι + + + Χρυσό Φτυάρι + + + Χρυσό Σπαθί + + + Ξύλινο Φτυάρι + + + Πέτρινο Φτυάρι + + + Ξύλινη Αξίνα + + + Χρυσή Αξίνα + + + Ξύλινο Τσεκούρι + + + Πέτρινο Τσεκούρι + + + Πέτρινη Αξίνα + + + Σιδερένια Αξίνα + + + Αδαμάντινη Αξίνα + + + Αδαμάντινο Σπαθί + + + SDET + + + Αξιολόγηση Δοκιμής Συστήματος Έργου + + + Επιπλέον Αξιολόγηση Δοκιμής Συστήματος + + + Ειδικές Ευχαριστίες + + + Συντονιστής Δοκιμών + + + Υπεύθυνος Δοκιμών + + + Συνεργάτες Δοκιμών + + + Ξύλινο Σπαθί + + + Πέτρινο Σπαθί + + + Σιδερένιο Σπαθί + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Προγραμματιστής + + + Εκτοξεύει πύρινες σφαίρες εναντίον σας που εκρήγνυνται όταν σας ακουμπήσουν. + + + Slime + + + Όταν δέχεται ζημιά, χωρίζεται σε μικρότερα Slime. + + + Ζόμπι Γουρουνάνθρωπος + + + Αρχικά ήρεμος, αλλά επιτίθεται μαζικά, αν επιτεθείτε σε κάποιον. + + + Ghast + + + Enderman + + + Αράχνη των Σπηλαίων + + + Το δάγκωμά της είναι δηλητηριώδες. + + + Mooshroom + + + Σας επιτίθενται αν τους κοιτάξετε. Μπορούν επίσης να μετακινούν κύβους. + + + Ασημόψαρα + + + Προσελκύουν τα Ασημόψαρα που κρύβονται στη γύρω περιοχή όταν τους επιτίθεστε. Κρύβονται σε κύβους πέτρας. + + + Σας επιτίθεται όταν βρίσκεστε κοντά. + + + Ρίχνει χοιρινές μπριζόλες όταν σκοτωθεί. Μπορείτε να το ιππεύσετε, αν χρησιμοποιήσετε μια σέλα. + + + Λύκος + + + Δεν επιτίθεται, εκτός και αν του επιτεθείτε πρώτοι. Μπορεί να δαμαστεί αν του δώσετε κόκκαλα. Σε αυτήν την περίπτωση, σας ακολουθούν παντού και επιτίθενται σε ό,τι σας επιτίθεται. + + + Κότα + + + Ρίχνει φτερά όταν σκοτωθεί και γεννά αυγά με τυχαία συχνότητα. + + + Γουρούνι + + + Creeper + + + Αράχνη + + + Σας επιτίθεται όταν βρίσκεστε κοντά. Μπορεί να σκαρφαλώσει τοίχους. Ρίχνει σπάγκο όταν σκοτωθεί. + + + Ζόμπι + + + Εκρήγνυται αν το πλησιάσετε πολύ! + + + Σκελετός + + + Επιτίθεται με βέλη εναντίον σας. Ρίχνει βέλη όταν σκοτωθεί. + + + Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία μανιταρόσουπας. Ρίχνει μανιτάρια και μετατρέπεται σε κανονική αγελάδα, αν την κουρέψετε. + + + Αρχική Σχεδίαση και Προγραμματισμός + + + Υπεύθυνος Έργου/Παραγωγός + + + Το Υπόλοιπο Εργατικό Δυναμικό της Mojang + + + Καλλιτεχνική Σχεδίαση + + + Υπολογισμοί και Στατιστικά Στοιχεία + + + Συντονιστής Εχθρών + + + Επικεφαλής Προγραμματισμού Minecraft για PC + + + Υποστήριξη Πελατών + + + DJ Γραφείου + + + Σχεδιαστής/Προγραμματιστής Minecraft - Pocket Edition + + + Προγραμματιστής-Νίντζα + + + Διευθύνων Σύμβουλος + + + Υπάλληλος Γραφείου + + + Κίνηση Εκρηκτικών + + + Ένας πελώριος μαύρος δράκος που βρίσκεται στο End. + + + Blaze + + + Εχθροί που κατοικούν στο Nether, συνήθως στα Οχυρά Nether. Ρίχνουν Ράβδους Blaze όταν σκοτωθούν. + + + Γκόλεμ του Χιονιού + + + Το Γκόλεμ του Χιονιού μπορεί να δημιουργηθεί από παίκτες συνδυάζοντας κύβους χιονιού και μια κολοκύθα. Πετάει χιονόμπαλες στους εχθρούς του δημιουργού του. + + + Δράκος του Ender + + + Κύβος Μάγματος + + + Κατοικούν στις Ζούγκλες. Μπορείτε να τις δαμάσετε, αν τις ταΐσετε Ωμό Ψάρι. Θα πρέπει πρώτα να αφήσετε την Αιλουροπάρδαλις να σας πλησιάσει, καθώς οι απότομες κινήσεις τον τρομάζουν. + + + Σιδερένιο Γκόλεμ + + + Εμφανίζονται σε Χωριά για να τα προστατεύσουν και μπορούν να δημιουργηθούν συνδυάζοντας Σιδερένιους Κύβους και Κολοκύθες. + + + Κατοικούν στο Nether. Όπως και τα Slime, όταν σκοτωθούν σπάνε σε μικρότερες εκδόσεις του εαυτού τους. + + + Χωρικός + + + Αιλουροπάρδαλις + + + Επιτρέπει τη δημιουργία πιο ισχυρών ξορκιών, αν τοποθετηθεί γύρω από το Τραπέζι Μαγέματος. + + + {*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*} +Εάν τοποθετήσετε δύο σεντούκια το ένα δίπλα στο άλλο θα συνδυαστούν για να σχηματίσουν ένα Μεγάλο Σεντούκι. Αυτό μπορεί να αποθηκεύσει ακόμη περισσότερα αντικείμενα.{*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*} +Οι Πόντοι Εμπειρίας που συλλέγονται μετά το θάνατο ενός mob ή κατά την εξόρυξη ορισμένων κύβων ή το λιώσιμό τους σε φούρνο, μπορούν να χρησιμοποιηθούν για το μάγεμα ορισμένων εργαλείων, όπλων, πανοπλίας και βιβλίων.{*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*} + + {*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*} + Αυτή η δυνατότητα επιτρέπει στον παίκτη να μετακινεί παίκτες ή τον εαυτό του με άλλους παίκτες στον κόσμο. + + + + Επόμενη Σελίδα + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΚΤΗΝΟΤΡΟΦΙΑ{*ETW*}{*B*}{*B*} +Εάν θέλετε όλα τα ζώα σας να βρίσκονται σε ένα μέρος, χτίστε ένα περιφραγμένο χώρο με λιγότερους από 20x20 κύβους και τοποθετήστε τα ζώα σας μέσα σε αυτόν. Αυτό σας εξασφαλίζει ότι θα βρίσκονται εκεί όταν επιστρέψετε για να τα δείτε. + + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΕΚΤΡΟΦΗ ΖΩΩΝ{*ETW*}{*B*}{*B*} +Τα ζώα του Minecraft μπορούν να εκτραφούν και να γεννήσουν μωρά!{*B*} +Για να εκτραφούν τα ζώα, θα πρέπει να τα ταΐζετε με την κατάλληλη τροφή για να ενεργοποιηθεί η "Λειτουργία Αγάπης".{*B*} +Δώστε Σιτάρι στην αγελάδα, στο mooshroom ή στα πρόβατα, Καρότα στο γουρούνι, Σπόρους Σιταριού ή Φυτά Nether στην κότα ή οποιοδήποτε είδος κρέατος στον λύκο και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να βρίσκεται κοντά τους το οποίο βρίσκεται επίσης σε "Λειτουργία Αγάπης".{*B*} +Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μωρό των ζώων θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο.{*B*} +Αφού βρεθεί σε "Λειτουργία Αγάπης", το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά.{*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*} +Τα αντικείμενα που βρίσκονται στο σεντούκι θα αποθηκευτούν εκεί για να τα μεταφέρετε ξανά πίσω στο απόθεμά σας αργότερα. + + + + Είχες παρευρεθεί στη 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*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : 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*} ενώ ο δείκτης βρίσκεται πάνω από το αντικείμενο που θέλετε να βάψετε. + + + + Η Minecon 2013 έγινε στο Ορλάντο, στη Φλόριντα των ΗΠΑ! + + + To .party() ήταν τέλειο! + + + Πάντα να υποθέτετε ότι οι φήμες είναι ψεύτικες, παρά ότι είναι αληθινές! + + + Προηγούμενη Σελίδα + + + Ανταλλαγή + + + Αμόνι + + + Το 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 μέσα στο Φρούριο στους χάρτες τους +για να σας εντοπίσουν εύκολα. + + + {*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*} + + + Κοινοποίηση Στιγμιοτύπων Οθόνης + + + Σεντούκια + + + Κατασκευή + + + Φούρνος + + + Βασικές Πληροφορίες + + + HUD + + + Απόθεμα + + + Διανομέας + + + Μάγεμα + + + Πύλη Nether + + + Για Πολλούς Παίκτες + + + Κτηνοτροφία + + + Εκτροφή Ζώων + + + Παρασκευή Φίλτρου + + + Στον deadmau5 αρέσει το Minecraft! + + + Οι Γουρουνάνθρωποι δεν θα σας επιτεθούν, εκτός εάν τους επιτεθείτε εσείς. + + + Μπορείτε να αλλάξετε το σημείο επαναφοράς του παιχνιδιού και να μετακινηθείτε γρήγορα στην αυγή εάν κοιμηθείτε σε κρεβάτι. + + + Στείλτε αυτές τις πύρινες σφαίρες πίσω στα Ghast! + + + Φτιάξτε πυρσούς για να φωτίζετε περιοχές τη νύχτα. Τα τέρατα θα αποφεύγουν τις περιοχές γύρω από αυτούς τους πυρσούς. + + + Για να πάτε πιο γρήγορα στον προορισμό σας χρησιμοποιήστε βαγόνι ορυχείου και ράγες! + + + Φυτέψτε μερικά βλαστάρια και θα μεγαλώσουν σε δέντρα. + + + Εάν χτίσετε μια πύλη, θα μπορέσετε να ταξιδέψετε σε άλλη διάσταση, στο Nether. + + + Δεν είναι καλή ιδέα να σκάβετε απευθείας προς τα κάτω ή προς τα πάνω. + + + Η πάστα οστών (που κατασκευάστηκε από κόκκαλο Σκελετού) μπορεί να χρησιμοποιηθεί ως λίπασμα και κάνει τα πράγματα να μεγαλώνουν κατευθείαν! + + + Οι Creeper θα εκραγούν όταν έρθουν κοντά σας! + + + Πατήστε{*CONTROLLER_VK_B*} για να ξεσκαρτάρετε το αντικείμενο που έχετε στο χέρι σας! + + + Χρησιμοποιήστε το κατάλληλο εργαλείο για τη δουλειά! + + + Εάν δεν μπορείτε να βρείτε κάρβουνο για τους πυρσούς σας, μπορείτε πάντα να φτιάξετε ξυλοκάρβουνο από δέντρα σε ένα φούρνο. + + + Οι μαγειρεμένες χοιρινές μπριζόλες σάς δίνουν περισσότερη ζωή από τις ωμές χοιρινές μπριζόλες. + + + Εάν ορίσετε τη δυσκολία του παιχνιδιού σε Γαλήνιο, η ζωή σας θα αναπληρωθεί αυτόματα και δεν θα εμφανιστούν τέρατα τη νύχτα! + + + Ταΐστε το λύκο ένα κόκκαλο για να τον δαμάσετε. Τότε μπορείτε να τον κάνετε να κάτσει ή να σας ακολουθήσει. + + + Μπορείτε να ξεσκαρτάρετε αντικείμενα όταν βρίσκεστε στο μενού Απόθεμα μετακινώντας το δρομέα από το μενού και πατώντας{*CONTROLLER_VK_A*} + + + Υπάρχει διαθέσιμο νέο περιεχόμενο για λήψη! Για να πραγματοποιήσετε τη λήψη πατήστε το κουμπί Minecraft Store στο Κύριο Μενού. + + + Μπορείτε να αλλάξετε την εμφάνιση του χαρακτήρα σας με ένα Πακέτο Skin από το Minecraft Store. Επιλέξτε το Minecraft Store στο Κύριο Μενού για να δείτε τι είναι διαθέσιμο. + + + Τροποποιήστε τις ρυθμίσεις γάμμα για να κάνετε το παιχνίδι πιο φωτεινό ή πιο σκοτεινό. + + + Εάν κοιμηθείτε σε κρεβάτι τη νύχτα, τότε θα ξημερώσει πιο γρήγορα στο παιχνίδι, αλλά σε ένα παιχνίδι για πολλούς παίκτες πρέπει όλοι οι παίκτες να κοιμηθούν σε κρεβάτια ταυτόχρονα. + + + Χρησιμοποιήστε μια αξίνα για να προετοιμάσετε το έδαφος για φύτευση. + + + Οι αράχνες δεν θα σας επιτεθούν κατά τη διάρκεια της ημέρας, εκτός εάν τις επιτεθείτε εσείς. + + + Το σκάψιμο του εδάφους ή της άμμου με φτυάρι είναι πιο γρήγορο από ό,τι με το χέρι σας! + + + Πάρτε χοιρινές μπριζόλες από τα γουρούνια, και μαγειρέψτε και φάτε τις για να αναπληρώσετε τη ζωή σας. + + + Πάρτε δέρμα από τις αγελάδες και χρησιμοποιήστε το για να φτιάξετε πανοπλία. + + + Εάν έχετε έναν άδειο κουβά, μπορείτε να τον γεμίσετε με γάλα από μια αγελάδα, νερό ή λάβα! + + + Ο οψιανός δημιουργείται όταν πέφτει νερό πάνω σε έναν κύβο λάβας. + + + Τώρα στο παιχνίδι θα βρείτε και φράχτες που στοιβάζονται! + + + Ορισμένα ζώα θα σας ακολουθήσουν, εάν έχετε σιτάρι στο χέρι σας. + + + Εάν ένα ζώο δεν μπορεί να κινηθεί για περισσότερους από 20 κύβους σε οποιαδήποτε κατεύθυνση, δεν θα εξαφανιστεί. + + + Οι ήμεροι λύκοι δείχνουν την υγεία τους με τη θέση της ουράς τους. Ταΐστε τους κρέας για να τους θεραπεύσετε. + + + Μαγειρέψτε ένα κάκτο στο φούρνο για να πάρετε πράσινη βαφή. + + + Διαβάστε την ενότητα "Τι Νέο Υπάρχει" στα μενού "Τρόπος Παιχνιδιού" για να δείτε τις τελευταίες πληροφορίες σχετικά με την ενημερωμένη έκδοση του παιχνιδιού. + + + Μουσική από τους C418! + + + Ποιος είναι ο Notch; + + + Η Mojang έχει περισσότερα βραβεία από ότι προσωπικό! + + + Υπάρχουν και ορισμένοι διάσημοι που παίζουν Minecraft! + + + Ο Notch έχει πάνω από ένα εκατομμύριο ακόλουθους στο twitter! + + + Δεν έχουν όλοι οι Σουηδοί ξανθά μαλλιά. Μερικοι, όπως ο Jens από τη Mojang, έχουν ακόμη και κόκκινα μαλλιά! + + + Θα υπάρξει τελικά ενημέρωση σε αυτό το παιχνίδι! + + + Εάν τοποθετήσετε δύο σεντούκια το ένα δίπλα στο άλλο θα δημιουργηθεί ένα μεγάλο σεντούκι. + + + Προσέχετε όταν δημιουργείτε κατασκευές από μαλλί σε ανοικτό χώρο, καθώς οι αστραπές από καταιγίδες μπορεί να βάλουν φωτιά στο μαλλί. + + + Ένας μόνο κουβάς από λάβα μπορεί να χρησιμοποιηθεί σε έναν φούρνο για τη δημιουργία 100 κύβων. + + + Το όργανο που παίζει έναν κύβο νότας εξαρτάται από το υλικό που βρίσκεται κάτω από αυτό. + + + Η λάβα μπορεί να χρειαστεί μερικά λεπτά για να εξαφανιστεί ΕΝΤΕΛΩΣ όταν αφαιρεθεί ο κύβος πηγής. + + + Η πέτρα επίστρωσης είναι ανθεκτική στις πύρινες σφαίρες των Ghast και έτσι είναι χρήσιμη για τη φύλαξη των πυλών. + + + Οι κύβοι που μπορούν να χρησιμοποιηθούν ως πηγή φωτός λιώνουν το χιόνι και τον πάγο. Αυτά περιλαμβάνουν τους πυρσούς, τις λαμψόπετρες και τα φανάρια από κολοκύθα. + + + Τα Ζόμπι και οι Σκελετοί μπορούν να επιβιώσουν στο φως της ημέρας εάν βρίσκονται στο νερό. + + + Οι κότες γεννούν ένα αυγό κάθε 5 με 10 λεπτά. + + + Ο οψιανός μπορεί να εξορυχτεί με αδαμάντινη αξίνα. + + + Οι Creeper αποτελούν την πιο εύκολη πηγή για να αποκτήσετε πυρίτιδα. + + + Εάν επιτεθείτε σε ένα λύκο, τότε τυχόν λύκοι που βρίσκονται κοντά σας θα γίνουν εχθρικοί και θα σας επιτεθούν. Αυτό ισχύει και για τους Γουρουνάνθρωπους Ζόμπι. + + + Οι λύκοι δεν μπορούν να εισέλθουν στο Nether. + + + Οι λύκοι δεν θα επιτεθούν στους Creeper. + + + Απαιτείται για την εξόρυξη πέτρινων κύβων και μεταλλευμάτων. + + + Χρησιμοποιείται στη συνταγή του κέικ και ως συστατικό για την παρασκευή φίλτρων. + + + Χρησιμοποιείται για τη δημιουργία ηλεκτρικού φορτίου κατά την ενεργοποίηση ή την απενεργοποίηση. Παραμένει σε κατάσταση ενεργοποίησης ή απενεργοποίησης μέχρι να πατηθεί ξανά. + + + Μεταδίδει συνεχώς ηλεκτρικό φορτίο ή μπορεί να χρησιμοποιηθεί ως πομπός/δέκτης, αν συνδεθεί στο πλάι ενός κύβου. +Μπορεί επίσης να χρησιμοποιηθεί για φωτισμό χαμηλής έντασης. + + + Αναπληρώνει 2{*ICON_SHANK_01*} και μπορεί να χρησιμοποιηθεί για την κατασκευή ενός χρυσού μήλου. + + + Αναπληρώνει 2{*ICON_SHANK_01*} και θεραπεύει την υγεία σας για 4 δευτερόλεπτα. Κατασκευάζεται από ένα μήλο και ψήγματα χρυσού. + + + Αναπληρώνει 2{*ICON_SHANK_01*}. Αν το φάτε μπορεί να δηλητηριαστείτε. + + + Χρησιμοποιείται σε κυκλώματα Κοκκινόπετρας ως αναμεταδότης, αντίσταση ή/και ως ημιαγωγός. + + + Χρησιμοποιείται για την οδήγηση βαγονιών ορυχείου. + + + Όταν τροφοδοτείται με ρεύμα, επιταχύνει τα βαγόνια που περνούν από επάνω του. Όταν δεν τροφοδοτείται με ρεύμα, φρενάρει τα βαγόνια που περνούν από επάνω του. + + + Λειτουργεί σαν Πλάκα Πίεσης (μεταδίδει σήμα Κοκκινόπετρας όταν τροφοδοτείται με ρεύμα), αλλά μπορεί να ενεργοποιηθεί μόνο από ένα βαγόνι ορυχείου. + + + Χρησιμοποιείται για τη μετάδοση ηλεκτρικού φορτίου όταν πατιέται. Παραμένει ενεργό για περίπου ένα δευτερόλεπτο και μετά απενεργοποιείται. + + + Χρήση για την αποθήκευση και την εκτόξευση αντικειμένων με τυχαία σειρά όταν φορτίζεται μέσω Κοκκινόπετρας. + + + Παίζει μια νότα όταν ενεργοποιείται. Χτυπήστε το για να αλλάξετε τον τόνο της νότας. Το μουσικό όργανο αλλάζει ανάλογα με τον τύπο κύβου στον οποίο θα τοποθετηθεί. + + + Αναπληρώνει 2,5{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο ωμού ψαριού σε φούρνο. + + + Αναπληρώνει 1{*ICON_SHANK_01*}. + + + Αναπληρώνει 1{*ICON_SHANK_01*}. + + + Αναπληρώνει 3{*ICON_SHANK_01*}. + + + Χρησιμοποιείται ως πυρομαχικά για τόξα. + + + Αναπληρώνει 2,5{*ICON_SHANK_01*}. + + + Αναπληρώνει 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*}. Δημιουργείται από το ψήσιμο ωμού μοσχαρίσιου κρέατος σε φούρνο. + + + Χρησιμοποιείται για τη μετακίνησή σας ή για τη μετακίνηση ενός ζώου ή τέρατος σε ράγες. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού μπλε μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία γαλανού μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία μοβ μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού πράσινου μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία γκρι μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού γκρι μαλλιού. +(Σημείωση: Μπορείτε επίσης να δημιουργήσετε ανοιχτή γκρι βαφή, αν συνδυάσετε την γκρι βαφή με πάστα οστών. Με αυτόν τον τρόπο, μπορείτε να δημιουργήσετε τέσσερις ανοιχτές γκρι βαφές από έναν ασκό μελάνης). + + + Χρησιμοποιείται ως βαφή για τη δημιουργία φούξια μαλλιού. + + + Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. + + + Χρησιμοποιείται για τη δημιουργία βιβλίων και χαρτών. + + + Μπορεί να χρησιμοποιηθεί για τη δημιουργία ραφιών βιβλιοθήκης ή Μαγεμένων Βιβλίων, αν μαγευτεί. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία μπλε μαλλιού. + + + Παίζει Δίσκους Μουσικής. + + + Χρησιμοποιήστε τα για να δημιουργήστε πολύ ισχυρά εργαλεία, όπλα ή πανοπλίες. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία πορτοκαλί μαλλιού. + + + Συλλέγεται από πρόβατα και μπορεί να χρωματιστεί με διάφορες βαφές. + + + Χρησιμοποιείται ως δομικό υλικό και μπορεί να χρωματιστεί με διάφορες βαφές. Αυτή η συνταγή δεν συνιστάται, καθώς μπορείτε να αποκτήσετε Μαλλί εύκολα από Πρόβατα. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία μαύρου μαλλιού. + + + Χρησιμοποιείται για τη μεταφορά αγαθών σε ράγες. + + + Κινείται σε ράγες και μπορεί να δώσει ώθηση σε άλλα βαγόνια, αν τροφοδοτηθεί με κάρβουνο. + + + Χρησιμοποιείται για μετακίνηση στο νερό. Είναι πιο γρήγορο από το κολύμπι. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία πράσινου μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία κόκκινου μαλλιού. + + + Χρησιμοποιείται για τη στιγμιαία ανάπτυξη σοδειών, δέντρων, ψηλού γρασιδιού, μεγάλων μανιταριών και λουλουδιών και μπορεί να χρησιμοποιηθεί και στις συνταγές βαφών. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία ροζ μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία καφέ μαλλιού, ως συστατικό για μπισκότα ή για την καλλιέργεια Κακαόδεντρων. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία ασημί μαλλιού. + + + Χρησιμοποιείται ως βαφή για τη δημιουργία κίτρινου μαλλιού. + + + Επιτρέπει τις επιθέσεις από απόσταση με τη χρήση βελών. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν τις φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + + Μια γυαλιστερή ράβδος που μπορεί να χρησιμοποιηθεί για την κατασκευή εργαλείων από αυτό το υλικό. Δημιουργείται λιώνοντας μεταλλεύματα σε φούρνο. + + + Επιτρέπει την κατασκευή ράβδων, πετραδιών ή βαφών σε μετακινούμενους κύβους. Μπορεί να χρησιμοποιηθεί ως ακριβός κύβος κατασκευής ή χώρος αποθήκευσης των μεταλλευμάτων. + + + Χρησιμοποιείται για την μετάδοση ηλεκτρικού φορτίου όταν πατήσει πάνω της ένας παίκτης, ζώο ή τέρας. Οι Ξύλινες Πλάκες Πίεσης μπορούν επίσης να ενεργοποιηθούν εάν ρίξετε κάτι πάνω σε αυτές. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 8 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 6 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν τις φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 6 όταν το φορά. + + + Οι σιδερένιες πόρτες μπορούν να ανοίξουν μόνο με Κοκκινόπετρα, κουμπιά ή διακόπτες. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + + Χρησιμοποιείται για το κόψιμο ξύλινων κύβων ταχύτερα από ότι με το χέρι. + + + Χρησιμοποιείται για το όργωμα κύβων χώματος και γρασιδιού για την προετοιμασία καλλιέργειας. + + + Οι ξύλινες πόρτες ενεργοποιούνται εάν τις χρησιμοποιήσετε, τις χτυπήσετε ή χρησιμοποιήσετε Κοκκινόπετρα. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 4 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. + + + Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + + Χρησιμοποιούνται για σκάλες. + + + Χρησιμοποιείται για στιφάδο μανιταριών. Μπορείτε να κρατήσετε το μπολ αφού φάτε το στιφάδο. + + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού, λάβας και γάλακτος. + + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού. + + + Εμφανίζει κείμενο που καταχωρήσατε εσείς ή άλλοι παίκτες. + + + Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. + + + Χρησιμοποιείται για την πρόκληση εκρήξεων. Ενεργοποιείται μετά την τοποθέτηση, αναφλέγοντάς το με το αντικείμενο Πυρόλιθος και Χάλυβας ή με ηλεκτρικό φορτίο. + + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά λάβας. + + + Εμφανίζει τις θέσεις του Ήλιου και της Σελήνης. + + + Δείχνει την αφετηρία σας. + + + Ενώ το κρατάτε, δημιουργεί ένα είδωλο της περιοχής που εξερευνάτε. Μπορεί να χρησιμοποιηθεί για το σχεδιασμό διαδρομής. + + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά γάλακτος. + + + Χρησιμοποιείται για τη δημιουργία φωτιάς, την ανάφλεξη TNT και το άνοιγμα πυλών, μόλις κατασκευαστούν. + + + Χρησιμοποιείται για ψάρεμα. + + + Ενεργοποιούνται εάν τις χρησιμοποιήσετε, τις χτυπήσετε ή χρησιμοποιήσετε κοκκινόπετρα. Λειτουργούν ως κανονικές πόρτες αλλά έχουν διάσταση 1x1 κύβους και είναι επίπεδες στο έδαφος. + + + Χρησιμοποιούνται ως δομικό υλικό και μπορούν να κατασκευάσουν πολλά πράγματα. Μπορούν να δημιουργηθούν από οποιαδήποτε μορφή ξύλου. + + + Χρησιμοποιείται ως δομικό υλικό. Δεν επηρεάζεται από τη βαρύτητα όπως η κανονική Άμμος. + + + Χρησιμοποιείται ως δομικό υλικό. + + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + + Χρησιμοποιείται για τη δημιουργία φωτός. Οι πυρσοί λιώνουν επίσης το χιόνι και τον πάγο. + + + Χρησιμοποιείται για την κατασκευή πυρσών, βέλων, σημάτων, σκαλών, φραχτών και ως λαβές για εργαλεία και όπλα. + + + Χρησιμοποιείται για την αποθήκευση κύβων και αντικειμένων. Τοποθετήστε δύο σεντούκια το ένα δίπλα στο άλλο για να δημιουργήσετε ένα μεγαλύτερο σεντούκι με τη διπλή χωρητικότητα. + + + Χρησιμοποιείται ως φράγμα και δεν μπορείτε να τον υπερπηδήσετε. Υπολογίζεται με ύψος 1,5 κύβου για τους παίκτες, τα ζώα και τα τέρατα αλλά με ύψος 1 κύβου για άλλους κύβους. + + + Χρησιμοποιείται για κατακόρυφο σκαρφάλωμα. + + + Χρησιμοποιείται για να προχωρά το χρόνο προς τα εμπρός οποιαδήποτε στιγμή τη νύχτα προς το ξημέρωμα εάν όλοι οι παίκτες στον κόσμο βρίσκονται στο κρεβάτι και αλλάζει το σημείο επαναφοράς του παίκτη. +Τα χρώματα του κρεβατιού είναι πάντα τα ίδια, ανεξάρτητα από τα χρώματα του μαλλιού που χρησιμοποιήθηκε. + + + Σας επιτρέπει να δημιουργήσετε μεγαλύτερη ποικιλία αντικειμένων από την κανονική κατασκευή. + + + Σας επιτρέπει να λιώσετε μέταλλα, να δημιουργήσετε ξυλοκάρβουνο και γυαλί και να μαγειρέψετε ψάρι και χοιρινές μπριζόλες. + + + Σιδερένιο Τσεκούρι + + + Φανάρι Κοκκινόπετρας + + + Σκαλοπάτια Ξύλου Ζούγκλας + + + Σκαλοπάτια από Σημύδα + + + Τρέχουσες Ρυθμίσεις Ελέγχου + + + Κρανίο + + + Κακάο + + + Σκαλοπάτια από Έλατο + + + Αυγό Δράκου + + + Πέτρα End + + + Πλαίσιο Πύλης End + + + Σκαλοπάτια από Αμμόλιθο + + + Φτέρη + + + Χαμόκλαδο + + + Διάταξη + + + Κατασκευή + + + Χρήση + + + Ενέργεια + + + Αθόρυβη Κίνηση/Μείωση Υψόμετρου + + + Αθόρυβη Κίνηση + + + Ξεσκαρτάρισμα + + + Αλλαγή Αντικειμένων Χεριού + + + Παύση + + + Κάμερα + + + Κίνηση/Τρέξιμο + + + Απόθεμα + + + Άλμα/Αύξηση Υψόμετρου + + + Άλμα + + + Πύλη End + + + Μίσχος Κολοκύθας + + + Καρπούζι + + + Γυάλινο Τζάμι + + + Πύλη Φράκτη + + + Κλήματα + + + Μίσχος Καρπουζιού + + + Σιδερένια Κάγκελα + + + Ραγισμένα Πέτρινα Τούβλα + + + Τούβλα από Πέτρα με Βρύα + + + Πέτρινα Τούβλα + + + Μανιτάρι + + + Μανιτάρι + + + Τούβλα από Λαξευμένη Πέτρα + + + Σκαλοπάτια από Τούβλα + + + Φυτό Nether + + + Σκαλοπάτια Τούβλων Nether + + + Φράκτης από Τούβλα Nether + + + Καζάνι + + + Βάση Παρασκευής + + + Τραπέζι Μαγέματος + + + Τούβλο Nether + + + Πέτρα Επίστρωσης Ασημόψαρου + + + Πέτρα Ασημόψαρου + + + Σκαλοπ. Πέτρινων Τούβλων + + + Νούφαρο + + + Μυκήλιο + + + Πέτρινο Τούβλο Ασημόψαρου + + + Αλλαγή Λειτουργίας Κάμερας + + + Αν χάσετε ζωή, αλλά έχετε μπάρα φαγητού με 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*} για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... + + + Πατήστε{*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 είναι ένα παιχνίδι στο οποίο μπορείτε να δημιουργήσετε ό,τι θέλετε με τη σωστή τοποθέτηση κύβων. +Τη νύχτα βγαίνουν τέρατα, γι' αυτό φροντίστε να δημιουργήσετε ένα καταφύγιο προτού να συμβεί αυτό. + + + + + + + + + + + + + + + + + + + + + + + + Διάταξη 1 + + + Κίνηση (Κατά την Πτήση) + + + Παίκτες/Πρόσκληση + + + + + + Διάταξη 3 + + + Διάταξη 2 + + + + + + + + + + + + + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να ξεκινήσετε τον εκπαιδευτικό οδηγό.{*B*} + Πατήστε{*CONTROLLER_VK_B*}, αν πιστεύετε ότι μπορείτε να παίξετε μόνοι σας. + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε. + + + + + + + + + + + + + + + + + + + + + + + + + + + Κύβος Ασημόψαρου + + + Πέτρινη Πλάκα + + + Ένας συμπαγής τρόπος αποθήκευσης Σιδήρου. + + + Κύβος Σιδήρου + + + Πλάκα από Βελανιδιά + + + Πλάκα από Αμμόλιθο + + + Πέτρινη Πλάκα + + + Ένας συμπαγής τρόπος αποθήκευσης Χρυσού. + + + Λουλούδι + + + Λευκό Μαλλί + + + Πορτοκαλί Μαλλί + + + Κύβος Χρυσού + + + Μανιτάρι + + + Τριαντάφυλλο + + + Πέτρινη Πλάκα + + + Ράφι Βιβλιοθήκης + + + TNT + + + Τούβλα + + + Πυρσός + + + Οψιανός + + + Πέτρα με Βρύα + + + Πλάκα από Τούβλα Nether + + + Πλάκα από Βελανιδιά + + + Πλάκα από Πέτρινα Τούβλα + + + Πλάκα από Τούβλα + + + Πλάκα Ξύλου Ζούγκλας + + + Πλάκα από Σημύδα + + + Πλάκα από Έλατο + + + Φούξια Μαλλί + + + Φύλλα Σημύδας + + + Φύλλα Ελάτου + + + Φύλλα Βελανιδιάς + + + Γυαλί + + + Σφουγγάρι + + + Φύλλα Ζούγκλας + + + Φύλλα + + + Βελανιδιά + + + Έλατο + + + Σημύδα + + + Ξύλο Ελάτου + + + Ξύλο Σημύδας + + + Ξύλο Ζούγκλας + + + Μαλλί + + + Ροζ Μαλλί + + + Γκρι Μαλλί + + + Ανοιχτό Γκρι Μαλλί + + + Ανοιχτό Μπλε Μαλλί + + + Κίτρινο Μαλλί + + + Ανοιχτό Πράσινο Μαλλί + + + Γαλανό Μαλλί + + + Πράσινο Μαλλί + + + Κόκκινο Μαλλί + + + Μαύρο Μαλλί + + + Μοβ Μαλλί + + + Μπλε Μαλλί + + + Καφέ Μαλλί + + + Πυρσός (Κάρβουνο) + + + Λαμψόπετρα + + + Άμμος των Ψυχών + + + Netherrack + + + Κύβος Λάπις Λάζουλι + + + Ορυκτό Λάπις Λάζουλι + + + Πύλη + + + Φανάρι από Κολοκύθα + + + Ζαχαρωτό + + + Πηλός + + + Κάκτος + + + Κολοκύθα + + + Φράκτης + + + Jukebox + + + Ένας συμπαγής τρόπος αποθήκευσης Λάπις Λάζουλι. + + + Καταπακτή + + + Κλειδωμένο Σεντούκι + + + Ημιαγωγός + + + Έμβολο με Κόλλα + + + Έμβολο + + + Μαλλί (οποιοδήποτε χρώμα) + + + Νεκρός Θάμνος + + + Κέικ + + + Κύβος Νότας + + + Διανομέας + + + Ψηλό Γρασίδι + + + Ιστός + + + Κρεβάτι + + + Πάγος + + + Τραπέζι Κατασκευής + + + Ένας συμπαγής τρόπος αποθήκευσης Διαμαντιών. + + + Κύβος Διαμαντιού + + + Φούρνος + + + Αγρόκτημα + + + Σοδειές + + + Ορυκτό Διαμάντι + + + Κλουβί Δημιουργίας Τεράτων + + + Φωτιά + + + Πυρσός (Ξυλοκάρβουνο) + + + Σκόνη Κοκκινόπετρας + + + Σεντούκι + + + Σκαλοπάτια από Βελανιδιά + + + Πινακίδα + + + Ορυκτή Κοκκινόπετρα + + + Σιδερένια Πόρτα + + + Πλάκα Πίεσης + + + Χιόνι + + + Κουμπί + + + Πυρσός Κοκκινόπετρας + + + Μοχλός + + + Ράγα + + + Σκάλα + + + Ξύλινη Πόρτα + + + Πέτρινα Σκαλοπάτια + + + Ράγα Εντοπισμού + + + Ηλεκτρική Ράγα + + + Έχετε συλλέξει αρκετή πέτρα επίστρωσης για να κατασκευάσετε ένα φούρνο. Δημιουργήστε τον με το τραπέζι κατασκευής. + + + Καλάμι Ψαρέματος + + + Ρολόι + + + Σκόνη Λαμψόπετρας + + + Βαγόνι με Φούρνο + + + Αυγό + + + Πυξίδα + + + Ωμό Ψάρι + + + Τριανταφυλλί + + + Πράσινο του Κάκτου + + + Καρποί Κακάο + + + Ψημένο Ψάρι + + + Σκόνη Βαφής + + + Ασκός Μελάνης + + + Βαγόνι με Σεντούκι + + + Χιονόμπαλα + + + Βάρκα + + + Δέρμα + + + Βαγόνι Ορυχείου + + + Σέλα + + + Κοκκινόπετρα + + + Κουβάς Γάλατος + + + Χαρτί + + + Βιβλίο + + + Μπάλα Κόλλας + + + Τούβλο + + + Πηλός + + + Ζαχαρωτά + + + Λάπις Λάζουλι + + + Χάρτης + + + Δίσκος Μουσικής - "13" + + + Δίσκος Μουσικής - "Γάτα" + + + Κρεβάτι + + + Αγωγός Κοκκινόπετρας + + + Μπισκότο + + + Δίσκος Μουσικής - "Κύβοι" + + + Δίσκος Μουσικής - "Ήρεμη" + + + Δίσκος Μουσικής - "Τζαζ" + + + Δίσκος Μουσικής - "Τροπικό" + + + Δίσκος Μουσικής - "Τιτίβισμα" + + + Δίσκος Μουσικής - "Μακριά" + + + Δίσκος Μουσικής - "Ψώνια" + + + Κέικ + + + Γκρίζα Βαφή + + + Ροζ Βαφή + + + Ανοιχτή Πράσινη Βαφή + + + Μοβ Βαφή + + + Γαλανή Βαφή + + + Ανοιχτή Γκρίζα Βαφή + + + Κίτρινο Ηλίανθου + + + Πάστα Οστών + + + Κόκκαλο + + + Ζάχαρη + + + Ανοιχτή Μπλε Βαφή + + + Φούξια Βαφή + + + Πορτοκαλί Βαφή + + + Πινακίδα + + + Δερμάτινο Χιτώνιο + + + Σιδερένιος Θώρακας + + + Αδαμάντινος Θώρακας + + + Σιδερένια Περικεφαλαία + + + Αδαμάντινη Περικεφαλαία + + + Χρυσή Περικεφαλαία + + + Χρυσός Θώρακας + + + Χρυσή Περισκελίδα + + + Δερμάτινες Μπότες + + + Σιδερένιες Μπότες + + + Δερμάτινο Παντελόνι + + + Σιδερένια Περισκελίδα + + + Αδαμάντινη Περισκελίδα + + + Δερμάτινος Σκούφος + + + Πέτρινο Σκαλιστήρι + + + Σιδερένιο Σκαλιστήρι + + + Αδαμάντινο Σκαλιστήρι + + + Αδαμάντινο Τσεκούρι + + + Χρυσό Τσεκούρι + + + Ξύλινο Σκαλιστήρι + + + Χρυσό Σκαλιστήρι + + + Σιδερόπλεκτος Θώρακας + + + Σιδερόπλεκτη Περισκελίδα + + + Σιδερόπλεκτες Μπότες + + + Ξύλινη Πόρτα + + + Σιδερένια Πόρτα + + + Σιδερόπλεκτη Περικεφαλαία + + + Αδαμάντινες Μπότες + + + Φτερό + + + Μπαρούτι + + + Σπόροι Σιταριού + + + Μπολ + + + Μανιταρόσουπα + + + Σπάγκος + + + Σιτάρι + + + Ψημένη Χοιρινή Μπριζόλα + + + Πίνακας + + + Χρυσό Μήλο + + + Ψωμί + + + Πυρόλιθος + + + Ωμή Χοιρινή Μπριζόλα + + + Ραβδί + + + Κουβάς + + + Κουβάς Νερού + + + Κουβάς Λάβας + + + Χρυσές Μπότες + + + Ράβδος Σιδήρου + + + Ράβδος Χρυσού + + + Πυρόλιθος και Χάλυβας + + + Κάρβουνο + + + Ξυλοκάρβουνο + + + Διαμάντι + + + Μήλο + + + Τόξο + + + Βέλος + + + Δίσκος Μουσικής - "Σκοτάδι" + + + + Πατήστε{*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*} για να συλλέξετε μια στοίβα αυτού του αντικειμένου. + + + + Νερό + + + Γυάλινο Μπουκάλι + + + Μπουκάλι Νερού + + + Μάτι Αράχνης + + + Ψήγμα Χρυσού + + + Φυτό Nether + + + {*splash*}{*prefix*}Φίλτρο {*postfix*} + + + Ζυμωμένο Μάτι Αράχν. + + + Καζάνι + + + Μάτι του Ender + + + Γυαλιστερό Καρπούζι + + + Σκόνη Blaze + + + Κρέμα Μάγματος + + + Βάση Παρασκευής + + + Δάκρυ Ghast + + + Σπόροι Κολοκύθας + + + Σπόροι Καρπουζιού + + + Ωμό Κοτόπουλο + + + Δίσκος μουσικής - "11" + + + Δίσκος Μουσικής - "Πού Είμαστε Τώρα" + + + Ψαλίδια + + + Ψημένο Κοτόπουλο + + + Μαργαριτάρι του Ender + + + Φέτα Καρπουζιού + + + Ράβδος Blaze + + + Ωμό Μοσχάρι + + + Μπριζόλα + + + Σάπιο Κρέας + + + Μπουκάλι Μαγέματος + + + Σανίδες από Βελανιδιά + + + Σανίδες από Έλατο + + + Σανίδες από Σημύδα + + + Κύβοι Γρασιδιού + + + Χώμα + + + Πέτρα Επίστρωσης + + + Σανίδ. Ξύλου Ζούγκλας + + + Βλαστάρι Σημύδας + + + Βλαστάρι Ζούγκλας + + + Καθαρός Βράχος + + + Βλαστάρι + + + Βλαστάρι Βελανιδιάς + + + Βλαστάρι Ελάτου + + + Πέτρα + + + Πλαίσιο Αντικειμένου + + + Δημιουργία {*CREATURE*} + + + Τούβλο Nether + + + Μπάλα Φωτιάς + + + Μπάλα Φωτιάς (Ξυλοκ.) + + + Μπάλα Φωτιάς (Κάρβ.) + + + Κρανίο + + + Κεφάλι + + + Κεφάλι από %s + + + Κεφάλι Creeper + + + Κρανίο Σκελετού + + + Κρανίο Μαύρου Σκελετού + + + Κεφάλι Ζόμπι + + + Ένας τρόπος αποθήκευσης Κάρβουνου που δεν πιάνει χώρο. Μπορεί να χρησιμοποιηθεί ως καύσιμο σε έναν Κλίβανο. Δηλητήριο - - Γρηγοράδας + + Πείνα Βραδύτητας - - Βιασύνης + + Γρηγοράδας - - Ανίας + + Αορατότητα - - Δύναμης + + Αναπνοή στο Νερό - - Αδυναμίας + + Νυχτερινή Όραση - - Επούλωσης + + Τυφλότητα Πρόκλησης Βλάβης - - Άλματος + + Επούλωσης Ναυτίας @@ -5195,29 +6053,38 @@ Αναδημιουργίας + + Ανίας + + + Βιασύνης + + + Αδυναμίας + + + Δύναμης + + + Πυραντοχή + + + Κορεσμός + Αντοχής - - Πυραντοχής + + Άλματος - - Αναπνοής στο Νερό + + Wither - - Αορατότητας + + Ώθηση Υγείας - - Τυφλότητας - - - Νυχτερινής Όρασης - - - Πείνας - - - Δηλητηρίου + + Απορρόφηση @@ -5228,9 +6095,78 @@ III + + Αορατότητας + IV + + Αναπνοής στο Νερό + + + Πυραντοχής + + + Νυχτερινής Όρασης + + + Δηλητηρίου + + + Πείνας + + + της Απορρόφησης + + + του Κορεσμού + + + της Ώθησης Υγείας + + + Τυφλότητας + + + της Αποσύνθεσης + + + Ακατέργαστο + + + Αραιό + + + Διάχυτο + + + Διαφανές + + + Γαλακτερό + + + Δυσάρεστο + + + Βουτυρένιο + + + Κρεμώδες + + + Κακοφτιαγμένο + + + Μονότονο + + + Ογκώδες + + + Ήπιο + Πιτσιλιστό @@ -5240,50 +6176,14 @@ Ανιαρό - - Ήπιο + + Τολμηρό - - Διαφανές + + Τονωτικό - - Γαλακτερό - - - Διάχυτο - - - Ακατέργαστο - - - Αραιό - - - Δυσάρεστο - - - Μονότονο - - - Ογκώδες - - - Κακοφτιαγμένο - - - Βουτυρένιο - - - Κρεμώδες - - - Γλυκόπιοτο - - - Κομψό - - - Παχύ + + Γοητευτικό Εκλεπτυσμένο @@ -5291,149 +6191,152 @@ Φανταχτερό - - Γοητευτικό - - - Τολμηρό - - - Διυλισμένο - - - Τονωτικό - Λαμπερό - - Ισχυρό - - - Απαίσιο - - - Άοσμο - Δύσοσμο Τραχύ + + Άοσμο + + + Ισχυρό + + + Απαίσιο + + + Γλυκόπιοτο + + + Διυλισμένο + + + Παχύ + + + Κομψό + + + Αποκαθιστά σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Χειροτερεύει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Οι παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά, αποκτούν ανοσία στις βλάβες από φωτιά, λάβα και από τις επιθέσεις παραταγμένων Blaze. + + + Δεν προκαλεί καμία επίδραση. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε φίλτρα σε μια βάση παρασκευής φίλτρων, προσθέτοντας περισσότερα συστατικά. + Στυφό + + Επιβραδύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, μειώνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + + + Επιταχύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, αυξάνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + + + Αυξάνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. + + + Βελτιώνει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Μειώνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. + + + Χρησιμοποιείται ως βάση για όλα τα φίλτρα. Χρησιμοποιήστε το σε μια βάση παρασκευής φίλτρων. + Αηδιαστικό Βρομερό - - Χρησιμοποιείται ως βάση για όλα τα φίλτρα. Χρησιμοποιήστε το σε μια βάση παρασκευής φίλτρων. - - - Δεν προκαλεί καμία επίδραση. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε φίλτρα σε μια βάση παρασκευής φίλτρων, προσθέτοντας περισσότερα συστατικά. - - - Επιταχύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, αυξάνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. - - - Επιβραδύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, μειώνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. - - - Αυξάνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. - - - Μειώνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. - - - Βελτιώνει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - - Χειροτερεύει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - - Αποκαθιστά σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - - Οι παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά, αποκτούν ανοσία στις βλάβες από φωτιά, λάβα και από τις επιθέσεις παραταγμένων Blaze. - - - Χειροτερεύει σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + Πλήγμα Οξύτητα - - Πλήγμα + + Χειροτερεύει σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - Εξολόθρευση των Αρθρόποδων + + Ζημιά Επίθεσης Χτύπημα προς τα Πίσω - - Πυρανάλωμα + + Εξολόθρευση των Αρθρόποδων - - Προστασία + + Ταχύτητα - - Προστασία από Φωτιά + + Ενισχύσεις Ζόμπι - - Ανάλαφρη Πτώση + + Δύναμη Άλματος Αλόγου - - Προστασία από Έκρηξη + + Όταν εφαρμόζεται: - - Προστασία από Βλήματα + + Αντοχή στο Χτύπημα προς τα Πίσω - - Αναπνοή + + Εύρος παρακολούθησης mob - - Ένα με το Νερό - - - Αποδοτικότητα + + Μέγιστη Υγεία Μεταξένιο Άγγιγμα - - Άθραυστο + + Αποδοτικότητα - - Λεηλασία + + Ένα με το Νερό Τύχη - - Ισχύς + + Λεηλασία - - Φλόγα + + Άθραυστο - - Γροθιά + + Προστασία από Φωτιά - - Άπειρο + + Προστασία - - I + + Πυρανάλωμα - - II + + Ανάλαφρη Πτώση - - III + + Αναπνοή + + + Προστασία από Βλήματα + + + Προστασία από Έκρηξη IV @@ -5444,23 +6347,29 @@ VI + + Γροθιά + VII - - VIII + + III - - IX + + Φλόγα - - X + + Ισχύς - - Λιώνοντάς το μπορεί να εξάγει Σμαράγδια. + + Άπειρο - - Μοιάζει με Σεντούκι, με τη διαφορά ότι τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι του End είναι διαθέσιμα σε κάθε Σεντούκι του End που έχει ο παίκτης, ακόμη και σε διαφορετικές διαστάσεις. + + II + + + I Ενεργοποιείται όταν μια οντότητα περάσει μέσα από ένα συνδεδεμένο Σύρμα Παγίδευσης. @@ -5471,44 +6380,59 @@ Συμπαγής τρόπος για την αποθήκευση Σμαραγδιών. - - Τοίχος φτιαγμένος από Πέτρα Επίστρωσης. + + Μοιάζει με Σεντούκι, με τη διαφορά ότι τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι του End είναι διαθέσιμα σε κάθε Σεντούκι του End που έχει ο παίκτης, ακόμη και σε διαφορετικές διαστάσεις. - - Μπορεί να χρησιμοποιηθεί για την επισκευή όπλων, εργαλείων και πανοπλίας. + + IX - - Λιώνει σε φούρνο για να παράγει Χαλαζία του Nether. + + VIII - - Χρησιμοποιείται ως διακοσμητικό. + + Μπορεί να εξορυχτεί με Σιδερένια ή και καλύτερη Αξίνα για τη συλλογή Σμαραγδιών. - - Μπορεί να χρησιμοποιηθεί σε συναλλαγές με χωρικούς. - - - Χρησιμοποιείται ως διακοσμητικό. Σε αυτό μπορείτε να φυτέψετε Λουλούδια, Βλαστάρια, Κάκτους και Μανιτάρια. + + X Αποκαθιστά 2{*ICON_SHANK_01*} και μπορείτε να κατασκευάσετε με αυτό ένα χρυσό καρότο. Μπορεί να φυτευτεί σε αγρόκτημα. + + Χρησιμοποιείται ως διακοσμητικό. Σε αυτό μπορείτε να φυτέψετε Λουλούδια, Βλαστάρια, Κάκτους και Μανιτάρια. + + + Τοίχος φτιαγμένος από Πέτρα Επίστρωσης. + Αποκαθιστά 0,5{*ICON_SHANK_01*}. Μπορεί να ψηθεί σε φούρνο ή να φυτευτεί σε αγρόκτημα. - - Αποκαθιστά 3{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο μιας πατάτας σε φούρνο. + + Λιώνει σε φούρνο για να παράγει Χαλαζία του Nether. + + + Μπορεί να χρησιμοποιηθεί για την επισκευή όπλων, εργαλείων και πανοπλίας. + + + Μπορεί να χρησιμοποιηθεί σε συναλλαγές με χωρικούς. + + + Χρησιμοποιείται ως διακοσμητικό. + + + Αποκαθιστά 4{*ICON_SHANK_01*}. - Αποκαθιστά 1{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. Μπορεί να φυτευτεί σε αγρόκτημα. Αν το φάτε, υπάρχει πιθανότητα να σας δηλητηριάσει. - - - Αποκαθιστά 3{*ICON_SHANK_01*}. Κατασκευάζεται από ένα καρότο και ψήγματα χρυσού. + Αποκαθιστά 1{*ICON_SHANK_01*}. Αν το φάτε, υπάρχει πιθανότητα να σας δηλητηριάσει. Χρησιμοποιείται για να ελέγχει ένα σελωμένο γουρούνι όταν το ιππεύετε. - - Αποκαθιστά 4{*ICON_SHANK_01*}. + + Αποκαθιστά 3{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο μιας πατάτας σε φούρνο. + + + Αποκαθιστά 3{*ICON_SHANK_01*}. Κατασκευάζεται από ένα καρότο και ψήγματα χρυσού. Χρησιμοποιείται με ένα Αμόνι για να μαγεύετε όπλα, εργαλεία ή πανοπλίες. @@ -5516,6 +6440,15 @@ Δημιουργείται από την εξόρυξη του Μεταλλεύματος Χαλαζία του 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,72 +6587,77 @@ Σμιλεμένος Αμμόλιθος + + Ο/Η {*PLAYER*} σκοτώθηκε προσπαθώντας να χτυπήσει τον/την {*SOURCE*} + Στιλπνός Αμμόλιθος - - Ο/Η {*PLAYER*} σκοτώθηκε προσπαθώντας να χτυπήσει {*SOURCE*} - Ο/Η {*PLAYER*} συνθλίφτηκε κάτω από ένα Αμόνι. Ο/Η {*PLAYER*} συνθλίφθηκε κάτω από έναν κύβο. - - Ο/Η {*PLAYER*} τηλεμεταφέρθηκε στον/στην {*DESTINATION*} - Ο/Η {*PLAYER*} σας τηλεμετέφερε στη θέση του/της - - Ο/Η {*PLAYER*} τηλεμεταφέρθηκε σε εσάς + + Ο/Η {*PLAYER*} τηλεμεταφέρθηκε στον/στην {*DESTINATION*} Αγκάθια - - Πλάκα Χαλαζία + + Ο/Η {*PLAYER*} τηλεμεταφέρθηκε σε εσάς Φωτίζει τις σκοτεινές περιοχές σαν το φως της μέρας, ακόμη και κάτω από το νερό. + + Πλάκα Χαλαζία + Κάνει αόρατους τους παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά. Επισκευή και Όνομα - - Κόστος Μαγικού: %d - Πολύ Ακριβό! - - Μετονομασία + + Κόστος Μαγικού: %d Έχετε: - - Απαιτούμενα Αντικείμενα + + Μετονομασία Ο/Η {*VILLAGER_TYPE*} προσφέρει %s - - Επισκευή + + Απαιτούμενα Αντικείμενα Ανταλλαγή - - Βαφή κολάρου + + Επισκευή Αυτό είναι το περιβάλλον χρήστη Αμόνι, το οποίο μπορείτε να χρησιμοποιείτε για να μετονομάζετε, να επισκευάζετε και να εφαρμόζετε μαγικά σε όπλα, πανοπλίες ή εργαλεία, πληρώνοντας σε Επίπεδα Εμπειρίας. + + + + Βαφή κολάρου + + + + Για να αρχίσετε να εργάζεστε σε ένα αντικείμενο, τοποθετήστε το στην πρώτη υποδοχή εισερχομένων. @@ -5738,9 +6667,9 @@ Πατήστε{*CONTROLLER_VK_B*} εάν ήδη γνωρίζετε το περιβάλλον χρήστη Αμόνι. - + - Για να αρχίσετε να εργάζεστε σε ένα αντικείμενο, τοποθετήστε το στην πρώτη υποδοχή εισερχομένων. + Εναλλακτικά, μπορείτε να τοποθετήσετε ένα δεύτερο, πανομοιότυπο αντικείμενο στη δεύτερη υποδοχή, για να συνδυάσετε τα δυο αντικείμενα. @@ -5748,24 +6677,14 @@ Όταν τοποθετήσετε τη σωστή πρώτη ύλη στη δεύτερη υποδοχή εισόδου (π.χ. Ράβδους Σιδήρου για ένα κατεστραμμένο Σιδερένιο Σπαθί), η προτεινόμενη επισκευή θα εμφανιστεί στην υποδοχή εξόδου. - + - Εναλλακτικά, μπορείτε να τοποθετήσετε ένα δεύτερο, πανομοιότυπο αντικείμενο στη δεύτερη υποδοχή, για να συνδυάσετε τα δυο αντικείμενα. + Το κόστος της εργασίας σε Επίπεδα Εμπειρίας εμφανίζεται κάτω από την έξοδο. Αν δεν έχετε αρκετά Επίπεδα Εμπειρίας, η επισκευή δεν μπορεί να ολοκληρωθεί. Για να μαγέψετε αντικείμενα στο Αμόνι, βάλτε ένα Μαγεμένο Βιβλίο στη δεύτερη υποδοχή εισόδου. - - - - - Το κόστος της εργασίας σε Επίπεδα Εμπειρίας εμφανίζεται κάτω από την έξοδο. Αν δεν έχετε αρκετά Επίπεδα Εμπειρίας, η επισκευή δεν μπορεί να ολοκληρωθεί. - - - - - Μπορείτε να μετονομάσετε το αντικείμενο, αλλάζοντας το όνομα που εμφανίζεται στο πλαίσιο κειμένου. @@ -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,14 +6766,24 @@ Στα δυο κουτιά στην αριστερή πλευρά μπορείτε να δείτε το συνολικό αριθμό των αντικειμένων που απαιτούνται για την ανταλλαγή. - + - Πατήστε το{*CONTROLLER_VK_A*}, για να ανταλλάξετε τα αντικείμενα που ζητά ο χωρικός με το αντικείμενο που προσφέρει. + Η ποσότητα και ο τύπος των αντικειμένων που δίνετε στον χωρικό εμφανίζεται στα δυο πλαίσια στην αριστερή πλευρά. Σε αυτήν την περιοχή υπάρχει ένας χωρικός και ένα Σεντούκι που περιέχει Χαρτί, για να αγοράσετε αντικείμενα. + + + + + Πατήστε το{*CONTROLLER_VK_A*}, για να ανταλλάξετε τα αντικείμενα που ζητά ο χωρικός με το αντικείμενο που προσφέρει. + + + + + Οι παίκτες μπορούν να ανταλλάξουν αντικείμενα από το απόθεμά τους με τους χωρικούς. @@ -5864,19 +6793,14 @@ Πατήστε το{*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,37 +1,124 @@  - - 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 δεν θα εμφανίζεται στο στιγμιότυπο οθόνης. + + Επιλογή Λειτουργίας δικτύου + + + Διαδικτυακά ID Διαχωρισμένης Οθόνης + + + Τρόπαια + + + Αυτό το παιχνίδι διαθέτει μια λειτουργία αυτόματης αποθήκευσης επιπέδων. Όταν εμφανίζεται το παραπάνω εικονίδιο, το παιχνίδι αποθηκεύει τα δεδομένα σας. +Μην απενεργοποιείτε το σύστημα PlayStation®Vita όσο αυτό το εικονίδιο εμφανίζεται στην οθόνη. + + + Όταν ενεργοποιηθεί, ο οικοδεσπότης μπορεί να εναλλάσσει το να πετά, να απενεργοποιεί την εξάντληση και να γίνετε αόρατος από το μενού. Απενεργοποιεί τα τρόπαια και τις ενημερώσεις κατάταξης. + + + Διαδικτυακά ID: + + + Χρησιμοποιείτε τη δοκιμαστική έκδοση ενός πακέτου υφών. Θα έχετε πρόσβαση στα πλήρη περιεχόμενα του πακέτου υφών, αλλά δεν θα είστε σε θέση να αποθηκεύσετε την πρόοδό σας. +Αν επιχειρήσετε να αποθηκεύσετε ενώ βρίσκεστε στη δοκιμαστική έκδοση, θα σας δοθεί η επιλογή να αγοράσετε την πλήρη έκδοση. + + + + Ενημερωμένη έκδοση 1.04 (Ενημέρωση τίτλου 14) + + + Διαδικτυακά ID Παιχνιδιού + + + Κοιτάξτε τι έφτιαξα στο Minecraft: PlayStation®Vita Edition! + + + Η λήψη απέτυχε. Προσπαθήστε ξανά αργότερα. + + + Αποτυχία συμμετοχής στο παιχνίδι λόγω περιοριστικού τύπου NAT. Ελέγξτε τις ρυθμίσεις δικτύου σας. + + + Η μεταφόρτωση απέτυχε. Προσπαθήστε ξανά αργότερα. + + + Η λήψη ολοκληρώθηκε! + + + +Δεν υπάρχει αποθηκευμένο παιχνίδι στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών αυτήν τη στιγμή. +Μπορείτε να μεταφορτώσετε έναν αποθηκευμένο κόσμο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών χρησιμοποιώντας το Minecraft: PlayStation®3 Edition και, στη συνέχεια, να το κατεβάσετε με το Minecraft: PlayStation®Vita Edition. + + + + Η αποθήκευση δεν έχει ολοκληρωθεί + + + Έχει τελειώσει ο χώρος αποθήκευσης δεδομένων για την έκδοση PlayStation®Vita του Minecraft. Για να δημιουργήσεις χώρο, διάγραψε κάποιο άλλο αποθηκευμένο αρχείο της έκδοσης PlayStation®Vita του Minecraft. + + + Η μεταφόρτωση ακυρώθηκε + + + Έχετε ακυρώσει τη μεταφόρτωση αυτού του αποθηκευμένου παιχνιδιού στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών. + + + Μεταφόρτωση Αποθήκευσης για Συστήματα PS3™/PS4™ + + + Μεταφόρτωση δεδομένων : %d%% + + + "PSN" + + + Λήψη Αποθήκευσης Συστήματος PS3™ + + + Λήψη δεδομένων : %d%% + + + Αποθήκευση + + + Η μεταφόρτωση ολοκληρώθηκε! + + + Είστε βέβαιοι ότι θέλετε να μεταφορτώσετε αυτό το αποθηκευμένο παιχνίδι και να αντικαταστήσετε τυχόν τρέχοντα αποθηκευμένα παιχνίδια στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών; + + + Μετατροπή δεδομένων + + + ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ + + + ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΛΕΙΤΟΥΡΓΙΑ ΔΗΜΙΟΥΡΙΑΣ{*ETW*}{*B*}{*B*} @@ -46,32 +133,80 @@ Για να μπορέσετε να πετάξετε, πατήστε το{*CONTROLLER_ACTION_JUMP*} δυο φορές γρήγορα. Για να εγκαταλείψετε την πτήση, επαναλάβετε την ενέργεια. Για να πετάξετε γρηγορότερα, πιέστε γρήγορα και διαδοχικά το{*CONTROLLER_ACTION_MOVE*} προς τα εμπρός δύο φορές ενώ πετάτε. Όταν βρίσκεστε σε λειτουργία πτήσης, μπορείτε να κρατήσετε πατημένο το{*CONTROLLER_ACTION_JUMP*} για κίνηση προς τα πάνω και το{*CONTROLLER_ACTION_SNEAK*} για κίνηση προς τα κάτω ή να χρησιμοποιήσετε τα κατευθυντικά πλήκτρα για να κινηθείτε προς τα πάνω, κάτω, αριστερά ή δεξιά. - - ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ - - - ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ - «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» - - «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» - - - Πρόσκληση Φίλων - Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο στη Λειτουργία Δημιουργίας, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί στη Λειτουργία Επιβίωσης. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; - - Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. + + «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» - - Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο με τα Προνόμια Οικοδεσπότη ενεργοποιημένα, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί με αυτές τις επιλογές απενεργοποιημένες. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + + Πρόσκληση Φίλων + + + Το minecraftforum διαθέτει μια ενότητα ειδικά για το PlayStation®Vita Edition . + + + Θα μαθαίνετε τις τελευταίες πληροφορίες για αυτό το παιχνίδι στο twitter @4JStudios και @Kappische! + + + NOT USED + + + Μπορείτε να χρησιμοποιήσετε την οθόνη αφής στο σύστημα 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 δεν θα εμφανίζεται στο στιγμιότυπο οθόνης. + + + Φαίνεται ότι τα 4J Studios κατάργησαν τον Herobrine από το παιχνίδι για το σύστημα PlayStation®Vita, αλλά δεν είμαστε και πολύ σίγουροι. + + + Το Minecraft: PlayStation®Vita Edition έσπασε πολλά ρεκόρ! + + + Παίξατε το Δοκιμαστικό Παιχνίδι του Minecraft: PlayStation®Vita Edition για τον μέγιστο επιτρεπόμενο χρόνο! Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι, για να συνεχιστεί η διασκέδαση; + + + Η φόρτωση του «Minecraft: PlayStation®Vita Edition» απέτυχε. Δεν είναι δυνατή η συνέχεια. + + + Παρασκευή Φίλτρου + + + Επιστρέψατε στην οθόνη τίτλων, επειδή έχετε αποσυνδεθεί από το "PSN". + + + Η συμμετοχή στο παιχνίδι απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. + + + Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. + + + Δεν επιτρέπεται η δημιουργία αυτής της συνεδρίας παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. + + + Η δημιουργία διαδικτυακού παιχνιδιού απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. + + + Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί στο λογαριασμό σας στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Η σύνδεση με το "PSN" χάθηκε. Έξοδος στο κύριο μενού. @@ -79,11 +214,23 @@ Η σύνδεση με το "PSN" χάθηκε. + + Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. + + + Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο με τα Προνόμια Οικοδεσπότη ενεργοποιημένα, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί με αυτές τις επιλογές απενεργοποιημένες. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα τρόπαιο! Ξεκλειδώστε το πλήρες παιχνίδι για να απολαύσετε τo Minecraft: PlayStation®Vita Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + Οι παίκτες με ιδιότητα επισκέπτη δεν μπορούν να ξεκλειδώσουν το πλήρες παιχνίδι. Συνδεθείτε με έναν λογαριασμό στο Sony Entertainment Network. + + + Διαδικτυακό ID + Αυτό είναι το δοκιμαστικό παιχνίδι τοy Minecraft: PlayStation®Vita Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα θέμα! Ξεκλειδώστε το πλήρες παιχνίδι για να απολαύσετε το Minecraft: PlayStation®Vita Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". @@ -93,151 +240,7 @@ Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Για να μπορέσετε να αποδεχτείτε αυτήν την πρόσκληση, χρειάζεστε το πλήρες παιχνίδι. Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; - - Οι παίκτες με ιδιότητα επισκέπτη δεν μπορούν να ξεκλειδώσουν το πλήρες παιχνίδι. Συνδεθείτε με έναν λογαριασμό στο Sony Entertainment Network. - - - Διαδικτυακό ID - - - Παρασκευή Φίλτρου - - - Επιστρέψατε στην οθόνη τίτλων, επειδή έχετε αποσυνδεθεί από το "PSN". - - - - Παίξατε το Δοκιμαστικό Παιχνίδι του Minecraft: PlayStation®Vita Edition για τον μέγιστο επιτρεπόμενο χρόνο! Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι, για να συνεχιστεί η διασκέδαση; - - - Η φόρτωση του «Minecraft: PlayStation®Vita Edition» απέτυχε. Δεν είναι δυνατή η συνέχεια. - - - Η συμμετοχή στο παιχνίδι απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. - - - Η δημιουργία διαδικτυακού παιχνιδιού απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. - - - Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί στο λογαριασμό σας στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. - - - Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. - - - Δεν επιτρέπεται η δημιουργία αυτής της συνεδρίας παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. - - - Αυτό το παιχνίδι διαθέτει μια λειτουργία αυτόματης αποθήκευσης επιπέδων. Όταν εμφανίζεται το παραπάνω εικονίδιο, το παιχνίδι αποθηκεύει τα δεδομένα σας. -Μην απενεργοποιείτε το σύστημα PlayStation®Vita όσο αυτό το εικονίδιο εμφανίζεται στην οθόνη. - - - Όταν έχει ενεργοποιηθεί, ο οικοδεσπότης μπορεί να πραγματοποιήσει εναλλαγή στην ικανότητά του να πετά, να απενεργοποιήσει την εξάντληση και να κάνει τον εαυτό του αόρατο από το μενού παιχνιδιού. Απενεργοποιεί τα τρόπαια και τις ενημερώσεις πίνακα κατάταξης. - - - Διαδικτυακά ID Διαχωρισμένης Οθόνης - - - Τρόπαια - - - Διαδικτυακά ID: - - - Διαδικτυακά ID Παιχνιδιού - - - Κοιτάξτε τι έφτιαξα στο Minecraft: PlayStation®Vita Edition! - - - Χρησιμοποιείτε τη δοκιμαστική έκδοση ενός πακέτου υφών. Θα έχετε πρόσβαση στα πλήρη περιεχόμενα του πακέτου υφών, αλλά δεν θα είστε σε θέση να αποθηκεύσετε την πρόοδό σας. -Αν επιχειρήσετε να αποθηκεύσετε ενώ βρίσκεστε στη δοκιμαστική έκδοση, θα σας δοθεί η επιλογή να αγοράσετε την πλήρη έκδοση. - - - - Ενημερωμένη έκδοση 1.04 (Ενημέρωση τίτλου 14) - - - SELECT - - - Αυτή η επιλογή απενεργοποιεί τα τρόπαια και τις ενημερώσεις πίνακα κατάταξης για αυτόν τον κόσμο κατά τη διάρκεια του παιχνιδιού, καθώς και σε περίπτωση επαναφόρτωσης του παιχνιδιού που έχει αποθηκευτεί με αυτήν τη λειτουργία ενεργοποιημένη. - - - Θέλετε να συνδεθείτε στο "PSN"; - - - Για τους παίκτες που δεν βρίσκονται στο ίδιο σύστημα PlayStation®Vita με τον οικοδεσπότη, εάν ορίσετε αυτή την επιλογή θα αποβάλλετε τον παίκτη από το παιχνίδι και τυχόν άλλους παίκτες στο σύστημα PlayStation®Vita του. Αυτός ο παίκτης δεν θα μπορεί να συμμετέχει μέχρι να ξεκινήσει ξανά το παιχνίδι. - - - σύστημα PlayStation®Vita - - - Αλλαγή Λειτουργίας δικτύου - - - Επιλογή Λειτουργίας δικτύου - - - Επιλέξτε μια σύνδεση Ad Hoc για να συνδεθείτε με άλλα κοντινά συστήματα PlayStation®Vita ή με το "PSN" για να συνδεθείτε με φίλους από όλο τον κόσμο. - - - Δίκτυο Ad Hoc - - - "PSN" - - - Λήψη αποθηκευμένου παιχνιδιού Σύστημα PlayStation®3 - - - Μεταφόρτωση αποθηκευμένου παιχνιδιού για Σύστημα PlayStation®3/PlayStation®4 - - - Η μεταφόρτωση ακυρώθηκε - - - Έχετε ακυρώσει τη μεταφόρτωση αυτού του αποθηκευμένου παιχνιδιού στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών. - - - Μεταφόρτωση δεδομένων : %d%% - - - Λήψη δεδομένων : %d%% - - - Είστε βέβαιοι ότι θέλετε να μεταφορτώσετε αυτό το αποθηκευμένο παιχνίδι και να αντικαταστήσετε τυχόν τρέχοντα αποθηκευμένα παιχνίδια στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών; - - - Μετατροπή δεδομένων - - - Αποθήκευση - - - Η μεταφόρτωση ολοκληρώθηκε! - - - Η μεταφόρτωση απέτυχε. Προσπαθήστε ξανά αργότερα. - - - Η λήψη ολοκληρώθηκε! - - - Η λήψη απέτυχε. Προσπαθήστε ξανά αργότερα. - - - Αποτυχία συμμετοχής στο παιχνίδι λόγω περιοριστικού τύπου NAT. Ελέγξτε τις ρυθμίσεις δικτύου σας. - - - - Δεν υπάρχει αποθηκευμένο παιχνίδι στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών αυτήν τη στιγμή. Μπορείτε να μεταφορτώσετε έναν αποθηκευμένο κόσμο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών χρησιμοποιώντας το Minecraft: PlayStation®3 Edition και, στη συνέχεια, να το κατεβάσετε με το Minecraft: PlayStation®Vita Edition. - - - - Η αποθήκευση δεν έχει ολοκληρωθεί - - - Έχει τελειώσει ο χώρος αποθήκευσης δεδομένων για την έκδοση PlayStation®Vita του Minecraft. Για να δημιουργήσεις χώρο, διάγραψε κάποιο άλλο αποθηκευμένο αρχείο της έκδοσης PlayStation®Vita του Minecraft. + + Το αποθηκευμένο αρχείο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών διαθέτει αριθμό έκδοσης που δεν υποστηρίζεται ακόμα από το 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". - - - La partida ha finalizado porque has cerrado sesión en "PSN". - - - No estás conectado. - - - Este juego ofrece funciones que requieren estar conectado a "PSN", pero en estos momentos estás desconectado. - - - Red Ad hoc sin conexión. - - - 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 - - - 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. + + Se ha producido un error al guardar la configuración en la cuenta Sony Entertainment Network. Problema con la cuenta Sony Entertainment Network - - Se ha producido un error al guardar la configuración en la cuenta Sony Entertainment Network. + + Se ha producido un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. 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? + + 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. + + + Red Ad hoc sin conexión. + + + Problema con el trofeo + + + La partida ha finalizado porque has cerrado sesión en "PSN". + + + Has vuelto a la pantalla de título porque has cerrado sesión en "PSN". + + + El almacenamiento del sistema no tiene suficiente espacio libre para guardar una partida. + + + 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,252 +1,3555 @@  - - ¡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. + + Introduce la semilla para la generación del mundo. - - Supón siempre que los rumores son falsos, ¡no te los creas! + + Cargar mundo guardado - - {*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. + + Jugar tutorial - - {*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. + + 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. + + Dar nombre al mundo - - {*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. + + Archivo dañado - - {*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. + + Aceptar + + + Cancelar + + + Tienda de Minecraft + + + Rotar + + + Esconderse + + + Vaciar todos los espacios + + + ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderán 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! + + + Comenzar a jugar + + + Salir de la partida + + + Guardar partida + + + Salir sin guardar + + + Pulsa START para unirte. + + + ¡Hurra! ¡Has obtenido una imagen de jugador de Steve, de Minecraft! + + + ¡Hurra! ¡Has obtenido 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 ha perdido la conexión con el servidor. Saliendo al menú principal. + + + Desconectado por el servidor + + + Saliendo de la partida + + + Se ha producido un error. Saliendo al menú principal. + + + Error de conexión + + + Has sido expulsado de la partida. + + + El anfitrión ha salido de 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. + + + Has sido expulsado de la partida por volar. + + + El intento de conexión ha tardado demasiado. + + + 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 + + + Packs de aspectos + + + 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 en el menú Tienda de Minecraft. + + + Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. + + + No te puedes unir 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? + + + Pack de textura de prueba + + + Semilla + + + Desbloquear pack de aspecto + + + Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. +¿Quieres desbloquear este pack de aspecto ahora? + + + 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 ha cambiado 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 inferior. + + + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generació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 mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. + + + No + + + Modo de juego: Creativo + + + Supervivencia + + + Creativo + + + Cambiar nombre del mundo + + + Escribe un nuevo nombre para tu mundo. + + + Modo de juego: Supervivencia + + + Creado en modo Supervivencia + + + Renombrar partida guardada + + + Autoguardando en %d... + + + + + + Creado en modo Creativo + + + Generar nubes + + + ¿Qué quieres hacer con esta partida guardada? + + + Tamaño panel (pant. divid.) + + + Ingrediente + + + Combustible + + + Dispensador + + + Cofre + + + Encantar + + + 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 ha unido a la partida. + + + %s ha abandonado la partida. + + + Han expulsado 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 prueba + + + Partida llena + + + No te has podido unir a la partida y no quedan más espacios. + + + Introduce un título para tu publicación. + + + Introduce una descripción para tu publicación. + + + Inventario + + + Ingredientes + + + Introducir subtítulo + + + Introduce un subtítulo para tu publicación. + + + Introducir descripción + + + Sonando: + + + ¿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 interfaz + + + Preparando autoguardado del nivel + + + Tamaño del panel de datos + + + min. + + + ¡No se puede colocar aquí! + + + No se puede colocar lava cerca del punto de generación del nivel porque puede matar al instante a los jugadores que se regeneran. + + + Aspectos favoritos + + + Partida de %s + + + Partida de anfitrión desconocido + + + Un invitado ha cerrado la sesión + + + Restablecer configuración + + + ¿Seguro que quieres restablecer la configuración a los valores predeterminados? + + + Error al cargar + + + Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos de la partida. + + + Imposible crear la partida + + + Selección automática + + + Sin pack: aspectos por defecto + + + 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 ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. + + + El trigo, las calabazas y los melones se cultivan a partir de semillas. Las semillas de trigo se obtienen al romper hierba alta o al cosechar trigo, y las semillas de calabaza y melón se consiguen a partir de calabazas y melones respectivamente. + + + Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + + + Para continuar, cruza al otro lado de este agujero. + + + Has completado el tutorial del modo Creativo. + + + 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. + + + 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 aparece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} + + + Las calabazas y los melones también necesitan un bloque cerca de donde hayas plantado la semilla para que el fruto crezca cuando el tallo se haya desarrollado por completo. + + + La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. 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 al mundo inferior! + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el mundo inferior.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los portales y el mundo inferior. + + + 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*} + + + 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 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. + + + Ahora estás en el modo Creativo. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. + + + 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. + + + Para usar un portal inferior, colócate en su interior. La pantalla se pondrá púrpura y se reproducirá un sonido. Al cabo de unos segundos, te transportarás a otra dimensión. + + + El mundo inferior es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques inferiores, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. + + + Has completado 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 gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. + + + No puedes salir de esta área hasta que completes el tutorial. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. + + + 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... + + + 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. + + + 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. + + + ¡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. + + + 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. + + + Mantén pulsado{*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 pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + + + 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. + + + 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. + + + 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 han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. + + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes sobre reproducción de animales. + + + Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". + + + 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*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los gólems.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los gólems. + + + Los gólems se crean colocando una calabaza encima de un montón de bloques. + + + Los gólems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos gólems lanzan bolas de nieve a tus enemigos. + + + + Los 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. + + + + Has completado el tutorial Reproducción de animales. + + + En esta zona hay algunas calabazas y bloques para crear un gólem 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, verruga del mundo inferior y crema de magma. + + + Toma una poción en la mano y mantén pulsado{*CONTROLLER_ACTION_USE*} para usarla. Si es una poción normal, bébela y te aplicarás el efecto a ti mismo; si es una poción de salpicadura, la lanzarás y aplicarás el efecto a las criaturas que estén cerca en el momento del impacto. + Las pociones de salpicadura se crean añadiendo pólvora a las pociones normales. + + + {*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. + + + El primer paso para elaborar una poción es crear una botella de agua. Toma una botella de agua del cofre. + + + Puedes llenar una botella de agua con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar la botella de agua, apunta a una fuente de agua y pulsa{*CONTROLLER_ACTION_USE*}. + + + Usa una poción de resistencia al fuego contigo mismo. + + + 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. + + + 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. + + + 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. + + + Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. + + + Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. + + + {*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. + + + 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*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*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 mundo inferior a una botella de agua y luego añade crema de magma. + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de 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 mundo inferior para crear una poción rara, y requieren como mínimo un ingrediente más para obtener la poción final. + + + Una vez que tengas una poción, podrás modificar sus efectos. Si añades polvo de piedra rojiza, aumentas la duración del efecto, y si añades polvo de piedra brillante, su efecto será más potente. + + + 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. + + + Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*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 barcos 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. Pulsa{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo pescar. + + + 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*} + + + En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. + + + 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. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. + + + Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. + {*ICON*}355{*/ICON*} + + + 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*} + + + {*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. + + + 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. + + + Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. + + + 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. + + + 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. + + + En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. + + + {*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. + + + 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. + + + Las vagonetas van sobre raíles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. + {*RailIcon*} + + + También puedes crear raíles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y placas de presión para crear sistemas complejos. + {*PoweredRailIcon*} + + + Ahora navegas en un barco. Para salir de él, apúntalo con el puntero y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + 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. + + + Ahora vas subido en una vagoneta. Para salir de ella, apunta a ella con el cursor y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. + + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. + + + Leer + + + Colgar + + + Arrojar + + + Abrir + + + Cambiar tono + + + Detonar + + + Plantar + + + Desbloquear juego completo + + + Borrar partida guardada + + + Borrar + + + Labrar + + + Cosechar + + + Continuar + + + Nadar hacia arriba + + + Golpear + + + Ordeñar + + + Recoger + + + Vaciar + + + Silla de montar + + + Colocar + + + Comer + + + Montar + + + Navegar + + + Cultivar + + + Dormir + + + Despertar + + + Rep. + + + Opciones + + + Mover armadura + + + Mover arma + + + Equipar + + + Mover ingrediente + + + Mover combustible + + + Mover herramienta + + + Disparar + + + Retroceder página + + + Avanzar página + + + Modo Amor + + + Soltar + + + Privilegios + + + Bloquear + + + Creativo + + + Bloquear nivel + + + Seleccionar aspecto + + + Prender fuego + + + Invitar a amigos + + + Aceptar + + + Esquilar + + + Desplazar + + + Reinstalar + + + Op. de guardado + + + Ejecutar comando + + + Instalar versión completa + + + Instalar versión de prueba + + + Instalar + + + Expulsar + + + Actualizar partidas online + + + Partidas en grupo + + + Todas las partidas + + + Salir + + + Cancelar + + + No unirse + + + Cambiar grupo + + + Creación + + + Crear + + + Coger/Colocar + + + Mostrar inventario + + + Mostrar descripción + + + Mostrar ingredientes + + + Atrás + + + Recordatorio: + + + + + + Se han añadido nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. + + + No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. + + + ¡Enhorabuena! Has completado el tutorial. El tiempo del juego transcurre ahora a velocidad normal, ¡y no falta mucho para la noche y para que salgan los monstruos! ¡Acaba el refugio! + + + {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. + + + {*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. + + + Seleccionar + + + Usar + + + En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. + + + Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. + + + La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. + + + Coger + + + Siguiente + + + Anterior + + + Expulsar jugador + + + Enviar solicitud de amistad + + + Avanzar página + + + Retroceder página + + + Teñir + + + Curar + + + Sentarse + + + Sígueme + + + Extraer + + + Alimentar + + + Domar + + + Cambiar filtro + + + Colocar todo + + + Colocar uno + + + Soltar + + + Coger todo + + + Coger la mitad + + + Colocar + + + Soltar todo + + + Borrar selección rápida + + + ¿Qué es esto? + + + Compartir en Facebook + + + Soltar uno + + + Cambiar + + + Movimiento rápido + + + Packs de aspecto + + + Panel de cristal tintado rojo + + + Panel de cristal tintado verde + + + Panel de cristal tintado marrón + + + Cristal tintado blanco + + + Panel de cristal tintado + + + Panel de cristal tintado negro + + + Panel de cristal tintado azul + + + Panel de cristal tintado gris + + + Panel de cristal tintado rosa + + + Panel de cristal tintado lima + + + Panel de cristal tintado morado + + + Panel de cristal tintado cian + + + Panel de cristal tintado gris claro + + + Cristal tintado naranja + + + Cristal tintado azul + + + Cristal tintado morado + + + Cristal tintado cian + + + Cristal tintado rojo + + + Cristal tintado verde + + + Cristal tintado marrón + + + Cristal tintado gris claro + + + Cristal tintado amarillo + + + Cristal tintado azul claro + + + Cristal tintado magenta + + + Cristal tintado gris + + + Cristal tintado rosa + + + Cristal tintado lima + + + Panel de cristal tintado amarillo + + + Gris claro + + + Gris + + + Rosa + + + Azul + + + Morado + + + Cian + + + Lima + + + Naranja + + + Blanco + + + Personalizado + + + Amarillo + + + Azul claro + + + Magenta + + + Marrón + + + Panel de cristal tintado blanco + + + Bola pequeña + + + Bola grande + + + Panel de cristal tintado azul claro + + + Panel de cristal tintado magenta + + + Panel de cristal tintado naranja + + + Forma de estrella + + + Negro + + + Rojo + + + Verde + + + Forma de creeper + + + Explosión + + + Forma desconocida + + + Cristal tintado negro + + + Armadura de caballo de hierro + + + Armadura de caballo de oro + + + Armadura de caballo de diamante + + + Comparador de piedra rojiza + + + Vagoneta con dinamita + + + Vagoneta con tolva + + + Correa + + + Baliza + + + Cofre con trampa + + + Placa de presión con peso (ligera) + + + Placa identificativa + + + Tablones de madera (cualquier tipo) + + + Bloque de comandos + + + Estrella de fuegos artificiales + + + Estos animales pueden domesticarse y usarse como montura. Se les puede acoplar un cofre. + + + Mula + + + Nace cuando crían un caballo y un burro. Estos animales pueden domesticarse, usarse como montura y transportar cofres. + + + Caballo + + + Estos animales pueden domesticarse y usarse como montura. + + + Burro + + + Caballo zombi + + + Mapa vacío + + + Estrella del mundo inferior + + + Cohete de fuegos artificiales + + + Caballo esqueleto + + + Wither + + + Se crean con cráneos de Wither y arena de alma. Disparan cráneos explosivos. + + + Placa de presión con peso (pesada) + + + Arcilla teñida gris claro + + + Arcilla teñida gris + + + Arcilla teñida rosa + + + Arcilla teñida azul + + + Arcilla teñida morada + + + Arcilla teñida cian + + + Arcilla teñida lima + + + Arcilla teñida naranja + + + Arcilla teñida blanca + + + Cristal tintado + + + Arcilla teñida amarilla + + + Arcilla teñida azul claro + + + Arcilla teñida magenta + + + Arcilla teñida marrón + + + Tolva + + + Raíl activador + + + Soltador + + + Comparador de piedra rojiza + + + Sensor de luz diurna + + + Bloque de piedra rojiza + + + Arcilla teñida + + + Arcilla teñida negra + + + Arcilla teñida roja + + + Arcilla teñida verde + + + Bala de heno + + + Arcilla endurecida + + + Bloque de carbón + + + Fundido a + + + 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. + + + Cuando se activa, los jugadores conservarán su inventario al morir. + + + Cuando se desactiva, las criaturas no se generarán de forma natural. + + + Modo de juego: Aventura + + + Aventura + + + Introduce una semilla para volver a generar el mismo terreno. Déjalo vacío para generar un mundo aleatorio. + + + Cuando se desactiva, los monstruos y animales no sueltan botín (por ejemplo, los creepers no sueltan pólvora). + + + {*PLAYER*} se ha caído de una escalera + + + {*PLAYER*} se ha caído de unas enredaderas + + + {*PLAYER*} se ha caído del agua + + + Cuando se desactiva, los bloques no sueltan objetos al ser destruidos (por ejemplo, los bloques de piedra no sueltan guijarros). + + + Cuando se desactiva, los jugadores no regeneran salud de forma natural. + + + Cuando se desactiva, la hora del día no cambia. + + + Vagoneta + + + Atar + + + Liberar + + + Acoplar + + + Desmontar + + + Acoplar cofre + + + Lanzar + + + Nombrar + + + Baliza + + + Poder principal + + + Poder secundario + + + Caballo + + + Soltador + + + Tolva + + + {*PLAYER*} se ha caído de un sitio alto + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de murciélagos en un mundo. + + + Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de crías de caballos. + + + Opciones de juego + + + {*PLAYER*} ha recibido una bola de fuego de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha recibido un golpe de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando {*ITEM*} + + + Desventaja de criaturas + + + Objetos de bloques + + + Regeneración natural + + + Ciclo de luz + + + Conservar inventario + + + Generación de criaturas + + + Botín de criaturas + + + {*PLAYER*} ha recibido un disparo de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha caído demasiado lejos y ha sido destruido por {*SOURCE*} + + + {*PLAYER*} ha caído demasiado lejos y ha sido destruido por {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} se ha metido en el fuego mientras luchaba con {*SOURCE*} + + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} + + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} + + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} se ha achicharrado mientras luchaba con {*SOURCE*} + + + {*PLAYER*} ha volado por los aires a manos de {*SOURCE*} + + + {*PLAYER*} se ha marchitado + + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha intentado nadar en la lava para escapar de {*SOURCE*} + + + {*PLAYER*} se ha ahogado mientras intentaba escapar de {*SOURCE*} + + + {*PLAYER*} ha pisado un cactus mientras intentaba escapar de {*SOURCE*} + + + Montura + + + +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. + + + + + 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. + + + + 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. + + + + 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. + + + + +Una vez domesticado, aparecerán corazones a su alrededor y dejará de intentar librarse del jugador. + + + + Intenta montar este caballo. Usa {*CONTROLLER_ACTION_USE*} sin objetos ni herramientas en la mano para montarlo. + + + + 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. + + + + 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. + + + 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. + + + Sobre esta pirámide hay una baliza inactiva. + + + Esta es la interfaz de balizas, que puedes usar para elegir los poderes que concederá tu baliza. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con la interfaz de balizas. + + + 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. + + + 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. + + + Esta es la interfaz del inventario del caballo. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes utilizar el inventario del caballo. + + + +El inventario del caballo te permite transferir o equipar con objetos a tu caballo, burro o mula. + + + + Parpadeo + + + Estela + + + Duración del vuelo: + + + + 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. + + + + Has encontrado una mula. + + + {*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. + + + 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. + + + +También puedes transferir objetos entre tu inventario y las alforjas acopladas a burros y mulas en este menú. + + + + Has encontrado un caballo. + + + Has encontrado un burro. + + + {*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. + + + Las estrellas de fuegos artificiales pueden crearse colocando pólvora y tinte en la cuadrícula. + + + El tinte determinará el color de la explosión de la estrella de fuegos artificiales. + + + + 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. + + + También puedes colocar varias estrellas de fuegos artificiales en la cuadrícula para añadirlas a los fuegos artificiales. + + + 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. + + + Luego puedes coger los fuegos artificiales terminados en el espacio de salida. + + + + Puede añadirse una estela o un parpadeo usando diamantes o polvo de piedra brillante. + + + 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. + + + + 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. + + + Prueba a crear fuegos artificiales en la mesa de trabajo usando distintos objetos de los cofres. + + + + Después de crear una estrella de fuegos artificiales, puedes determinar su cambio de color combinándola con tinte. + + + Dentro de estos cofres hay diversos objetos utilizados en la creación de ¡FUEGOS ARTIFICIALES! + + + {*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. + + + 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. + + + Esta sala contiene tolvas + + + {*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. + + + Las tolvas se utilizan para introducir o sacar objetos de contenedores y para recoger automáticamente los objetos lanzados a su interior. + + + 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. + + + 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. + + + +Intenta usar la baliza para determinar los poderes que otorga. Puedes usar los lingotes de hierro para el pago necesario. + + + + Pueden afectar a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas y también a otras tolvas. + + + En esta sala hay varias distribuciones de tolvas para que las veas y experimentes con ellas. + + + Esta es la interfaz de fuegos artificiales, que puedes usar para crear fuegos artificiales y estrellas de fuegos artificiales. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes usar la interfaz de fuegos artificiales. + + + 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. + + + + No obstante, si una tolva recibe energía de piedra rojiza, se vuelve inactiva y deja de absorber e introducir objetos. + + + + + 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. + + + + Estos enemigos pueden encontrarse en los pantanos y te atacan lanzando pociones. Sueltan pociones cuando mueren. + + + Se ha alcanzado el límite de cuadros y marcos en un mundo. + + + No puedes generar enemigos en el modo Pacífico. + + + Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cría de cerdos, ovejas, vacas, gatos y caballos. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de calamares. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de enemigos. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de aldeanos. + + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de lobos. + + + Se ha alcanzado el límite de cabezas de enemigos en un mundo. + + + Invertir vista + + + Zurdo + + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de gallinas. + + + Este animal no puede entrar 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. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de gallinas. + + + {*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*} + + + {*C2*}A veces, las llamaba "planetas" y "estrellas".{*EF*}{*B*}{*B*} +{*C2*}A veces, creía que estaba en un universo hecho de energía que estaba compuesto de encendidos y apagados, de ceros y unos, de líneas de código. A veces, creía que jugaba a un juego. A veces, creía que leía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador, que lee palabras...{*EF*}{*B*}{*B*} +{*C2*}Sssh... A veces, el jugador leía líneas de código en una pantalla. Las decodificaba en palabras, decodificaba las palabras en significados; decodificaba los significados en sentimientos, teorías, ideas... y el jugador comenzó a respirar cada vez más deprisa y más profundamente cuando se dio cuenta de que estaba vivo, estaba vivo, esas miles de muertes no habían sido reales, el jugador estaba vivo.{*EF*}{*B*}{*B*} +{*C3*}Tú. Tú. Tú estás vivo.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz del sol del verano que se colaba entre las hojas al viento.{*EF*}{*B*}{*B*} +{*C3*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz que llegaba del frío cielo nocturno del invierno, donde una mota de luz en el rabillo del ojo del jugador podría ser una estrella un millón de veces más grande que el sol, quemando sus planetas, convirtiéndolos en plasma, para que el jugador pudiera verla un instante desde el otro extremo del universo mientras volvía a casa, mientras olía comida de pronto, casi en su puerta, a punto de volver a soñar.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de los ceros y los unos, a través de la electricidad del mundo, a través de las palabras deslizándose por una pantalla al final de un sueño.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía te quiero.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía has jugado bien.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía cuanto necesitas está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres más fuerte de lo que crees.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres la luz del día.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres la noche.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía tu lucha está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía la luz que buscas está en tu interior.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía no estás solo.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía no estás separado del resto de las cosas.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres el universo probándose a sí mismo, hablando consigo mismo, leyendo su propio código.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía te quiero porque eres amor.{*EF*}{*B*}{*B*} +{*C3*}Y el juego había acabado y el jugador se despertó del sueño. Y el jugador comenzó un nuevo sueño. Y el jugador volvió a soñar, soñó mejor. Y el jugador era el universo. Y el jugador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador.{*EF*}{*B*}{*B*} +{*C2*}Despierta.{*EF*} + + + Restablecer mundo inferior + + + %s ha entrado en El Fin. + + + %s ha salido de El Fin. + + + {*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} +{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sí. Cuidado. Ha alcanzado un nivel superior. Puede leer nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}No importa. Cree que somos parte del juego.{*EF*}{*B*}{*B*} +{*C3*}Me gusta. Ha jugado bien. No se ha rendido.{*EF*}{*B*}{*B*} +{*C2*}Lee nuestros pensamientos como si fueran textos en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Así le gusta imaginar muchas cosas, cuando está en lo más profundo del sueño del juego.{*EF*}{*B*}{*B*} +{*C2*}Las palabras son una interfaz maravillosa. Muy flexibles. Y asustan menos que contemplar la realidad que se oculta detrás de la pantalla.{*EF*}{*B*}{*B*} +{*C3*}Antes oían voces. Antes de que los jugadores pudieran leer. En aquellos tiempos en los que los que no jugaban llamaban a los jugadores hechiceros y brujas. Y en los que los jugadores soñaban que volaban sobre palos impulsados por demonios.{*EF*}{*B*}{*B*} +{*C2*}¿Qué soñaba este jugador?{*EF*}{*B*}{*B*} +{*C3*}Soñaba la luz del sol y los árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba que cazaba y que le daban caza. Soñaba un refugio.{*EF*}{*B*}{*B*} +{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. Pero ¿qué estructura verdadera ha creado en la realidad tras la pantalla?{*EF*}{*B*}{*B*} +{*C3*}Colaboró con muchos más para esculpir un mundo real en un pliego de {*EF*}{*NOISE*}{*C3*} y creó un {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*} en {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Pero eso no lo puede leer.{*EF*}{*B*}{*B*} +{*C3*}No. Todavía no ha alcanzado el nivel superior. Debe conseguirlo en el largo sueño de la vida, no el corto sueño de un juego.{*EF*}{*B*}{*B*} +{*C2*}¿Sabe que lo queremos? ¿Que el universo es amable?{*EF*}{*B*}{*B*} +{*C3*}A veces, entre el ruido de sus pensamientos, escucha al universo, sí.{*EF*}{*B*}{*B*} +{*C2*}Pero, a veces, está triste en el sueño largo. Crea mundos que no tienen verano y tiembla bajo un sol negro, y confunde su creación triste con la realidad.{*EF*}{*B*}{*B*} +{*C3*}Quitarle la pena lo destruiría. La pena es parte de su propia misión. No podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}A veces, cuando están en un sueño muy profundo, quiero decírselo, decirles que están construyendo mundos de verdad en la realidad. A veces, quiero decirles que son importantes para el universo. A veces, cuando no han creado una conexión real en mucho tiempo, quiero ayudarles a decir la palabra que temen.{*EF*}{*B*}{*B*} +{*C3*}Lee nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}A veces, no me importa. A veces, quiero decirles que este mundo que toman por real tan solo es {*EF*}{*NOISE*}{*C2*} y {*EF*}{*NOISE*}{*C2*}, quiero decirles que son {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Ven tan poco de la realidad en su sueño largo.{*EF*}{*B*}{*B*} +{*C3*}Pero siguen jugando.{*EF*}{*B*}{*B*} +{*C2*}Y sería tan fácil 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*} + + + ¿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. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de champiñacas. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de lobos. + + + Restablecer mundo inferior + + + No restablecer mundo inferior + + + No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas, gatos y caballos alcanzado. + + + ¡Has muerto! + + + Opciones de mundo + + + Puede construir y extraer + + + Puede usar puertas e interruptores + + + Generar estructuras + + + Mundo superplano + + + Cofre de bonificación + + + Puede abrir contenedores + + + Expulsar jugador + + + Puede volar + + + Desactivar agotamiento + + + Puede atacar a jugadores + + + Puede atacar a animales + + + Moderador + + + Privilegios de anfitrión + + + Cómo se juega + + + Controles + + + Configuración + + + Regenerar + + + Ofertas de contenido descargable + + + Cambiar aspecto + + + Créditos + + + La dinamita explota + + + Jugador contra jugador + + + Confiar en jugadores + + + Volver a instalar contenido + + + Ajustes de depuración + + + El fuego se propaga + + + Dragón finalizador + + + {*PLAYER*} murió a causa del aliento del dragón finalizador. + + + {*SOURCE*} asesinó a {*PLAYER*}. + + + {*SOURCE*} asesinó a {*PLAYER*}. + + + {*PLAYER*} murió. + + + {*PLAYER*} explotó. + + + {*PLAYER*} murió a causa de la magia. + + + {*SOURCE*} disparó a {*PLAYER*}. + + + Niebla de lecho de roca + + + Mostrar panel de datos + + + Mostrar mano + + + {*SOURCE*} quemó con bolas de fuego a {*PLAYER*}. + + + {*SOURCE*} apaleó a {*PLAYER*}. + + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando magia. + + + {*PLAYER*} se cayó del mundo. + + + Packs de textura + + + Packs de popurrí + + + {*PLAYER*} ardió. + + + Temas + + + Imágenes de jugador + + + Objetos de avatar + + + {*PLAYER*} se quemó hasta morir. + + + {*PLAYER*} se murió de hambre. + + + {*PLAYER*} se pinchó hasta morir. + + + {*PLAYER*} se golpeó demasiado fuerte contra el suelo. + + + {*PLAYER*} intentó nadar en la lava. + + + {*PLAYER*} se asfixió en un muro. + + + {*PLAYER*} se ahogó. + + + Mensajes de muerte + + + Ya no eres moderador. + + + Ahora puedes volar. + + + Ya no puedes volar. + + + Ya no puedes atacar a animales. + + + Ahora puedes atacar a animales. + + + Ahora eres moderador. + + + Ya no te cansarás. + + + Ahora eres invulnerable. + + + Ya no eres invulnerable. + + + %d MSP + + + Ahora te cansarás. + + + Ahora eres invisible. + + + Ya no eres invisible. + + + Ahora puedes atacar a jugadores. + + + Ahora puedes extraer y usar objetos. + + + Ya no puedes colocar bloques. + + + Ahora puedes colocar bloques. + + + Personaje animado + + + Animación de aspecto pers. + + + Ya no puedes extraer ni usar objetos. + + + Ahora puedes usar puertas e interruptores. + + + Ya no puedes atacar a enemigos. + + + Ahora puedes atacar a enemigos. + + + Ya no puedes atacar a jugadores. + + + Ya no puedes usar puertas ni interruptores. + + + Ahora puedes usar contenedores (p. ej. cofres). + + + Ya no puedes usar contenedores (p. ej. cofres). + + + Invisible + + + 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*} + + + + {*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 + + + SIN USAR + + + Salud instantánea + + + Daño instantáneo + + + Impulso en salto + + + Cansancio de extracción + + + Fuerza + + + Debilidad + + + Náuseas + + + SIN USAR + + + SIN USAR + + + SIN USAR + + + Regeneración + + + Resistencia + + + Buscando semillas para el generador de mundos. + + + 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. + + + Un tipo de raíl que puede activar o desactivar las vagonetas con tolvas y activar las vagonetas con dinamita. + + + Se utiliza para contener y soltar objetos, o para introducir objetos en otro contenedor, cuando recibe una carga de piedra rojiza. + + + Bloques de colores creados tiñendo arcilla endurecida. + + + 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. + + + Se utiliza como fuente de energía de piedra rojiza. Puede utilizarse para volver a crear piedra rojiza. + + + Se utiliza para recoger objetos o para transferir objetos hacia o desde contenedores. + + + Puede darse a caballos, burros o mulas para sanar hasta 10 corazones. Acelera el crecimiento de los potros. + + + Murciélago + + + Estas criaturas voladoras se encuentran en cavernas y otros grandes espacios cerrados. + + + Bruja + + + Se crea fundiendo arcilla en un horno. + + + Se crea con cristal y un tinte. + + + Se crea con cristal tintado + + + Proporciona una carga de piedra rojiza. La carga será más fuerte si hay más objetos sobre la placa. + + + Es un bloque que lanza una señal de piedra rojiza según la luz del sol (o la falta de luz). + + + 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. + + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 5 de armadura. + + + 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 restar fuerza de la señal, o para medir ciertos estados de bloques. + + + Es un tipo de vagoneta que se comporta como un bloque de dinamita móvil. + + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 7 de armadura. + + + Se utiliza para ejecutar comandos. + + + Proyecta un rayo de luz hacia el cielo y puede proporcionar efectos de estado a los jugadores cercanos. + + + 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. + + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 11 de armadura. + + + Se utiliza para atar a criaturas al jugador o a postes. + + + Se utiliza para poner nombre a las criaturas del mundo. + + + Rapidez + + + Juego completo + + + Reanudar partida + + + Guardar partida + + + Jugar partida + + + Marcadores + + + Ayuda y opciones + + + Dificultad: + + + JcJ: + + + Confiar en jugadores: + + + Dinamita: + + + Tipo de partida: + + + Estructuras: + + + Tipo de nivel: + + + No se encontraron partidas + + + Solo por invitación + + + Más opciones + + + Cargar + + + Opciones de anfitrión + + + Jugadores/Invitar + + + Partida online + + + Nuevo mundo + + + Jugadores + + + Unirse a partida + + + Iniciar partida + + + Nombre del mundo + + + Semilla para el generador de mundos + + + Dejar vacío para semilla aleatoria + + + El fuego se propaga: + + + Editar mensaje de cartel: + + + Rellena la información que irá junto a tu captura. + + + Subtítulo + + + Ayuda sobre el juego + + + Pantalla dividida vert. para 2 j. + + + Listo + + + Captura de pantalla del juego + + + Sin efectos + + + Celeridad + + + Lentitud + + + Editar mensaje de cartel: + + + ¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! + + + Mostrar todos los mundos mezclados + + + Consejos + + + Volver a instalar objeto de avatar 1 + + + Volver a instalar objeto de avatar 2 + + + Volver a instalar objeto de avatar 3 + + + Volver a instalar tema + + + Volver a instalar imagen de jugador 1 + + + Volver a instalar imagen de jugador 2 + + + Opciones + + + 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 + + + Explosives Animator + + + 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*} @@ -283,6 +3586,23 @@ Los ingredientes originales de las pociones son:{*B*}{*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*} @@ -293,25 +3613,6 @@ El encantamiento que se aplica se selecciona aleatoriamente en función del cost 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: 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: BLOQUEAR NIVELES{*ETW*}{*B*}{*B*} @@ -340,7 +3641,28 @@ Si en un momento posterior quieres unirte a este nivel, recibirás una notificac {*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*} + {*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*} @@ -403,60 +3725,91 @@ Si en un momento posterior quieres unirte a este nivel, recibirás una notificac 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. + + + {*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. + + + {*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. + + + ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE.UU.! + + + .party() fue excelente. + + + Supón siempre que los rumores son falsos, ¡no te los creas! + Página anterior - - Fundamentos - - - Panel de datos - - - Inventario - - - Cofres - - - Creación - - - Horno - - - Dispensador - - - Cuidar animales - - - Reproducción de animales - - - Elaboración de pociones - - - Encantamientos - - - Portal inferior - - - Multijugador - - - Compartir capturas de pantalla - - - Bloquear niveles - - - Modo Creativo - - - Opciones de anfitrión y de jugador - Comercio @@ -466,6 +3819,15 @@ Si en un momento posterior quieres unirte a este nivel, recibirás una notificac El Fin + + Bloquear niveles + + + Modo Creativo + + + Opciones de anfitrión y de jugador + {*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*} @@ -478,71 +3840,14 @@ Mientras lo haces, el dragón finalizador volará hacia ti y te atacará escupie 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. - - - Correr - - - Novedades - - - {*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*} - - {*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*} - - +{*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*} Causas más daño que con la mano. @@ -550,241 +3855,247 @@ Hay un montón de novedades con las que lo pasarás en grande con tus amigos. A 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. + + Correr + + + Novedades + + + {*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*} + + + Compartir capturas de pantalla + + + Cofres + + + Creación + + + Horno + + + Fundamentos + + + Panel de datos + + + Inventario + + + Dispensador + + + Encantamientos + + + Portal inferior + + + Multijugador + + + Cuidar animales + + + Reproducción de animales + + + Elaboración de pociones + + + ¡A deadmau5 le gusta Minecraft! + + + Los porqueros no te atacarán a no ser que tú los ataques a ellos. + + + Puedes echarte a dormir en una cama para cambiar el punto de generación del juego y avanzar hasta el amanecer. + + + ¡Golpea esas bolas de fuego de vuelta al espectro! + + + Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. + + + ¡Con una vagoneta y un raíl llegarás a tu destino más rápido! + + + Planta brotes y se convertirán en árboles. + + + Si construyes un portal podrás viajar a otra dimensión: el mundo inferior. + + + Excavar en línea recta hacia abajo o hacia arriba no es buena idea. + + + Puedes usar polvo de hueso (se fabrica con hueso de esqueleto) como fertilizante. Las cosas crecerán al instante. + + + ¡Los creepers explotan cuando se acercan a ti! + + + ¡Pulsa {*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! + + + ¡Usa la herramienta correcta para el trabajo! + + + Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. + + + Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. + + + 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 domarlo. Podrás hacer que se siente o que te siga. + + + Para soltar objetos desde el menú Inventario, mueve el cursor fuera del menú y pulsa{*CONTROLLER_VK_A*}. + + + ¡Nuevo contenido descargable disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. + + + Puedes cambiar el aspecto de tu personaje con el pack de aspecto de la tienda de Minecraft. Selecciona "Tienda de Minecraft" en el menú principal para ver qué hay disponible. + + + Varía la configuración de gamma para que la visualización del juego sea más clara o más oscura. + + + Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en multijugador todos deben dormir a la vez. + + + Usa una azada para preparar el terreno para la cosecha. + + + Las arañas no atacan por el día, a no ser que tú las ataques a ellas. + + + ¡Es más fácil excavar arena o tierra con un azadón que a mano! + + + Extrae chuletas del cerdo y cocínalas para comerlas y recuperar salud. + + + Extrae cuero de las vacas y úsalo para fabricar armaduras. + + + Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! + + + La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. + + + ¡Ahora hay vallas apilables en el juego! + + + Algunos animales te seguirán si llevas trigo en la mano. + + + Si un animal no puede desplazarse más de 20 bloques en cualquier dirección, no se degenerará. + + + 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. + + + Lee la sección Novedades en el menú Cómo se juega para ver la información más reciente sobre el juego. + + + ¡Música de C418! + + + ¿Quién es Notch? + + + ¡Mojang tiene más premios que empleados! + + + ¡Hay famosos que juegan a 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! + + + ¡Pronto habrá una actualización de este juego! + + + Si colocas dos cofres juntos crearás un cofre grande. + + + Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. + + + Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. + + + El instrumento que toca un bloque de nota depende del material que tenga debajo. + + + Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. + + + Los guijarros son resistentes a las bolas de fuego del espectro, lo que los hace útiles para defender portales. + + + Los bloques que se pueden usar como fuente de luz derriten la nieve y el hielo. Entre ellos se incluyen las antorchas, las piedras brillantes y las calabazas iluminadas. + + + Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. + + + Las gallinas ponen huevos cada 5 o 10 minutos. + + + La obsidiana solo se puede extraer con un pico de diamante. + + + Los creepers son la fuente de pólvora más fácil de obtener. + + + Si atacas a un lobo, todos los de los alrededores se volveran hostiles. Característica que comparten con los porqueros zombis. + + + Los lobos no pueden entrar en el mundo inferior. + + + Los lobos no atacan a los creepers. + Necesario para extraer bloques de piedra y mineral. - - Se usa para cortar bloques de madera más rápido que a mano. - - - Se usa para labrar tierra y hierba y prepararla para el cultivo. - - - Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. - - - Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. - - - SIN USAR - - - SIN USAR - - - SIN USAR - - - SIN USAR - - - Cuando lo lleva puesto, el usuario recibe 1 de armadura. - - - Cuando la lleva puesta, el usuario recibe 3 de armadura. - - - Cuando las lleva puestas, el usuario recibe 2 de armadura. - - - Cuando las lleva puestas, el usuario recibe 1 de armadura. - - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - - Cuando la lleva puesta, el usuario recibe 5 de armadura. - - - Cuando las lleva puestas, el usuario recibe 4 de armadura. - - - Cuando las lleva puestas, el usuario recibe 1 de armadura. - - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - - Cuando la lleva puesta, el usuario recibe 6 de armadura. - - - Cuando las lleva puestas, el usuario recibe 5 de armadura. - - - Cuando las lleva puestas, el usuario recibe 2 de armadura. - - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - - Cuando la lleva puesta, el usuario recibe 5 de armadura. - - - Cuando las lleva puestas, el usuario recibe 3 de armadura. - - - Cuando las lleva puestas, el usuario recibe 1 de armadura. - - - Cuando lo lleva puesto, el usuario recibe 3 de armadura. - - - Cuando la lleva puesta, el usuario recibe 8 de armadura. - - - Cuando las lleva puestas, el usuario recibe 6 de armadura. - - - Cuando las lleva puestas, el usuario recibe 3 de armadura. - - - Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. - - - Permite convertir lingotes, gemas o tintes en bloques utilizables. Se puede usar como bloque de construcción de precio elevado o como almacenamiento compacto del mineral. - - - Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo la pisan. Las placas de presión de madera también se activan soltando algo sobre ellas. - - - Se usan en escaleras compactas. - - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - - Se usa para crear luz, pero también derrite la nieve y el hielo. - - - Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. - - - Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. - - - Se usa como material de construcción. - - - Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. - - - Se usa para avanzar 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. - - - Te permite crear una selección más variada de objetos que la creación normal. - - - Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. - - - Almacena bloques y objetos en su interior. Coloca dos cofres, uno junto a otro, para crear un cofre más grande con el doble de capacidad. - - - Se usa como barrera sobre la que no se puede saltar. Cuenta como 1,5 bloques de alto para jugadores, animales y monstruos, pero solo 1 bloque de alto para otros bloques. - - - Se usa para ascender en vertical. - - - 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. - - - Muestra el texto introducido por ti o por otros jugadores. - - - Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. - - - Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el objeto chisquero de pedernal o con una descarga eléctrica. - - - Se usa para contener estofado de champiñón. Te quedas el cuenco después de comer el estofado. - - - Se usa para contener y transportar agua, lava y leche. - - - Se usa para contener y transportar agua. - - - Se usa para contener y transportar lava. - - - Se usa para contener y transportar leche. - - - Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. - - - Se usa para pescar peces. - - - Muestra la posición del sol y de la luna. - - - Indica tu punto de inicio. - - - Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. - - - Permite ataques a distancia con flechas. - - - Se usa como munición para arcos. - - - Restablece 2,5{*ICON_SHANK_01*}. - - - Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. - - - Restablece 1{*ICON_SHANK_01*}. - - - Restablece 1{*ICON_SHANK_01*}. - - - Restablece 3{*ICON_SHANK_01*}. - - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Puede envenenarte. - - - Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. - - - Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. - - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. - - - Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. - - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando una chuleta de cerdo cruda en un horno. - - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. - - - Restablece 2,5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. - - - Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. - - - Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se puede crear a partir de una manzana y pepitas de oro. - - - Restablece 2{*ICON_SHANK_01*}. Puede envenenarte. - Se usa en la receta de pasteles y como ingrediente para elaborar pociones. @@ -795,9 +4106,27 @@ El color de la lana que se use no varía el color de la cama. 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. + + Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + + + Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se puede crear a partir de una manzana y pepitas de oro. + + + Restablece 2{*ICON_SHANK_01*}. Puede envenenarte. + Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + + Se usa para llevar vagonetas. + + + Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + + + 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. + Se usa para enviar una descarga eléctrica cuando se pulsa. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. @@ -807,59 +4136,59 @@ También puede usarse de iluminación de nivel bajo. 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. - - Se usa para llevar vagonetas. + + Restablece 2,5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. - - Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + + Restablece 1{*ICON_SHANK_01*}. - - Funciona como una placa de presión: envía una señal de piedra rojiza cuando se activa, pero solo puede hacerlo una vagoneta. + + Restablece 1{*ICON_SHANK_01*}. + + + Restablece 3{*ICON_SHANK_01*}. + + + Se usa como munición para arcos. + + + Restablece 2,5{*ICON_SHANK_01*}. + + + Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. + + + Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Puede envenenarte. + + + Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando una chuleta de cerdo cruda en un horno. + + + Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. + + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. + + + Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. Se usa para transportarte a ti, a un animal o a un monstruo por raíles. - - Se usa para transportar mercancías por los raíles. + + Se usa como tinte para crear lana azul clara. - - Se mueve por raíles y empujará a otras vagonetas si se le añade hulla. + + Se usa como tinte para crear lana cian. - - Te permite desplazarte por el agua más rápido que nadando. - - - Se obtiene de las ovejas y se puede colorear con tinte. - - - Se usa como material de construcción y se puede colorear con tinte. Esta receta no es muy recomendable porque la lana se puede obtener con facilidad de las ovejas. - - - Se usa como tinte para crear lana negra. - - - Se usa como tinte para crear lana verde. - - - Se usa como tinte para crear lana marrón, como ingrediente de galletas o para cultivar plantas de cacao. - - - Se usa como tinte para crear lana plateada. - - - Se usa como tinte para crear lana amarilla. - - - Se usa como tinte para crear lana roja. - - - Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. - - - Se usa como tinte para crear lana rosa. - - - Se usa como tinte para crear lana naranja. + + Se usa como tinte para crear lana púrpura. Se usa como tinte para crear lana lima. @@ -871,27 +4200,9 @@ También puede usarse de iluminación de nivel bajo. 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). - - Se usa como tinte para crear lana azul clara. - - - Se usa como tinte para crear lana cian. - - - Se usa como tinte para crear lana púrpura. - Se usa como tinte para crear lana magenta. - - Se usa como tinte para crear lana azul. - - - Reproduce discos. - - - Úsalos para crear herramientas, armas o armaduras sólidas. - Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. @@ -901,1220 +4212,676 @@ También puede usarse de iluminación de nivel bajo. Se usa para crear estanterías de libros o encantarse para hacer libros encantados. - - Permite crear encantamientos más potentes si se coloca cerca de una mesa de encantamientos. + + Se usa como tinte para crear lana azul. - - Se usa como elemento decorativo. + + Reproduce discos. - - Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + + Úsalos para crear herramientas, armas o armaduras sólidas. - - 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 usa como tinte para crear lana naranja. - - Se puede extraer con un pico para obtener hulla. + + Se obtiene de las ovejas y se puede colorear con tinte. - - Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. + + Se usa como material de construcción y se puede colorear con tinte. Esta receta no es muy recomendable porque la lana se puede obtener con facilidad de las ovejas. - - Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. + + Se usa como tinte para crear lana negra. - - Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. + + Se usa para transportar mercancías por los raíles. - - Se puede extraer con un pico para obtener guijarros. + + Se mueve por raíles y empujará a otras vagonetas si se le añade hulla. - - Se recoge con una pala. Se puede emplear en la construcción. + + Te permite desplazarte por el agua más rápido que nadando. - - Se puede plantar y con el tiempo se convierte en un árbol. + + Se usa como tinte para crear lana verde. - - No se puede romper. + + Se usa como tinte para crear lana roja. - - Prende fuego a cualquier cosa que toque. Se puede recoger en un cubo. + + Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. - - 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 usa como tinte para crear lana rosa. - - 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 usa como tinte para crear lana marrón, como ingrediente de galletas o para cultivar plantas de cacao. - - Se corta con un hacha y se puede convertir en tablones o usar como combustible. + + Se usa como tinte para crear lana plateada. - - Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas extraerlo, se romperá. + + Se usa como tinte para crear lana amarilla. - - Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + + Permite ataques a distancia con flechas. - - Se cuece con arcilla en un horno. + + Cuando la lleva puesta, el usuario recibe 5 de armadura. - - Se cuece y se convierte en ladrillo en un horno. + + Cuando las lleva puestas, el usuario recibe 3 de armadura. - - Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Una forma compacta de almacenar bolas de nieve. + + Cuando las lleva puestas, el usuario recibe 5 de armadura. - - Se puede excavar con una pala para crear bolas de nieve. + + Cuando las lleva puestas, el usuario recibe 2 de armadura. - - A veces produce semillas de trigo cuando se rompe. + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Se puede convertir en tinte. + + Cuando lo lleva puesto, el usuario recibe 3 de armadura. - - Junto con un cuenco se puede convertir en estofado. + + Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. - - Solo se puede extraer con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. + + 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. - - Genera monstruos en el mundo. + + 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. - - Se coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumentará la duración del efecto. + + Cuando la lleva puesta, el usuario recibe 8 de armadura. - - Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + + Cuando las lleva puestas, el usuario recibe 6 de armadura. - - Terreno que se ha preparado para plantar semillas. + + Cuando las lleva puestas, el usuario recibe 3 de armadura. - - Se pueden cocinar en un horno para crear tinte verde. + + Cuando la lleva puesta, el usuario recibe 6 de armadura. - - Se pueden usar para crear azúcar. + + Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. - - Se puede llevar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal del pastel de calabaza. + + Cuando lo lleva puesto, el usuario recibe 1 de armadura. - - Si se le prende fuego, arderá para siempre. + + Cuando la lleva puesta, el usuario recibe 3 de armadura. - - Ralentiza el movimiento de cualquier cosa que camina sobre ella. + + Se usa para cortar bloques de madera más rápido que a mano. - - Si te colocas en el portal podrás trasladarte del mundo superior al inferior y viceversa. + + Se usa para labrar tierra y hierba y prepararla para el cultivo. - - Se usa como combustible en un horno o se puede convertir en una antorcha. + + Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. - - 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. + + Cuando las lleva puestas, el usuario recibe 2 de armadura. - - Se consigue al matar una gallina y se puede convertir en una flecha. + + Cuando las lleva puestas, el usuario recibe 4 de armadura. - - Se consigue al matar un creeper y se puede convertir en dinamita o como ingrediente para elaborar pociones. + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Se puede plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Se recoge de los cultivos y se puede usar para crear alimentos. + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Se obtiene al excavar gravilla y se puede usar para crear un chisquero de pedernal. + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Si se usa con un cerdo te permite montarlo. Luego puedes manejar al cerdo con una zanahoria con palo. + + Cuando la lleva puesta, el usuario recibe 5 de armadura. - - Se obtiene al excavar nieve y se puede arrojar. + + Se usan en escaleras compactas. - - Se obtiene al matar una vaca y se puede convertir en armadura o para hacer libros. + + Se usa para contener estofado de champiñón. Te quedas el cuenco después de comer el estofado. - - Se obtiene al matar un limo o como ingrediente para elaborar pociones o hacer pistones adhesivos. + + Se usa para contener y transportar agua, lava y leche. - - Las gallinas lo ponen al azar y se puede convertir en alimentos. + + Se usa para contener y transportar agua. - - 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. + + Muestra el texto introducido por ti o por otros jugadores. - - Se obtiene al matar un esqueleto. Se puede convertir en polvo de hueso. Se puede dar de comer a un lobo para domarlo. + + Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. - - Se obtiene al hacer que un esqueleto mate a un creeper. Se puede reproducir en un tocadiscos. + + 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. - - Apaga el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + + Se usa para contener y transportar lava. - - Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. + + Muestra la posición del sol y de la luna. - - Se encuentra en mazmorras y se puede emplear en la construcción y en la decoración. + + Indica tu punto de inicio. - - Se usan para obtener lana de las ovejas y cosechar bloques de hoja. + + Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. - - 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 usa para contener y transportar leche. - - 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 usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. - - Se crea con bloques de piedra y se encuentra normalmente en fortalezas. + + Se usa para pescar peces. - - Se usa como barrera, igual que las vallas. + + 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. - - Es como una puerta, pero se usa principalmente con vallas. + + Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. - - Se puede crear a partir de rodajas de melón. + + Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. - - Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. + + Se usa como material de construcción. - - Se puede plantar para cultivar calabazas. + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Se puede plantar para cultivar melones. + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - 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. + + Se usa para crear luz, pero también derrite la nieve y el hielo. - - Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + + Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. - - Se puede emplear en la construcción y en la decoración. + + 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. - - Ralentiza el movimiento cuando pasas sobre ella. Se puede destruir con unas cizallas para obtener cuerda. + + 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. - - Genera un pez plateado cuando se destruye o, a veces, cuando está cerca de otro pez plateado al que estén atacando. + + Se usa para ascender en vertical. - - Una vez colocada, va creciendo con el paso del tiempo. Se puede recoger con cizallas. Puede usarse como una escalera para trepar por ella. + + 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. - - 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. + + Te permite crear una selección más variada de objetos que la creación normal. - - 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. - - - 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. - - - Puede tener diversos efectos, dependiendo de con qué se use. - - - 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. - - - 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 de agua de lluvia o con un cubo y usar para llenar de agua las botellas de cristal. - - - Cuando se lanza, indica la dirección a un portal final. Si se colocan doce de ellos en estructuras de portal final, se activará el portal final. - - - Se usa para elaborar pociones. - - - Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. - - - Flota en el agua y se puede caminar sobre él. - - - Se usa para construir fortalezas del mundo inferior. Es inmune a las bolas de fuego del espectro. - - - Se usa en las fortalezas del mundo inferior. - - - Se encuentra en las fortalezas del mundo inferior y suelta verrugas del mundo inferior cuando se rompe. - - - 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. - - - 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. - - - Útil para prender fuego a las cosas o para provocar incendios indiscriminados cuando se dispara con el dispensador. - - - 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. - - - 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. - - - Puede cultivarse en la granja para cosechar granos de cacao. - - - Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio del casco. - - - Calamar - - - Suelta bolsas de tinta cuando muere. - - - Vaca - - - Suelta cuero cuando muere. Se puede ordeñar con un cubo. - - - Oveja - - - Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. - - - Gallina - - - Suelta plumas cuando muere y pone huevos al azar. - - - Cerdo - - - Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. - - - Lobo - - - Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos para que 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 y huesos cuando muere. - - - Araña - - - Te ataca cuando está cerca. Puede trepar por 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. - - - Espectro - - - Te dispara bolas de fuego que explotan al entrar en contacto. - - - Limo - - - Escupe limos más pequeños cuando recibe daños. - - - Finalizador - - - 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 - - - Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. - - - Dragón finalizador - - - 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. - - - 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 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. - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - Lead Game Programmer Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Espada de madera - - - Espada de piedra - - - Espada de hierro - - - Espada de diamante - - - Espada de oro - - - Pala de madera - - - Pala de piedra - - - Pala de hierro - - - Pala de diamante - - - Pala de oro - - - Pico de madera - - - Pico de piedra - - - Pico de hierro - - - Pico de diamante - - - Pico de oro - - - Hacha de madera - - - Hacha de piedra + + Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. Hacha de hierro - - Hacha de diamante + + Lámpara de piedra rojiza - - Hacha de oro + + Escaleras de la jungla - - Azada de madera + + Escaleras de abedul - - Azada de piedra + + Controles actuales - - Azada de hierro - - - Azada de diamante - - - Azada de oro - - - Puerta de madera - - - Puerta de hierro - - - Casco de malla - - - Peto de malla - - - Mallas de malla - - - Botas de malla - - - Gorro de cuero - - - Casco de hierro - - - Casco de diamante - - - Casco de oro - - - Túnica de cuero - - - Coraza de hierro - - - Coraza de diamante - - - Coraza de oro - - - Calzas de cuero - - - Mallas de hierro - - - Mallas de diamante - - - Mallas de oro - - - Botas de cuero - - - Botas de hierro - - - Botas de diamante - - - Botas de oro - - - Lingote de hierro - - - Lingote de oro - - - Cubo - - - Cubo de agua - - - Cubo de lava - - - Chisquero de pedernal - - - Manzana - - - Arco - - - Flecha - - - Hulla - - - Carbón - - - Diamante - - - Palo - - - Cuenco - - - Estofado de champiñón - - - Cuerda - - - Pluma - - - Pólvora - - - Semillas de trigo - - - Trigo - - - Pan - - - Pedernal - - - Chuleta de cerdo cruda - - - Chuleta de cerdo cocinada - - - Cuadro - - - Manzana de oro - - - Cartel - - - Vagoneta - - - Silla de montar - - - Piedra rojiza - - - Bola de nieve - - - Barco - - - Cuero - - - Cubo de leche - - - Ladrillo - - - Arcilla - - - Cañas de azúcar - - - Papel - - - Libro - - - Bola de limo - - - Vagoneta con cofre - - - Vagoneta con horno - - - Huevo - - - Brújula - - - Caña de pescar - - - Reloj - - - Polvo de piedra brillante - - - Pescado crudo - - - Pescado cocinado - - - Polvo de tinte - - - Bolsa de tinta - - - Rojo rosa - - - Verde cactus - - - Granos de cacao - - - Lapislázuli - - - Tinte púrpura - - - Tinte cian - - - Tinte gris claro - - - Tinte gris - - - Tinte rosa - - - Tinte lima - - - Amarillo amargo - - - Tinte azul claro - - - Tinte magenta - - - Tinte naranja - - - Polvo de hueso - - - Hueso - - - Azúcar - - - Pastel - - - Cama - - - Repetidor de piedra rojiza - - - Galleta - - - Mapa - - - Disco: "13" - - - Disco: "gato" - - - Disco: "bloques" - - - Disco: "gorjeo" - - - Disco: "lejos" - - - Disco: "galería" - - - Disco: "mellohi" - - - Disco: "stal" - - - Disco: "strad" - - - Disco: "pabellón" - - - Disco: "11" - - - Disco: "dónde estamos" - - - Cizallas - - - Semillas de calabaza - - - Semillas de melón - - - Pollo crudo - - - Pollo cocinado - - - Ternera cruda - - - Filete - - - Carne podrida - - - Perla finalizadora - - - Rodaja de melón - - - Vara de llama - - - Lágrima de espectro - - - Pepita de oro - - - Verruga del mundo inferior - - - Poción{*splash*}{*prefix*}{*postfix*} - - - Botella de cristal - - - Botella de agua - - - Ojo de araña - - - Ojo de araña ferment. - - - Polvo de llama - - - Crema de magma - - - Soporte para pociones - - - Caldero - - - Ojo finalizador - - - Melón resplandeciente - - - Botella de encanto - - - Descarga de fuego - - - Desc. fuego (carbón) - - - Desc. de fuego (hulla) - - - Marco - - - Generar {*CREATURE*} - - - Ladrillo del mundo inferior - - + Calavera - - Calavera de esqueleto + + Cacao - - Calavera de esqueleto atrofiado + + Escaleras de abeto - - Cabeza de zombi + + Huevo de dragón - - Cabeza + + Piedra final - - Cabeza de %s + + Estructura de portal final - - Cabeza de creeper + + Escaleras de arenisca - - Piedra + + Helecho - - Bloque de hierba + + Arbusto - - Tierra + + Configuración - - Guijarro + + Creación - - Tablones de roble + + Usar - - Tablones de abeto + + Acción - - Tablones de abedul + + Sigilo/Volar hacia abajo - - Tablones de la jungla + + Sigilo - - Brote + + Soltar - - Brote de roble + + Cambiar objeto - - Brote de abeto + + Pausar - - Brote de abedul + + Mirar - - Brote de árbol de la jungla + + Mover/Correr - - Lecho de roca + + Inventario - - Agua + + Saltar/Volar hacia arriba - - Lava + + Saltar - - Arena + + Portal final - - Arenisca + + Tallo de calabaza - - Grava + + Melón - - Mineral de oro + + Panel de cristal - - Mineral de hierro + + Puerta de valla - - Mineral de hulla + + Enredaderas - - Madera + + Tallo de melón - - Madera de roble + + Barras de hierro - - Madera de abeto + + Ladrillos de piedra agrietada - - Madera de abedul + + Ladrillos de piedra musgosa - - Madera de la jungla + + Ladrillos de piedra + + + Champiñón + + + Champiñón + + + Ladrillos de piedra cincelada + + + Escaleras de ladrillo + + + Verruga del mundo inferior + + + Escaleras mundo inferior + + + Valla del mundo inferior + + + Caldero + + + Soporte para pociones + + + Mesa de encantamientos + + + Ladrillo del mundo inferior + + + Guijarro de pez plateado + + + Piedra de pez plateado + + + Escaleras ladrillo piedra + + + Nenúfar + + + Micelio + + + Ladrillo de piedra de pez plateado + + + Cambiar modo de cámara + + + 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á. + + + 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. + + + A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} + Pulsa{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. + + + La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} + + + 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*} + + + 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. + + + Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. + + + 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. + + + Usa{*CONTROLLER_ACTION_MOVE*} para moverte. + + + Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. + + + 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. + + + 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... + + + Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar. + + + Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} + + + + 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. + + + + Abre el contenedor. + + + 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*} + + + 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*} + + + 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. + + + + Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. + + + + 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*} + + + 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. + + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. + + + 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*} + + + 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*} + + + Apunta hacia la mesa de trabajo y pulsa{*CONTROLLER_ACTION_USE*} para abrirla. + + + Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Opción 1 + + + Movimiento (al volar) + + + Jugadores/Invitar + + + + + + Opción 3 + + + Opción 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + + + + + + + + + + + + + + + + + + + + + + + + + + + Bloque de pez plateado + + + Losa de piedra + + + Una forma compacta de almacenar hierro. + + + Bloque de hierro + + + Losa de roble + + + Losa de arenisca + + + Losa de piedra + + + Una forma compacta de almacenar oro. + + + Flor + + + Lana blanca + + + Lana naranja + + + Bloque de oro + + + Champiñón + + + Rosa + + + Losa de guijarros + + + Estantería + + + Dinamita + + + Ladrillos + + + Antorcha + + + Obsidiana + + + Piedra musgosa + + + Losa del mundo inferior + + + Losa de roble + + + Losa (ladrillos de piedra) + + + Losa de ladrillos + + + Losa de la jungla + + + Losa de abedul + + + Losa de abeto + + + Lana magenta + + + Hojas de abedul + + + Hojas de abeto + + + Hojas de roble + + + Cristal + + + Esponja + + + Hojas de la jungla + + + Hojas Roble @@ -2125,732 +4892,750 @@ También puede usarse de iluminación de nivel bajo. Abedul - - Hojas + + Madera de abeto - - Hojas de roble + + Madera de abedul - - Hojas de abeto - - - Hojas de abedul - - - Hojas de la jungla - - - Esponja - - - Cristal + + Madera de la jungla Lana - - Lana negra - - - Lana roja - - - Lana verde - - - Lana marrón - - - Lana azul - - - Lana púrpura - - - Lana cian - - - Lana gris claro + + Lana rosa Lana gris - - Lana rosa - - - Lana lima - - - Lana amarilla + + Lana gris claro Lana azul claro - - Lana magenta + + Lana amarilla - - Lana naranja + + Lana lima - - Lana blanca + + Lana cian - - Flor + + Lana verde - - Rosa + + Lana roja - - Champiñón + + Lana negra - - Bloque de oro + + Lana púrpura - - Una forma compacta de almacenar oro. + + Lana azul - - Bloque de hierro - - - Una forma compacta de almacenar hierro. - - - Losa de piedra - - - Losa de piedra - - - Losa de arenisca - - - Losa de roble - - - Losa de guijarros - - - Losa de ladrillos - - - Losa (ladrillos de piedra) - - - Losa de roble - - - Losa de abeto - - - Losa de abedul - - - Losa de la jungla - - - Losa del mundo inferior - - - Ladrillos - - - Dinamita - - - Estantería - - - Piedra musgosa - - - Obsidiana - - - Antorcha + + Lana marrón Antorcha (hulla) - - Antorcha (carbón) - - - Fuego - - - Generador de monstruos - - - Escaleras de roble - - - Cofre - - - Polvo de piedra rojiza - - - Mineral de diamante - - - Bloque de diamante - - - Una forma compacta de almacenar diamantes. - - - Mesa de trabajo - - - Cultivos - - - Granja - - - Horno - - - Cartel - - - Puerta de madera - - - Escalera - - - Raíl - - - Raíl propulsado - - - Raíl detector - - - Escaleras de piedra - - - Palanca - - - Placa de presión - - - Puerta de hierro - - - Mineral de piedra rojiza - - - Antorcha piedra roja - - - Botón - - - Nieve - - - Hielo - - - Cactus - - - Arcilla - - - Caña de azúcar - - - Tocadiscos - - - Valla - - - Calabaza - - - Calabaza iluminada - - - Bloque inferior + + Piedra brillante Arena de alma - - Piedra brillante - - - Portal - - - Mineral de lapislázuli + + Bloque inferior Bloque de lapislázuli + + Mineral de lapislázuli + + + Portal + + + Calabaza iluminada + + + Caña de azúcar + + + Arcilla + + + Cactus + + + Calabaza + + + Valla + + + Tocadiscos + Una forma compacta de almacenar lapislázuli. - - Dispensador - - - Bloque de nota - - - Pastel - - - Cama - - - Telaraña - - - Hierba alta - - - Arbusto muerto - - - Diodo - - - Cofre cerrado - Trampilla - - Lana (cualquier color) + + Cofre cerrado - - Pistón + + Diodo Pistón adhesivo - - Bloque de pez plateado + + Pistón - - Ladrillos de piedra + + Lana (cualquier color) - - Ladrillos de piedra musgosa + + Arbusto muerto - - Ladrillos de piedra agrietada + + Pastel - - Ladrillos de piedra cincelada + + Bloque de nota - - Champiñón + + Dispensador - - Champiñón + + Hierba alta - - Barras de hierro + + Telaraña - - Panel de cristal + + Cama - - Melón + + Hielo - - Tallo de calabaza + + Mesa de trabajo - - Tallo de melón + + Una forma compacta de almacenar diamantes. - - Enredaderas + + Bloque de diamante - - Puerta de valla + + Horno - - Escaleras de ladrillo + + Granja - - Escaleras ladrillo piedra + + Cultivos - - Piedra de pez plateado + + Mineral de diamante - - Guijarro de pez plateado + + Generador de monstruos - - Ladrillo de piedra de pez plateado + + Fuego - - Micelio + + Antorcha (carbón) - - Nenúfar + + Polvo de piedra rojiza - - Ladrillo del mundo inferior + + Cofre - - Valla del mundo inferior + + Escaleras de roble - - Escaleras mundo inferior + + Cartel - - Verruga del mundo inferior + + Mineral de piedra rojiza - - Mesa de encantamientos + + Puerta de hierro - - Soporte para pociones + + Placa de presión - - Caldero + + Nieve - - Portal final + + Botón - - Estructura de portal final + + Antorcha piedra roja - - Piedra final + + Palanca - - Huevo de dragón + + Raíl - - Arbusto + + Escalera - - Helecho + + Puerta de madera - - Escaleras de arenisca + + Escaleras de piedra - - Escaleras de abeto + + Raíl detector - - Escaleras de abedul - - - Escaleras de la jungla - - - Lámpara de piedra rojiza - - - Cacao - - - Calavera - - - Controles actuales - - - Configuración - - - Mover/Correr - - - Mirar - - - Pausar - - - Saltar - - - Saltar/Volar hacia arriba - - - Inventario - - - Cambiar objeto - - - Acción - - - Usar - - - Creación - - - Soltar - - - Sigilo - - - Sigilo/Volar hacia abajo - - - Cambiar modo de cámara - - - Jugadores/Invitar - - - Movimiento (al volar) - - - Opción 1 - - - Opción 2 - - - Opción 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;]]> - - - <![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*}Pulsa{*CONTROLLER_VK_A*} para continuar. - - - {*B*}Pulsa{*CONTROLLER_VK_A*} para comenzar el tutorial.{*B*} - Pulsa{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. - - - Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. -De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda. - - - Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. - - - Usa{*CONTROLLER_ACTION_MOVE*} para moverte. - - - Para correr, pulsa{*CONTROLLER_ACTION_MOVE*} hacia delante dos veces con rapidez. Mientras mantienes pulsado{*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que te quedes sin tiempo de carrera o sin comida. - - - Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar. - - - Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... - - - Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para talar 4 bloques de madera (troncos de árbol).{*B*}Cuando un bloque se rompe, puedes colocarte junto al objeto flotante que aparece para recogerlo y así hacer que aparezca en tu inventario. - - - Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. - - - A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} - Pulsa{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. - - - Cuando te mueves, extraes o atacas, tu barra de comida se vacía{*ICON_SHANK_01*}. Si corres y saltas en carrera, consumes más comida que si caminas y saltas de forma normal. - - - Si pierdes salud pero tienes una barra de comida con 9 o más{*ICON_SHANK_01*} en ella, la salud se repondrá automáticamente. Si comes, la barra de comida se recargará. - - - Con un objeto de comida en la mano, mantén pulsado{*CONTROLLER_ACTION_USE*} para comerlo y recargar la barra de comida. No puedes comer si la barra de comida está llena. - - - Tu barra de comida está baja y has perdido salud. Come el filete de tu inventario para recargar tu barra de comida y empezar a curarte.{*ICON*}364{*/ICON*} - - - La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} - - - Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} - - - Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas a tal efecto. Algunas herramientas tienen un mango de palo. Crea algunos palos ahora.{*SticksIcon*} - - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. - - - Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interactuar con ellos y colocarlos. Los objetos colocados se pueden volver a coger extrayéndolos con la herramienta adecuada. - - - Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. - - - Apunta hacia la mesa de trabajo y pulsa{*CONTROLLER_ACTION_USE*} para abrirla. - - - Con una pala puedes excavar bloques blandos, como tierra y nieve, más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea una pala de madera.{*WoodenShovelIcon*} - - - Con un hacha puedes 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*} - - - Con un pico puedes excavar bloques duros, como piedra y mineral, más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea un pico de madera.{*WoodenPickaxeIcon*} - - - Abre el contenedor. - - - - La noche cae enseguida, y es un momento peligroso para salir sin estar preparado. Puedes crear armadura y armas, pero lo más sensato es disponer de un refugio seguro. - - - - Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. - - - - 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. - - - - 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*} + + Raíl propulsado Ya has recogido suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. - - Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + + Caña de pescar - - 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? + + Reloj - - 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? + + Polvo de piedra brillante - - 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*} + + Vagoneta con horno - - Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. + + Huevo - - 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*} + + Brújula - - Has completado la primera parte del tutorial. + + Pescado crudo - - {*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. + + Rojo rosa - - 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. + + Verde cactus + + + Granos de cacao + + + Pescado cocinado + + + Polvo de tinte + + + Bolsa de tinta + + + Vagoneta con cofre + + + Bola de nieve + + + Barco + + + Cuero + + + Vagoneta + + + Silla de montar + + + Piedra rojiza + + + Cubo de leche + + + Papel + + + Libro + + + Bola de limo + + + Ladrillo + + + Arcilla + + + Cañas de azúcar + + + Lapislázuli + + + Mapa + + + Disco: "13" + + + Disco: "gato" + + + Cama + + + Repetidor de piedra rojiza + + + Galleta + + + Disco: "bloques" + + + Disco: "mellohi" + + + Disco: "stal" + + + Disco: "strad" + + + Disco: "gorjeo" + + + Disco: "lejos" + + + Disco: "galería" + + + Pastel + + + Tinte gris + + + Tinte rosa + + + Tinte lima + + + Tinte púrpura + + + Tinte cian + + + Tinte gris claro + + + Amarillo amargo + + + Polvo de hueso + + + Hueso + + + Azúcar + + + Tinte azul claro + + + Tinte magenta + + + Tinte naranja + + + Cartel + + + Túnica de cuero + + + Coraza de hierro + + + Coraza de diamante + + + Casco de hierro + + + Casco de diamante + + + Casco de oro + + + Coraza de oro + + + Mallas de oro + + + Botas de cuero + + + Botas de hierro + + + Calzas de cuero + + + Mallas de hierro + + + Mallas de diamante + + + Gorro de cuero + + + Azada de piedra + + + Azada de hierro + + + Azada de diamante + + + Hacha de diamante + + + Hacha de oro + + + Azada de madera + + + Azada de oro + + + Peto de malla + + + Mallas de malla + + + Botas de malla + + + Puerta de madera + + + Puerta de hierro + + + Casco de malla + + + Botas de diamante + + + Pluma + + + Pólvora + + + Semillas de trigo + + + Cuenco + + + Estofado de champiñón + + + Cuerda + + + Trigo + + + Chuleta de cerdo cocinada + + + Cuadro + + + Manzana de oro + + + Pan + + + Pedernal + + + Chuleta de cerdo cruda + + + Palo + + + Cubo + + + Cubo de agua + + + Cubo de lava + + + Botas de oro + + + Lingote de hierro + + + Lingote de oro + + + Chisquero de pedernal + + + Hulla + + + Carbón + + + Diamante + + + Manzana + + + Arco + + + Flecha + + + Disco: "pabellón" + + + 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*} + + + 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*} + + + 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. + + + 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. + + + 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*} + + + 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*} + + + La leña que recojas se puede convertir en tablones. Selecciona el icono de tablones y pulsa{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} + + + 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. + + + 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. + + + 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. + + + + Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. + + + Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. + + + 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. + + + Hay objetos que no se pueden crear con la mesa de trabajo, sino que requieren un horno. Crea un horno ahora.{*FurnaceIcon*} + + + Grava + + + Mineral de oro + + + Mineral de hierro + + + Lava + + + Arena + + + Arenisca + + + Mineral de hulla + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. + + + Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. + + + 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. + + + Madera + + + Madera de roble + + + 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. + + + {*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. {*B*} Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el 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. - + + 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. + - - 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*} +Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} + Pulsa{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + + 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. + + + 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. + + + + Has completado la primera parte del tutorial. + + + 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? + + + 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? + + + Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + + + 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*} + + + Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el 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*} + - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa {*CONTROLLER_VK_BACK*}. + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario. + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + - - Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + + + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + {*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + + + {*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + + 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. {*B*} Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el 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. + + Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario. + + + 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*}. @@ -2858,2151 +5643,211 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} 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. - - 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*}. + + 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. - - 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. + + Agua - - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa{*CONTROLLER_VK_BACK*} . + + Botella de cristal - - Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. - + + Botella de agua - - - Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. - + + Ojo de araña - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + Pepita de oro - - {*B*} - Pulsa{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + Verruga del mundo inferior - - {*B*} - Pulsa{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + + Poción{*splash*}{*prefix*}{*postfix*} - - {*B*} - Pulsa{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. + + Ojo de araña ferment. - - 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. - + + Caldero - - 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. - + + Ojo finalizador - - 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. + + Melón resplandeciente - - 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. + + Polvo de llama - - Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. + + Crema de magma - - Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. - - - La leña que recojas se puede convertir en tablones. Selecciona el icono de tablones y pulsa{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} - - - Ahora que has construido una mesa de 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. - - - 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*} - - - 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*} - - - 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*} - - - 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*} - - - 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. - - - Hay objetos que no se pueden crear con la mesa de trabajo, sino que requieren un horno. Crea un horno ahora.{*FurnaceIcon*} - - - Coloca el horno que has creado en el mundo. Te conviene colocarlo en el interior del refugio.{*B*} -Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. - - - Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. - - - Tienes que colocar combustible en el espacio de la parte inferior del horno y el objeto que quieres modificar en el espacio superior. El horno se encenderá y empezará a funcionar, y colocará el resultado en el espacio de la parte derecha. - - - Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También 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. - - - 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. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar 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. - - - Todas las pociones se empiezan con una botella de agua. La mayoría de pociones se crean usando primero una verruga del mundo inferior para crear una poción rara, y requieren como mínimo un ingrediente más para obtener la poción final. - - - Una vez que tengas una poción, podrás modificar sus efectos. Si añades polvo de piedra rojiza, aumentas la duración del efecto, y si añades polvo de piedra brillante, su efecto será más potente. - - - Si añades ojo de araña fermentado, 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 mundo inferior a una botella de agua y luego añade crema de magma. - - - Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. - - - En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. - - - {*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. - - - El primer paso para elaborar una poción es crear una botella de agua. Toma una botella de agua del cofre. - - - Puedes llenar una botella de agua con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar la botella de agua, apunta a una fuente de agua y pulsa{*CONTROLLER_ACTION_USE*}. - - - Si un caldero se vacía, puedes rellenarlo con un cubo de agua. - - - Usa el 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. - - - Toma una poción en la mano y mantén pulsado{*CONTROLLER_ACTION_USE*} para usarla. Si es una poción normal, bébela y te aplicarás el efecto a ti mismo; si es una poción de salpicadura, la lanzarás y aplicarás el efecto a las criaturas que estén cerca en el momento del impacto. - Las pociones de salpicadura se crean añadiendo pólvora a las pociones normales. - - - Usa una poción de resistencia al fuego contigo mismo. - - - Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. - - - Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. - - - {*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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. - - - {*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. - - - 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. - - - Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. - - - 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. - - - 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. - - - 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. - - - Ahora vas subido en una vagoneta. Para salir de ella, apunta a ella con el cursor y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. - - - Las vagonetas van sobre raíles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. - {*RailIcon*} - - - También puedes crear raíles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y placas de presión para crear sistemas complejos. - {*PoweredRailIcon*} - - - Ahora navegas en un barco. Para salir de él, apúntalo con el puntero y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los barcos.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los barcos. - - - Los barcos te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. - {*BoatIcon*} - - - Ahora usas una caña de pescar. Pulsa{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo pescar. - - - Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*CONTROLLER_ACTION_USE*} de nuevo para recoger 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*} - - - Esto es una cama. Pulsa{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*ICON*}355{*/ICON*} - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. - - - Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. - {*ICON*}355{*/ICON*} - - - 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*} - - - En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. - - - 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. - - - La posición y dirección en que colocas la fuente de energía puede cambiar la forma en que afecta a los bloques que la rodean. Por ejemplo, una antorcha de piedra rojiza en un lado de un bloque se puede desactivar si el bloque recibe energía de otra fuente. - - - El polvo de piedra rojiza se consigue al extraer mineral de piedra rojiza con un pico hecho de hierro, diamante u oro. Puedes usarlo para 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*} - - - Los repetidores de piedra rojiza se usan para ampliar la distancia a la que se puede transportar la energía o para colocar un retardo en un circuito. - {*ICON*}356{*/ICON*} - - - Al recibir energía, los pistones se extienden y empujan hasta 12 bloques. Cuando se repliegan, los pistones adhesivos pueden tirar de bloques de casi cualquier tipo. - {*ICON*}33{*/ICON*} - - - En el cofre de esta área encontrarás componentes para fabricar circuitos con pistones. Prueba a usar o completar los circuitos de esta área o coloca los tuyos propios. Fuera del área de tutorial encontrarás más ejemplos. - - - ¡En esta área hay un portal al mundo inferior! - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el mundo inferior.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los portales y el mundo inferior. - - - Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. - - - Para activar el portal inferior, prende fuego a los bloques de obsidiana del interior de la estructura con 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. - - - Para usar un portal inferior, colócate en su interior. La pantalla se pondrá púrpura y se reproducirá un sonido. Al cabo de unos segundos, te transportarás a otra dimensión. - - - El mundo inferior es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques inferiores, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. - - - El mundo inferior sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el mundo inferior equivale a desplazarte tres bloques en el mundo superior. - - - Ahora estás en el modo Creativo. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} - Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. - - - En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. - - - Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. - - - Para continuar, cruza al otro lado de este agujero. - - - Has completado el tutorial del modo Creativo. - - - En esta área se ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} - Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. - - - El trigo, las calabazas y los melones se cultivan a partir de semillas. Las semillas de trigo se obtienen al romper hierba alta o al cosechar trigo, y las semillas de calabaza y melón se consiguen a partir de calabazas y melones respectivamente. - - - Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de una azada. Una fuente cercana de agua te ayudará a mantener la tierra de cultivo hidratada y hará que los cultivos crezcan más rápido, además de mantener la zona iluminada. - - - El trigo pasa por distintas fases durante su crecimiento. Cuando aparece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} - - - Las calabazas y los melones también necesitan un bloque cerca de donde hayas plantado la semilla para que el fruto crezca cuando el tallo se haya desarrollado por completo. - - - La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} - - - Los cactus deben plantarse en arena y crecerán hasta tres bloques de alto. Al igual que con la caña de azúcar, si se destruye el bloque más bajo podrás recoger los bloques que estén sobre él.{*ICON*}81{*/ICON*} - - - Los champiñones deben plantarse en una zona con luz tenue y se 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*} - - - Has completado el tutorial de los cultivos. - - - En esta área se han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. - - - -{*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes sobre reproducción de animales. - - - Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". - - - Si alimentas con trigo a las vacas, champiñacas u ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a 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. - - - 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 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. - - - - Has completado el tutorial Reproducción de animales. - - - En esta zona hay algunas calabazas y bloques para crear un gólem de nieve y otro de hierro. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los gólems.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los gólems. - - - Los gólems se crean colocando una calabaza encima de un montón de bloques. - - - Los gólems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos gólems lanzan bolas de nieve a tus enemigos. - - - Los gólems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos gólems atacan a tus enemigos. - - - Los gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. - - - No puedes salir de esta área hasta que completes el tutorial. - - - Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. - - - Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. - - - Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para 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. - - - 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... - - - 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. - - - Mantén pulsado{*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 pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. - - - En el cofre que está junto al río hay un barco. Para usarlo, apunta al agua con el cursor y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al barco para subir a él. - - - En el cofre que está junto al estanque hay una caña de pescar. Coge la caña del cofre y selecciónala para llevarla en la mano y usarla. - - - ¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Pulsa el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. - - - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. - - - No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. - - - ¡Enhorabuena! Has completado el tutorial. El tiempo del juego transcurre ahora a velocidad normal, ¡y no falta mucho para la noche y para que salgan los monstruos! ¡Acaba el refugio! - - - {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. - - - Recordatorio: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Se han añadido nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. - - - {*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} - Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. - - - En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. - - - Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. - - - La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funciona la barra de comida y cómo comer. - - - Seleccionar - - - Usar - - - Atrás - - - Salir - - - Cancelar - - - No unirse - - - Actualizar partidas online - - - Partidas en grupo - - - Todas las partidas - - - Cambiar grupo - - - Mostrar inventario - - - Mostrar descripción - - - Mostrar ingredientes - - - Creación - - - Crear - - - Coger/Colocar - - - Coger - - - Coger todo - - - Coger la mitad - - - Colocar - - - Colocar todo - - - Colocar uno - - - Soltar - - - Soltar todo - - - Soltar uno - - - Cambiar - - - Movimiento rápido - - - Borrar selección rápida - - - ¿Qué es esto? - - - Compartir en Facebook - - - Cambiar filtro - - - Enviar solicitud de amistad - - - Avanzar página - - - Retroceder página - - - Siguiente - - - Anterior - - - Expulsar jugador - - - Teñir - - - Extraer - - - Alimentar - - - Domar - - - Curar - - - Sentarse - - - Sígueme - - - Expulsar - - - Vaciar - - - Silla de montar - - - Colocar - - - Golpear - - - Ordeñar - - - Recoger - - - Comer - - - Dormir - - - Despertar - - - Rep. - - - Montar - - - Navegar - - - Cultivar - - - Nadar hacia arriba - - - Abrir - - - Cambiar tono - - - Detonar - - - Leer - - - Colgar - - - Arrojar - - - Plantar - - - Labrar - - - Cosechar - - - Continuar - - - Desbloquear juego completo - - - Borrar partida guardada - - - Borrar - - - Opciones - - - Invitar a amigos - - - Aceptar - - - Esquilar - - - Bloquear nivel - - - Seleccionar aspecto - - - Prender fuego - - - Desplazar - - - Instalar versión completa - - - Instalar versión de prueba - - - Instalar - - - Reinstalar - - - Op. de guardado - - - Ejecutar comando - - - Creativo - - - Mover ingrediente - - - Mover combustible - - - Mover herramienta - - - Mover armadura - - - Mover arma - - - Equipar - - - Disparar - - - Soltar - - - Privilegios - - - Bloquear - - - Retroceder página - - - Avanzar página - - - Modo Amor - - - Beber - - - Rotar - - - Esconderse - - - Vaciar todos los espacios - - - Aceptar - - - Cancelar - - - Tienda de Minecraft - - - ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderán todo el progreso no guardado. - - - Salir de la partida - - - Guardar partida - - - Salir sin guardar - - - ¿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! - - - Comenzar a jugar - - - Archivo dañado - - - El archivo guardado está dañado. ¿Quieres borrarlo? - - - ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. - - - Salir y guardar - - - Salir sin guardar - - - ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. - - - ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! - - - Crear nuevo mundo - - - Jugar tutorial - - - Tutorial - - - Dar nombre al mundo - - - Escribe un nombre para tu mundo. - - - Introduce la semilla para la generación del mundo. - - - Cargar mundo guardado - - - Pulsa START para unirte. - - - Saliendo de la partida - - - Se ha producido un error. Saliendo al menú principal. - - - Error de conexión - - - Conexión perdida - - - Se ha perdido la conexión con el servidor. Saliendo al menú principal. - - - Desconectado por el servidor - - - Has sido expulsado de la partida. - - - Has sido expulsado de la partida por volar. - - - El intento de conexión ha tardado demasiado. - - - El servidor está lleno. - - - El anfitrión ha salido de 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. - - - No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. - - - 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! - - - ¡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: - - - Amigos - - - Mi puntuación - - - Total - - - Entradas: - - - Rango - - - Preparando para guardar nivel - - - Preparando fragmentos... - - - Finalizando... - - - Construyendo terreno - - - Simulando mundo durante un instante - - - Inicializando servidor - - - Generando zona de generación - - - Cargando zona de generación - - - Entrando en el mundo inferior - - - Saliendo del mundo inferior - - - Regenerando - - - Generando nivel - - - Cargando nivel - - - Guardando jugadores - - - Conectando al anfitrión - - - Descargando terreno - - - Cambiando a juego sin conexión - - - Espera mientras el anfitrión guarda la partida. - - - Entrando en El Fin - - - Saliendo de El Fin - - - Esta cama está ocupada. - - - Solo puedes dormir por la noche. - - - %s está durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. - - - ¡La cama de tu casa ha desaparecido o está obstruida! - - - Ahora no puedes descansar, hay monstruos cerca. - - - Estás durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. - - - Herramientas y armas - - - Armas - - - Comida - - - Estructuras - - - Armadura - - - Mecanismos - - - Transporte - - - Decoraciones - - - Bloques de construcción - - - Piedra rojiza y transporte - - - Varios - - - Pociones - - - Herramientas, armas y armadura - - - Materiales - - - Sesión cerrada - - - Dificultad - - - Música - - - Sonido - - - Gamma - - - Sensibilidad del juego - - - Sensibilidad interfaz - - - Pacífico - - - Fácil - - - Normal - - - Difícil - - - En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. - - - En este modo, el entorno genera enemigos, pero causarán menos daño al jugador que en el modo normal. - - - En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño estándar. - - - 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! - - - Fin de la prueba - - - Partida llena - - - No te has podido unir a la partida y no quedan más espacios. - - - Introducir texto del cartel - - - Introduce una línea de texto para tu cartel. - - - Introducir título - - - Introduce un título para tu publicación. - - - Introducir subtítulo - - - Introduce un subtítulo para tu publicación. - - - Introducir descripción - - - Introduce una descripción para tu publicación. - - - Inventario - - - Ingredientes - - + Soporte para pociones - - Cofre + + Lágrima de espectro - - Encantar + + Semillas de calabaza - - Horno + + Semillas de melón - - Ingrediente + + Pollo crudo - - Combustible + + Disco: "11" - - Dispensador + + Disco: "dónde estamos" - - No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. + + Cizallas - - %s se ha unido a la partida. + + Pollo cocinado - - %s ha abandonado la partida. + + Perla finalizadora - - Han expulsado a %s de la partida. + + Rodaja de melón - - ¿Seguro que quieres borrar esta partida guardada? + + Vara de llama - - Esperando aprobación + + Ternera cruda - - Censurado + + Filete - - Sonando: + + Carne podrida - - Restablecer configuración + + Botella de encanto - - ¿Seguro que quieres restablecer la configuración a los valores predeterminados? + + Tablones de roble - - Error al cargar + + Tablones de abeto - - Partida de %s + + Tablones de abedul - - Partida de anfitrión desconocido + + Bloque de hierba - - Un invitado ha cerrado la sesión + + Tierra - - Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos de la partida. + + Guijarro - - Iniciar sesión + + Tablones de la jungla - - No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + + Brote de abedul - - Multijugador no admitido + + Brote de árbol de la jungla - - Imposible crear la partida + + Lecho de roca - - Selección automática + + Brote - - Sin pack: aspectos por defecto + + Brote de roble - - Aspectos favoritos + + Brote de abeto - - Nivel bloqueado + + Piedra - - 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. + + Marco - - ¿Bloquear este nivel? + + Generar {*CREATURE*} - - ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? -Selecciona ACEPTAR para salir de la partida. + + Ladrillo del mundo inferior - - Eliminar de la lista de bloqueados + + Descarga de fuego - - Autoguardado cada + + Desc. fuego (carbón) - - Autoguardado: NO + + Desc. de fuego (hulla) - - min. + + Calavera - - ¡No se puede colocar aquí! + + Cabeza - - No se puede colocar lava cerca del punto de generación del nivel porque puede matar al instante a los jugadores que se regeneran. + + Cabeza de %s - - Opacidad de interfaz + + Cabeza de creeper - - Preparando autoguardado del nivel + + Calavera de esqueleto - - Tamaño del panel de datos + + Calavera de esqueleto atrofiado - - Tamaño panel (pant. divid.) + + Cabeza de zombi - - Semilla - - - Desbloquear pack de aspecto - - - Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. -¿Quieres desbloquear este pack de aspecto ahora? - - - Desbloquear pack de textura - - - Desbloquea este pack de textura para usarlo en tu mundo. -¿Te gustaría desbloquearlo ahora? - - - Pack de textura de prueba - - - Estás usando una versión de prueba del pack de textura. No podrás guardar este mundo a menos que desbloquees la versión completa. -¿Te gustaría desbloquear la versión completa de este pack de textura? - - - Pack de textura no disponible - - - Desbloquear versión completa - - - Descargar versión de prueba - - - Descargar versión completa - - - ¡Este mundo usa un pack de textura o de popurrí que no tienes! -¿Quieres instalar el pack de textura o de popurrí ahora? - - - Conseguir versión de prueba - - - Conseguir versión completa - - - Expulsar jugador - - - ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. - - - Packs de imágenes de jugador - - - Temas - - - Packs de aspectos - - - Permitir amigos de amigos - - - No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. - - - No te puedes unir a la partida - - - Seleccionado - - - Aspecto seleccionado: - - - Contenido descargable dañado - - - El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. - - - Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. - - - Se ha cambiado el modo de juego. - - - Cambiar nombre del mundo - - - Escribe un nuevo nombre para tu mundo. - - - Modo de juego: Supervivencia - - - Modo de juego: Creativo - - - Supervivencia - - - Creativo - - - Creado en modo Supervivencia - - - Creado en modo Creativo - - - Generar nubes - - - ¿Qué quieres hacer con esta partida guardada? - - - Renombrar partida guardada - - - Autoguardando en %d... - - - - - - No - - - Normal - - - Superplano - - - Si está habilitado, la partida será online. - - - Si está habilitado, solo los jugadores invitados pueden unirse. - - - Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. - - - Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. - - - Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. - - - Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. - - - Si está habilitado, la dinamita explota cuando se activa. - - - Si está habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. - - - Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. - - - Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el inferior. - - - Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. - - - Packs de aspecto - - - Temas - - - Imágenes de jugador - - - Objetos de avatar - - - Packs de textura - - - Packs de popurrí - - - {*PLAYER*} ardió. - - - {*PLAYER*} se quemó hasta morir. - - - {*PLAYER*} intentó nadar en la lava. - - - {*PLAYER*} se asfixió en un muro. - - - {*PLAYER*} se ahogó. - - - {*PLAYER*} se murió de hambre. - - - {*PLAYER*} se pinchó hasta morir. - - - {*PLAYER*} se golpeó demasiado fuerte contra el suelo. - - - {*PLAYER*} se cayó del mundo. - - - {*PLAYER*} murió. - - - {*PLAYER*} explotó. - - - {*PLAYER*} murió a causa de la magia. - - - {*PLAYER*} murió a causa del aliento del dragón finalizador. - - - {*SOURCE*} asesinó a {*PLAYER*}. - - - {*SOURCE*} asesinó a {*PLAYER*}. - - - {*SOURCE*} disparó a {*PLAYER*}. - - - {*SOURCE*} quemó con bolas de fuego a {*PLAYER*}. - - - {*SOURCE*} apaleó a {*PLAYER*}. - - - {*PLAYER*} ha muerto a manos de {*SOURCE*}. - - - Niebla de lecho de roca - - - Mostrar panel de datos - - - Mostrar mano - - - Mensajes de muerte - - - Personaje animado - - - Animación de aspecto pers. - - - Ya no puedes extraer ni usar objetos. - - - Ahora puedes extraer y usar objetos. - - - Ya no puedes colocar bloques. - - - Ahora puedes colocar bloques. - - - Ahora puedes usar puertas e interruptores. - - - Ya no puedes usar puertas ni interruptores. - - - Ahora puedes usar contenedores (p. ej. cofres). - - - Ya no puedes usar contenedores (p. ej. cofres). - - - Ya no puedes atacar a enemigos. - - - Ahora puedes atacar a enemigos. - - - Ya no puedes atacar a jugadores. - - - Ahora puedes atacar a jugadores. - - - Ya no puedes atacar a animales. - - - Ahora puedes atacar a animales. - - - Ahora eres moderador. - - - Ya no eres moderador. - - - Ahora puedes volar. - - - Ya no puedes volar. - - - Ya no te cansarás. - - - Ahora te cansarás. - - - Ahora eres invisible. - - - Ya no eres invisible. - - - Ahora eres invulnerable. - - - Ya no eres invulnerable. - - - %d MSP - - - Dragón finalizador - - - %s ha entrado en El Fin. - - - %s ha salido de El Fin. - - - {*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} -{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Sí. Cuidado. Ha alcanzado un nivel superior. Puede leer nuestros pensamientos.{*EF*}{*B*}{*B*} -{*C2*}No importa. Cree que somos parte del juego.{*EF*}{*B*}{*B*} -{*C3*}Me gusta. Ha jugado bien. No se ha rendido.{*EF*}{*B*}{*B*} -{*C2*}Lee nuestros pensamientos como si fueran textos en una pantalla.{*EF*}{*B*}{*B*} -{*C3*}Así le gusta imaginar muchas cosas, cuando está en lo más profundo del sueño del juego.{*EF*}{*B*}{*B*} -{*C2*}Las palabras son una interfaz maravillosa. Muy flexibles. Y asustan menos que contemplar la realidad que se oculta detrás de la pantalla.{*EF*}{*B*}{*B*} -{*C3*}Antes oían voces. Antes de que los jugadores pudieran leer. En aquellos tiempos en los que los que no jugaban llamaban a los jugadores hechiceros y brujas. Y en los que los jugadores soñaban que volaban sobre palos impulsados por demonios.{*EF*}{*B*}{*B*} -{*C2*}¿Qué soñaba este jugador?{*EF*}{*B*}{*B*} -{*C3*}Soñaba la luz del sol y los árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba que cazaba y que le daban caza. Soñaba un refugio.{*EF*}{*B*}{*B*} -{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. Pero ¿qué estructura verdadera ha creado en la realidad tras la pantalla?{*EF*}{*B*}{*B*} -{*C3*}Colaboró con muchos más para esculpir un mundo real en un pliego de {*EF*}{*NOISE*}{*C3*} y creó un {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*} en {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Pero eso no lo puede leer.{*EF*}{*B*}{*B*} -{*C3*}No. Todavía no ha alcanzado el nivel superior. Debe conseguirlo en el largo sueño de la vida, no el corto sueño de un juego.{*EF*}{*B*}{*B*} -{*C2*}¿Sabe que lo queremos? ¿Que el universo es amable?{*EF*}{*B*}{*B*} -{*C3*}A veces, entre el ruido de sus pensamientos, escucha al universo, sí.{*EF*}{*B*}{*B*} -{*C2*}Pero, a veces, está triste en el sueño largo. Crea mundos que no tienen verano y tiembla bajo un sol negro, y confunde su creación triste con la realidad.{*EF*}{*B*}{*B*} -{*C3*}Quitarle la pena lo destruiría. La pena es parte de su propia misión. No podemos interferir.{*EF*}{*B*}{*B*} -{*C2*}A veces, cuando están en un sueño muy profundo, quiero decírselo, decirles que están construyendo mundos de verdad en la realidad. A veces, quiero decirles que son importantes para el universo. A veces, cuando no han creado una conexión real en mucho tiempo, quiero ayudarles a decir la palabra que temen.{*EF*}{*B*}{*B*} -{*C3*}Lee nuestros pensamientos.{*EF*}{*B*}{*B*} -{*C2*}A veces, no me importa. A veces, quiero decirles que este mundo que toman por real tan solo es {*EF*}{*NOISE*}{*C2*} y {*EF*}{*NOISE*}{*C2*}, quiero decirles que son {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Ven tan poco de la realidad en su sueño largo.{*EF*}{*B*}{*B*} -{*C3*}Pero siguen jugando.{*EF*}{*B*}{*B*} -{*C2*}Y sería tan fácil 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*} - - - {*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*} - - - {*C2*}A veces, las llamaba "planetas" y "estrellas".{*EF*}{*B*}{*B*} -{*C2*}A veces, creía que estaba en un universo hecho de energía que estaba compuesto de encendidos y apagados, de ceros y unos, de líneas de código. A veces, creía que jugaba a un juego. A veces, creía que leía palabras en una pantalla.{*EF*}{*B*}{*B*} -{*C3*}Tú eres el jugador, que lee palabras...{*EF*}{*B*}{*B*} -{*C2*}Sssh... A veces, el jugador leía líneas de código en una pantalla. Las decodificaba en palabras, decodificaba las palabras en significados; decodificaba los significados en sentimientos, teorías, ideas... y el jugador comenzó a respirar cada vez más deprisa y más profundamente cuando se dio cuenta de que estaba vivo, estaba vivo, esas miles de muertes no habían sido reales, el jugador estaba vivo.{*EF*}{*B*}{*B*} -{*C3*}Tú. Tú. Tú estás vivo.{*EF*}{*B*}{*B*} -{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz del sol del verano que se colaba entre las hojas al viento.{*EF*}{*B*}{*B*} -{*C3*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz que llegaba del frío cielo nocturno del invierno, donde una mota de luz en el rabillo del ojo del jugador podría ser una estrella un millón de veces más grande que el sol, quemando sus planetas, convirtiéndolos en plasma, para que el jugador pudiera verla un instante desde el otro extremo del universo mientras volvía a casa, mientras olía comida de pronto, casi en su puerta, a punto de volver a soñar.{*EF*}{*B*}{*B*} -{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de los ceros y los unos, a través de la electricidad del mundo, a través de las palabras deslizándose por una pantalla al final de un sueño.{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía te quiero.{*EF*}{*B*}{*B*} -{*C2*}Y el universo le decía has jugado bien.{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía cuanto necesitas está en tu interior.{*EF*}{*B*}{*B*} -{*C2*}Y el universo le decía eres más fuerte de lo que crees.{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía eres la luz del día.{*EF*}{*B*}{*B*} -{*C2*}Y el universo le decía eres la noche.{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía tu lucha está en tu interior.{*EF*}{*B*}{*B*} -{*C2*}Y el universo le decía la luz que buscas está en tu interior.{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía no estás solo.{*EF*}{*B*}{*B*} -{*C2*}Y el universo le decía no estás separado del resto de las cosas.{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía eres el universo probándose a sí mismo, hablando consigo mismo, leyendo su propio código.{*EF*}{*B*}{*B*} -{*C2*}Y el universo le decía te quiero porque eres amor.{*EF*}{*B*}{*B*} -{*C3*}Y el juego había acabado y el jugador se despertó del sueño. Y el jugador comenzó un nuevo sueño. Y el jugador volvió a soñar, soñó mejor. Y el jugador era el universo. Y el jugador era amor.{*EF*}{*B*}{*B*} -{*C3*}Tú eres el jugador.{*EF*}{*B*}{*B*} -{*C2*}Despierta.{*EF*} - - - Restablecer mundo inferior - - - ¿Seguro que quieres restablecer el mundo inferior de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el mundo inferior. - - - Restablecer mundo inferior - - - No restablecer mundo inferior - - - No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas y gatos. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de champiñacas. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de lobos. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de gallinas. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de calamares. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de enemigos. - - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de aldeanos. - - - Se ha alcanzado el límite de cuadros y marcos en un mundo. - - - No puedes generar enemigos en el modo Pacífico. - - - Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cría de cerdos, ovejas, vacas y gatos. - - - Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de lobos. - - - Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de gallinas. - - - Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de champiñacas. - - - Se ha alcanzado la cantidad máxima de barcos en un mundo. - - - Se ha alcanzado el límite de cabezas de enemigos en un mundo. - - - Invertir vista - - - Zurdo - - - ¡Has muerto! - - - Regenerar - - - Ofertas de contenido descargable - - - Cambiar aspecto - - - Cómo se juega - - - Controles - - - Configuración - - - Créditos - - - Volver a instalar contenido - - - Ajustes de depuración - - - El fuego se propaga - - - La dinamita explota - - - Jugador contra jugador - - - Confiar en jugadores - - - Privilegios de anfitrión - - - Generar estructuras - - - Mundo superplano - - - Cofre de bonificación - - - Opciones de mundo - - - Puede construir y extraer - - - Puede usar puertas e interruptores - - - Puede abrir contenedores - - - Puede atacar a jugadores - - - Puede atacar a animales - - - Moderador - - - Expulsar jugador - - - Puede volar - - - Desactivar agotamiento - - - Invisible - - - Opciones de anfitrión - - - Jugadores/Invitar - - - Partida online - - - Solo por invitación - - - Más opciones - - - Cargar - - - Nuevo mundo - - - Nombre del mundo - - - Semilla para el generador de mundos - - - Dejar vacío para semilla aleatoria - - - Jugadores - - - Unirse a partida - - - Iniciar partida - - - No se encontraron partidas - - - Jugar partida - - - Marcadores - - - Ayuda y opciones - - - Juego completo - - - Reanudar partida - - - Guardar partida - - - Dificultad: - - - Tipo de partida: - - - Estructuras: - - - Tipo de nivel: - - - JcJ: - - - Confiar en jugadores: - - - Dinamita: - - - El fuego se propaga: - - - Volver a instalar tema - - - Volver a instalar imagen de jugador 1 - - - Volver a instalar imagen de jugador 2 - - - Volver a instalar objeto de avatar 1 - - - Volver a instalar objeto de avatar 2 - - - Volver a instalar objeto de avatar 3 - - - Opciones - - - Sonido - - - Control - - - Gráficos - - - Interfaz de usuario - - - Valores predeterminados - - - Oscilación de vista - - - Consejos - - - Ayuda sobre el juego - - - Pantalla dividida vert. para 2 j. - - - Listo - - - Editar mensaje de cartel: - - - Rellena la información que irá junto a tu captura. - - - Subtítulo - - - Captura de pantalla del juego - - - Editar mensaje de cartel: - - - ¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! - - - Mostrar todos los mundos mezclados - - - Sin efectos - - - Celeridad - - - Lentitud - - - Rapidez - - - Cansancio de extracción - - - Fuerza - - - Debilidad - - - Salud instantánea - - - Daño instantáneo - - - Impulso en salto - - - Náuseas - - - Regeneración - - - Resistencia - - - Resistente al fuego - - - Respiración acuática - - - Invisibilidad - - - Ceguera - - - Visión nocturna - - - 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 torpeza + + + de rapidez + + + de debilidad + + + de fortaleza + + + Resistente al fuego + + + Saturación + de resistencia - - de resistencia al fuego + + de salto - - de respiración en agua + + Wither - - de invisibilidad + + Aumento de salud - - de ceguera - - - de visión nocturna - - - de hambre - - - de veneno + + Absorción @@ -5043,9 +5897,78 @@ Selecciona ACEPTAR para salir de la partida. III + + de invisibilidad + IV + + de respiración en agua + + + de resistencia al fuego + + + de visión nocturna + + + de veneno + + + de hambre + + + de absorción + + + de saturación + + + de aumento de salud + + + de ceguera + + + de la decadencia + + + Natural + + + Fina + + + Difusa + + + Nítida + + + Lechosa + + + Rara + + + Untada + + + Lisa + + + Chapucera + + + Plana + + + Voluminosa + + + Insulsa + de salpicadura @@ -5055,50 +5978,14 @@ Selecciona ACEPTAR para salir de la partida. Aburrida - - Insulsa + + Enérgica - - Nítida + + Cordial - - Lechosa - - - Difusa - - - Natural - - - Fina - - - Rara - - - Plana - - - Voluminosa - - - Chapucera - - - Untada - - - Lisa - - - Suave - - - Cortés - - - Gruesa + + Encantadora Elegante @@ -5106,149 +5993,152 @@ Selecciona ACEPTAR para salir de la partida. Sofisticada - - Encantadora - - - Enérgica - - - Refinada - - - Cordial - Resplandeciente - - Potente - - - Repugnante - - - Inodora - Rancia Áspera + + Inodora + + + Potente + + + Repugnante + + + Suave + + + Refinada + + + Gruesa + + + Cortés + + + Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + + Reduce al instante la salud de los jugadores, animales y monstruos afectados. + + + 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. + 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. + + + Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. + Asquerosa Hedionda - - Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. - - - 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. - - - 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 el daño causado por los jugadores y monstruos afectados cuando atacan. - - - 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. - - - Reduce al instante la salud de los jugadores, animales y monstruos afectados. - - - Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - - Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. - - - Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + Aporrear Agudeza - - Aporrear + + Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - Maldición de los artrópodos + + Daño de ataque Derribar - - Aspecto ígneo + + Maldición de los artrópodos - - Protección + + Velocidad - - Protección contra el fuego + + Refuerzos zombi - - Caída de pluma + + Fuerza de salto del caballo - - Protección contra explosiones + + Cuando se aplica: - - Protección contra proyectiles + + Resistencia a derribar - - Respiración + + Alcance de seguimiento de criaturas - - Afinidad acuática - - - Eficacia + + Salud máxima Toque sedoso - - Irrompible + + Eficacia - - Saqueo + + Afinidad acuática Fortuna - - Poder + + Saqueo - - Llama + + Irrompible - - Puñetazo + + Protección contra el fuego - - Infinidad + + Protección - - I + + Aspecto ígneo - - II + + Caída de pluma - - III + + Respiración + + + Protección contra proyectiles + + + Protección contra explosiones IV @@ -5259,23 +6149,29 @@ Selecciona ACEPTAR para salir de la partida. VI + + Puñetazo + VII - - VIII + + III - - IX + + Llama - - X + + Poder - - Se puede perforar con un pico de hierro o un objeto mejor para extraer esmeraldas. + + Infinidad - - 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. + + II + + + I Se activa cuando una entidad pasa por una cuerda de trampa activada. @@ -5286,44 +6182,59 @@ Selecciona ACEPTAR para salir de la partida. Una forma compacta de almacenar esmeraldas. - - Una pared hecha de guijarros. + + 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 puede utilizar para reparar armas, herramientas y armaduras. + + IX - - Se funde en un horno para producir cuarzo del mundo inferior. + + VIII - - Se utiliza como decoración. + + Se puede perforar con un pico de hierro o un objeto mejor para extraer esmeraldas. - - Se puede comerciar con él con los aldeanos. - - - Se utiliza como decoración. Puedes plantar en ella flores, retoños, cactus y champiñones. + + X Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria dorada. Puede plantarse en tierra de cultivo. + + Se utiliza como decoración. Puedes plantar en ella flores, retoños, cactus y champiñones. + + + Una pared hecha de guijarros. + Restablece 0,5{*ICON_SHANK_01*} y puede cocinarse en un horno. Puede plantarse en tierra de cultivo. - - Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en un horno. + + Se funde en un horno para producir cuarzo del mundo inferior. + + + Se puede utilizar para reparar armas, herramientas y armaduras. + + + Se puede comerciar con él con los aldeanos. + + + Se utiliza como decoración. + + + Restablece 4{*ICON_SHANK_01*}. - 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. + Restaura 1{*ICON_SHANK_01*}. Puede envenenarte si lo ingieres. Se usa para controlar un cerdo ensillado al montarlo. - - Restablece 4{*ICON_SHANK_01*}. + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en un horno. + + + Restablece 3{*ICON_SHANK_01*}. Se crea con una zanahoria y pepitas de oro. Se usa con un yunque para encantar armas, herramientas o armaduras. @@ -5331,6 +6242,15 @@ Selecciona ACEPTAR para salir de la partida. 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 + + Pastel de calabaza - - Patata - - - 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,72 +6389,77 @@ 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. + + + + Teñir collar + + + + Para empezar a trabajar con un objeto, colócalo en el primer espacio de entrada. @@ -5553,9 +6469,9 @@ Selecciona ACEPTAR para salir de la partida. Pulsa{*CONTROLLER_VK_B*} si ya conoces la interfaz del yunque. - + - Para empezar a trabajar con un objeto, colócalo en el primer espacio de entrada. + También se puede colocar un segundo objeto idéntico en el segundo espacio para combinar los dos objetos. @@ -5563,24 +6479,14 @@ Selecciona ACEPTAR para salir de la partida. 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. - + - También se puede colocar un segundo objeto idéntico en el segundo espacio para combinar los dos objetos. + 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. Para encantar objetos en el yunque, coloca un libro encantado en el segundo espacio de entrada. - - - - - 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. @@ -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,14 +6568,24 @@ 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. En esta área hay un aldeano y un cofre que contiene papel para comprar objetos. + + + + + Pulsa{*CONTROLLER_VK_A*} para intercambiar los objetos que el aldeano necesita por el objeto que ofrece. + + + + + Los jugadores pueden intercambiar objetos de su inventario con los aldeanos. @@ -5679,19 +6595,14 @@ Selecciona ACEPTAR para salir de la partida. Pulsa{*CONTROLLER_VK_B*} si ya conoces el comercio. - + - Los jugadores pueden intercambiar objetos de su inventario con los aldeanos. + 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. - - - - - Realizar una mezcla de intercambios aumentará o actualizará aleatoriamente los intercambios disponibles del aldeano. @@ -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,37 +1,123 @@  - + + ¿Quieres iniciar sesión en "PSN"? + + + + 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. + + + SELECT + + + 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. + + + + Sistema PlayStation®Vita + + + Elige una red Ad hoc para conectar con otros sistemas PlayStation®Vita cercanos, o "PSN" para conectar con amigos de todo el mundo. + + + Red Ad hoc + + + Cambiar modo de red + + + Seleccionar modo de red + + + ID online en pantalla dividida + + + Trofeos + + + 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. + + + 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. + + + ID online: + + + 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. + + + Parche 1.04 (actualización 14) + + + ID online del juego + + + ¡Mira lo que he hecho en Minecraft: PlayStation®Vita Edition! + + + Error en la descarga. Inténtalo más tarde. + + + No ha sido posible unirse a la partida debido a un tipo de NAT estricta. Revisa tu configuración de red. + + + Error en la carga. Inténtalo más tarde. + + + ¡Descarga completada! + + + 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. + + + Guardado incompleto + + + Minecraft: PlayStation®Vita Edition no tiene espacio para guardar datos. Para crear espacio, borra otras partidas guardadas de Minecraft: PlayStation®Vita Edition. + + + Carga cancelada + + + Has cancelado la carga de esta partida guardada en la zona de guardado. + + + Cargar partida guardada de PS3™/PS4™ + + + Cargando datos: %d%% + + + "PSN" + + + Descargar datos PS3™ + + + Descargando datos: %d%% + + + Guardando + + + ¡Carga completada! + + + ¿Estás seguro de que quieres cargar esta partida guardada y sobrescribir cualquier archivo de la zona de guardado? + + + Convirtiendo datos + + NOT USED - - ¡Puedes utilizar la pantalla táctil del sistema PlayStation®Vita para navegar por los menús! - - - minecraftforum cuenta con una sección dedicada a la PlayStation®Vita Edition. - - - ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! - - - ¡No mires al Finalizador a los ojos! - - - Creemos que 4J Studios ha eliminado a Herobrine del juego para el sistema PlayStation®Vita, pero no estamos seguros. - - - ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! - - - {*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. - - - {*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. + + NOT USED {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} @@ -46,32 +132,80 @@ En modo de vuelo, puedes mantener pulsado{*CONTROLLER_ACTION_JUMP*} para subir y 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. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Invitar Amigos - 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? Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. ¿Seguro que quieres continuar? - - Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. + + "NOT USED" - - 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? + + Invitar Amigos + + + minecraftforum cuenta con una sección dedicada a la PlayStation®Vita Edition. + + + ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! + + + NOT USED + + + ¡Puedes utilizar la pantalla táctil del sistema PlayStation®Vita para navegar por los menús! + + + ¡No mires al Finalizador a los ojos! + + + {*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. + + + {*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. + + + Creemos que 4J Studios ha eliminado a Herobrine del juego para el sistema PlayStation®Vita, pero no estamos seguros. + + + ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! + + + 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? + + + Se ha producido un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. + + + Pociones + + + Has vuelto a la pantalla de título porque has cerrado sesión en "PSN". + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. Se ha perdido la conexión con "PSN". Saliendo al menú principal. @@ -79,11 +213,23 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Se ha perdido la conexión con "PSN". + + Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. + + + 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? + 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? + + Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. + + + ID online + 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". @@ -93,150 +239,7 @@ Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStati 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? - - Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. - - - ID online - - - Pociones - - - Has vuelto a la pantalla de título porque has cerrado sesión en "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? - - - Se ha producido un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - ID online en pantalla dividida - - - Trofeos - - - ID online: - - - ID online del juego - - - ¡Mira lo que he hecho en Minecraft: PlayStation®Vita Edition! - - - 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. - - - Parche 1.04 (actualización 14) - - - SELECT - - - 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. - - - - ¿Quieres iniciar sesión en "PSN"? - - - - 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. - - - Sistema PlayStation®Vita - - - Cambiar modo de red - - - Seleccionar modo de red - - - Elige una red Ad hoc para conectar con otros sistemas PlayStation®Vita cercanos, o "PSN" para conectar con amigos de todo el mundo. - - - Red Ad hoc - - - "PSN" - - - Descargar datos de sistema PlayStation®3 - - - Cargar partida guardada a sistema PlayStation®3/PlayStation®4 - - - Carga cancelada - - - Has cancelado la carga de esta partida guardada en la zona de guardado. - - - Cargando datos: %d%% - - - Descargando datos: %d%% - - - ¿Estás seguro de que quieres cargar esta partida guardada y sobrescribir cualquier archivo de la zona de guardado? - - - Convirtiendo datos - - - Guardando - - - ¡Carga completada! - - - Error en la carga. Inténtalo más tarde. - - - ¡Descarga completada! - - - Error en la descarga. Inténtalo más tarde. - - - No ha sido posible unirse a la partida. Tipo de NAT estricta. Cambia la configuración de red. - - - 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. - - - Guardado incompleto - - - Minecraft: PlayStation®Vita Edition no tiene espacio para guardar datos. Para crear espacio, borra otras partidas guardadas de Minecraft: PlayStation®Vita Edition. + + 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 - - - Ottelu on päättynyt, koska olet kirjautunut ulos "PSN"-verkosta - - - Ei tällä hetkellä kirjautunut sisään. - - - Tässä pelissä on ominaisuuksia, joita hyödyntääksesi sinun on oltava kirjautunut "PSN"-verkkoon, mutta et ole tällä hetkellä verkossa. - - - Ad Hoc -verkko offline-tilassa. - - - 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 - - - Trophy-ongelma - - - Pääsyssä Sony Entertainment Network -tilillesi oli ongelma. Trophyasi ei voitu myöntää tällä hetkellä. + + Asetusten tallentaminen Sony Entertainment Network -tilillesi epäonnistui. Sony Entertainment Network -tilin ongelma - - Asetusten tallentaminen Sony Entertainment Network -tilillesi epäonnistui. + + Pääsyssä Sony Entertainment Network -tilillesi oli ongelma. Trophyasi ei voitu myöntää tällä hetkellä. 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? + + Yhdistä Ad Hoc -verkkoon + + + Tässä pelissä on joitakin toimintoja, jotka vaativat Ad Hoc -verkkoyhteyden, mutta olet tällä hetkellä offline-tilassa. + + + Ad Hoc -verkko offline-tilassa. + + + Trophy-ongelma + + + Ottelu on päättynyt, koska olet kirjautunut ulos "PSN"-verkosta + + + Sinut on palautettu aloitusnäyttöön, koska olet kirjautunut ulos "PSN"-verkosta + + + Järjestelmän tallennustila ei ole tarpeeksi vapaata tilaa pelitallenteen luomiseksi. + + + 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,3001 +1,894 @@  - - 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! - - - {*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*}. - - - {*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*}. - - - {*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ä. - - - {*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. - - - {*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. - - - {*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. - - - {*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ä. - - - {*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. - - - {*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. - - - {*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. - - - {*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*} - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - - Seuraava sivu - - - Edellinen sivu - - - Perusteet - - - HUD-näyttö - - - Tavaraluettelo - - - Arkut - - - Valmistaminen - - - Uuni - - + + Lataa tallennettu maailma + + + Suorita opetuspeli + + + Opetuspeli + + + Nimeä maailmasi + + + Vahingoittunut tallenne + + + OK + + + Peru + + + Minecraft-kauppa + + + Kierrä + + + Piilota + + + Tyhjennä kaikki paikat + + + Haluatko varmasti poistua nykyisestä pelistäsi ja liittyä uuteen? Kaikki tallentamaton edistyminen menetetään. + + + Haluatko varmasti korvata tämän maailman edellisen tallenteen tämän maailman nykyisellä versiolla? + + + Haluatko varmasti poistua tallentamatta? Menetät kaiken edistymisen tässä maailmassa! + + + Aloita peli + + + Poistu pelistä + + + Tallenna peli + + + Poistu tallentamatta + + + Liity peliin painamalla START + + + Hurraa – olet saanut palkinnoksi pelaajakuvan Minecraftin Stevestä! + + + Hurraa – olet saanut palkinnoksi pelaajakuvan lurkista! + + + Avaa koko peli + + + Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin uudempaa versiota. + + + Uusi maailma + + + Palkinto avattu! + + + Pelaat pelin koeversiota, mutta tarvitset koko pelin, jos haluat tallentaa pelisi. +Haluatko nyt avata koko pelin? + + + Kaverit + + + Pisteeni + + + Yhteensä + + + Ole hyvä ja odota + + + Ei tuloksia + + + Suodin: + + + Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin vanhempaa versiota. + + + Yhteys katkesi + + + Yhteys palvelimelle katkesi. Poistutaan päävalikkoon. + + + Palvelin katkaisi yhteyden + + + Poistutaan pelistä + + + On tapahtunut virhe. Poistutaan päävalikkoon. + + + Yhteyden luominen epäonnistui + + + Sinut potkaistiin pelistä + + + Istunnon järjestäjä on poistunut pelistä. + + + Et voi liittyä tähän peliin, koska et ole kenenkään siinä pelaavan kaveri. + + + Et voi liittyä tähän peliin, koska istunnon järjestäjä on aiemmin potkaissut sinut pois. + + + Sinut potkaistiin pelistä lentämisen takia + + + Yhteyden muodostaminen kesti liian pitkään + + + Palvelin on täynnä + + + 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ä! + + + Teemat + + + Ulkoasupaketit + + + Salli kaverien kaverit + + + Potkaise pelaaja + + + Haluatko varmasti potkaista tämän pelaajan pelistä? Hän ei pääse liittymään takaisin ennen kuin aloitat maailman uudestaan. + + + Pelaajakuvapaketit + + + Et voi liittyä tähän peliin, koska se on rajoitettu istunnon järjestäjän kavereille. + + + Ladattava sisältö on vioittunut + + + Tämä ladattava sisältö on vioittunut eikä sitä voi käyttää. Sinun pitää poistaa se ja asentaa se sitten uudestaan Minecraft-kaupan valikosta. + + + 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. + + + Et voi liittyä peliin + + + Valittu + + + Valittu ulkoasu: + + + Hanki täysi versio + + + Avaa tekstuuripaketti + + + Jotta voisit käyttää tätä tekstuuripakettia, sinun pitää avata se. +Haluatko avata sen nyt? + + + Tekstuurikoepaketti + + + Siemen + + + Avaa ulkoasupaketti + + + Jos haluat käyttää valitsemaasi ulkoasua, sinun pitää avata tämä paketti. +Haluaisitko avata tämän ulkoasupaketin nyt? + + + Käytät tekstuuripaketin koeversiota. Et pysty tallentamaan tätä maailmaa, ellet avaa täyttä versiota. +Haluatko avata tekstuuripaketin täyden version? + + + Lataa täysi versio + + + Tämä maailma käyttää yhdistelmäpakettia tai tekstuuripakettia, jota sinulla ei ole! +Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? + + + Hanki koeversio + + + Tekstuuripakettia ei löytynyt + + + Avaa täysi versio + + + Lataa koeversio + + + Pelitilasi on muuttunut + + + Kun tämä on valittuna, vain kutsutut pelaajat saavat liittyä. + + + Kun tämä on valittuna, kaveriluettelossasi olevien henkilöiden kaverit saavat liittyä peliin. + + + Kun tämä on käytössä, pelaajat voivat aiheuttaa vahinkoa toisille pelaajille. Toimii vain Selviytymistilassa. + + + Tavallinen + + + Täysin tasainen + + + Kun tämä on valittuna, peli pelataan verkossa. + + + Kun tämä ei ole käytössä, peliin liittyvät pelaajat eivät voi rakentaa tai louhia ilman lupaa. + + + Kun tämä on käytössä, maailmaan luodaan rakennelmia, kuten kyliä ja linnakkeita. + + + Kun tämä on käytössä, Ylämaailmaan ja Hornaan luodaan täysin tasainen maailma. + + + Kun tämä on käytössä, lähelle pelaajan syntypistettä luodaan arkku, joka sisältää muutamia hyödyllisiä esineitä. + + + Kun tämä on käytössä, tuli saattaa levitä läheisiin tulenarkoihin palikoihin. + + + Kun tämä on käytössä, dynamiitti räjähtää aktivoitaessa. + + + Kun tämä on käytössä, Horna luodaan uudelleen. Tästä on hyötyä, jos pelaat vanhempaa tallennetta, missä Hornan linnoituksia ei ollut. + + + Pois + + + Pelitila: Luova + + + Selviytyminen + + + Luova + + + Nimeä maailmasi uudelleen + + + Kirjoita uusi nimi maailmallesi + + + Pelitila: Selviytyminen + + + Luotu Selviytymistilassa + + + Nimeä tallenne uudelleen + + + Automaattitallennus: %d... + + + Päällä + + + Luotu Luovassa tilassa + + + Renderoi pilvet + + + Mitä haluat tehdä tälle pelitallenteelle? + + + HUD-näytön koko (jaettu näyttö) + + + Raaka-aine + + + Polttoaine + + Jakelulaite - - Eläinten hoitaminen - - - Eläinten kasvattaminen - - - Juomien keittäminen - - - Lumoaminen - - - Portaali Hornaan - - - Moninpeli - - - Näyttökuvien jakaminen - - - Kenttien kieltäminen - - - Luova tila - - - Järjestäjän ja pelaajan asetukset - - - Kaupankäynti - - - Alasin - - - Ääri - - - {*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. - - - Juokseminen - - - Uutta - - - {*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*} - - - - {*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*} - - - - Tekee enemmän vahinkoa kuin pelkkä käsi. - - - Käytetään kaivamaan maata, ruohoa, hiekkaa, soraa ja lunta nopeammin kuin paljain käsin. Lumipallojen kaivamiseen tarvitaan lapio. - - - Vaaditaan kivipalikoiden ja malmin louhimiseen. - - - Käytetään puupalikoiden hakkaamiseen nopeammin kuin paljain käsin. - - - Käytetään kääntämään maa- ja ruohopalikoita maanviljelyä varten. - - - Puiset ovet avataan käyttämällä niitä, lyömällä niitä tai punakivellä. - - - Rautaovet voi avata vain punakivellä, näppäimillä tai kytkimillä. - - - EI KÄYTÖSSÄ - - - EI KÄYTÖSSÄ - - - EI KÄYTÖSSÄ - - - EI KÄYTÖSSÄ - - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 4 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 8 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. - - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - - Kiiltävä harkko, josta voi tehdä tästä materiaalista valmistettuja työkaluja. Valmistetaan sulattamalla malmia uunissa. - - - Mahdollistaa harkkojen, jalokivien tai väriaineiden valmistamisen asetettaviksi palikoiksi. Voidaan käyttää kalliina rakennuspalikkana tai kätevänä malmivarastona. - - - 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. - - - - Käytetään kätevien portaiden tekemiseen. - - - Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. - - - Käytetään pitkien portaiden tekemiseen. Kaksi päällekkäin asetettua laattaa muodostavat normaalikokoisen kahden laatan palikan. - - - Käytetään luomaan valoa. Soihdut myös sulattavat lunta ja jäätä. - - - Käytetään rakennusmateriaalina ja niistä voi valmistaa monia asioita. Voidaan valmistaa minkälaisesta puusta tahansa. - - - Käytetään rakennusmateriaalina. Painovoima ei vaikuta siihen niin kuin normaaliin hiekkaan. - - - Käytetään rakennusmateriaalina. - - - Käytetään soihtujen, nuolten, kylttien, tikapuiden, aitojen sekä työkalujen ja aseiden kädensijojen valmistamiseen. - - - 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. - - - Sallii sinun valmistaa suuremman valikoiman esineitä kuin normaali valmistaminen. - - - Sallii sinun sulattaa malmia, valmistaa puuhiiltä ja lasia, sekä paistaa kaloja ja porsaankyljyksiä. - - - Sen sisään voi varastoida palikoita ja esineitä. Kahden arkun asettaminen rinnakkain luo suuremman arkun, joka kaksinkertaistaa varastotilan. - - - 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. - - - - Käytetään pystysuoraan kiipeämiseen. - - - 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. - - - Näyttää sinun tai muiden pelaajien kirjoittaman tekstin. - - - Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. - - - Käytetään aiheuttamaan räjähdyksiä. Aktivoidaan asettamisen jälkeen sytyttämällä se tuluksilla tai sähkönpurkauksella. - - - Käytetään astiana sienimuhennokselle. Voit pitää kulhon, kun muhennos on syöty. - - - Käytetään varastoimaan ja kuljettamaan vettä, laavaa ja maitoa. - - - Käytetään varastoimaan ja kuljettamaan vettä. - - - Käytetään varastoimaan ja kuljettamaan laavaa. - - - Käytetään varastoimaan ja kuljettamaan maitoa. - - - Käytetään luomaan tulta, sytyttämään dynamiitin ja avaamaan portaalin, kun se on ensin luotu. - - - Käytetään kalastamiseen. - - - Näyttää auringon ja kuun aseman. - - - Osoittaa aloituspisteeseesi. - - - Luo kuvan tutkitusta alueesta, kun sitä pitää kädessä. Sitä voi hyödyntää reittiä etsiessä. - - - Mahdollistaa hyökkäykset matkan päästä nuolilla. - - - Käytetään jousen ammuksina. - - - Palauttaa 2,5{*ICON_SHANK_01*}. - - - Palauttaa 1{*ICON_SHANK_01*}. Voidaan käyttää 6 kertaa. - - - Palauttaa 1{*ICON_SHANK_01*}. - - - Palauttaa 1{*ICON_SHANK_01*}. - - - Palauttaa 3{*ICON_SHANK_01*}. - - - Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Tämän syöminen saattaa myrkyttää sinut. - - - Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla raaka kana uunissa. - - - Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. - - - Palauttaa 4{*ICON_SHANK_01*}. - - - Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. - - - Palauttaa 4{*ICON_SHANK_01*}. Valmistetaan paistamalla porsaankyljys uunissa. - - - Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan syöttää oselotille, jotta se kesyyntyisi. - - - Palauttaa 2,5{*ICON_SHANK_01*}. Valmistetaan paistamalla raakaa kalaa uunissa. - - - Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen omenan. - - - Palauttaa 2{*ICON_SHANK_01*}, ja parantaa elinvoimaa 4 sekunnin ajan. Valmistetaan omenasta ja kultahipuista. - - - Palauttaa 2{*ICON_SHANK_01*}. Sen syöminen saattaa myrkyttää sinut. - - - Käytetään kakkureseptissä sekä taikajuomien raaka-aineena. - - - 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. - - - 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. - - - Käytetään punakivipiireissä toistimena, viivyttimenä ja/tai diodina. - - - Käytetään lähettämään sähkönpurkaus painettaessa. Pysyy aktiivisena noin sekunnin ajan ennen kuin se sammuu taas. - - - Käytetään varastoimaan ja heittämään ulos esineitä satunnaisessa järjestyksessä, kun se saa punakivilatauksen. - - - Soittaa sävelen aktivoitaessa. Iske sitä muuttaaksesi sävelkorkeutta. Tämän asettaminen eri palikoiden päälle muuttaa soittimen tyyppiä. - - - Käytetään kaivoskärryjen ohjaamiseen. - - - Kiihdyttää sen yli ajavia kaivoskärryjä saadessaan virtaa. Pysäyttää yli ajavat kaivoskärryt, kun ei saa virtaa. - - - Toimii kuin painelaatta (lähettää punakivisignaalin saadessaan virtaa), mutta sen voi aktivoida vain kaivoskärryllä. - - - Käytetään kuljettamaan sinua, eläintä tai hirviötä raiteita pitkin. - - - Käytetään kuljettamaan tavaroita raiteita pitkin. - - - Kulkee raiteita pitkin ja voi työntää muita kaivoskärryjä, jos siihen laitetaan kivihiiltä. - - - Käytetään kun tahdotaan matkustaa vedessä nopeammin kuin uimalla. - - - Kerätään lampaista ja voidaan värjätä väriaineilla. - - - Käytetään rakennusmateriaalina ja voidaan värjätä väriaineilla. Tätä reseptiä ei suositella, koska villaa saa helposti lampaista. - - - Käytetään villan värjäämiseen mustaksi. - - - Käytetään villan värjäämiseen vihreäksi. - - - Käytetään väriaineena ruskean villan värjäämisessä, keksien raaka-aineena tai kaakaopalkojen kasvattamisessa. - - - Käytetään villan värjäämiseen hopeanväriseksi. - - - Käytetään villan värjäämiseen keltaiseksi. - - - Käytetään villan värjäämiseen punaiseksi. - - - Käytetään kasvattamaan välittömästi viljelyskasveja, puita, korkeaa ruohoa, valtavia sieniä sekä kukkia, ja voidaan käyttää väriaineresepteissä. - - - Käytetään villan värjäämiseen pinkiksi. - - - Käytetään villan värjäämiseen oranssiksi. - - - Käytetään villan värjäämiseen limenvihreäksi. - - - Käytetään villan värjäämiseen harmaaksi. - - - 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.) - - - Käytetään villan värjäämiseen vaaleansiniseksi. - - - Käytetään villan värjäämiseen sinivihreäksi. - - - Käytetään villan värjäämiseen violetiksi. - - - Käytetään villan värjäämiseen magentaksi. - - - Käytetään villan värjäämiseen siniseksi. - - - Soittaa musiikkilevyjä. - - - Valmista näistä erittäin kestäviä työkaluja, aseita tai panssareita. - - - Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. - - - Käytetään kirjojen ja karttojen valmistamiseen. - - - Voidaan käyttää kirjahyllyjen valmistamiseen. Lumoamalla siitä saa valmistettua lumottuja kirjoja. - - - Mahdollistaa voimakkaampien lumousten luomisen, kun niitä asettaa lumouspöydän ympärille. - - - 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 hakulla kivihiilen keräämiseksi. - - - Voidaan louhia kivisellä tai sitä paremmalla hakulla lasuriitin keräämiseksi. - - - Voidaan louhia kivisellä tai sitä paremmalla hakulla timanttien keräämiseksi. - - - - Voidaan louhia rautaisella tai sitä paremmalla hakulla punakivipölyn keräämiseksi. - - - Voidaan louhia hakulla mukulakivien keräämiseksi. - - - Kerätään lapiolla. Voidaan käyttää rakentamiseen. - - - Voidaan istuttaa. Lopulta siitä kasvaa puu. - - - 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. - - - Kerätään lapiolla. Tuottaa toisinaan piikiveä, kun sitä kaivetaan. Painovoima vaikuttaa siihen, jos sen alla ei ole toista palikkaa. - - - 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. - - - Poltetaan savesta uunissa. - - - Voidaan polttaa tiiliksi uunissa. - - - Tiputtaa rikottaessa savipaakkuja, jotka voi polttaa tiiliksi uunissa. - - - Kätevä tapa varastoida lumipalloja. - - - Voidaan kaivaa lapiolla lumipalloiksi. - - - Tuottaa toisinaan vehnänjyviä rikottaessa. - - - Voidaan käyttää väriaineen valmistamiseen. - - - 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ä. - - - Asetetaan maahan välittämään sähkönpurkausta. Taikajuoman raaka-aineena se kasvattaa vaikutuksen kestoaikaa. - - - Täysikasvuisesta viljasta voi korjata vehnää. - - - Maata, joka on muokattu valmiiksi siemenien istuttamiseksi. - - - Voidaan paistaa uunissa vihreän väriaineen luomiseksi. - - - Voidaan valmistaa sokeriksi. - - - Voidaan pukea kypäräksi tai valmistaa kurpitsalyhdyksi soihdun kanssa. Se on lisäksi kurpitsapiirakan pääraaka-aine. - - - Palaa sytytettynä ikuisesti. - - - Hidastaa kaiken yli kävelevän liikettä. - - - 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. - - - 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! - - - Kerätään viljasta, ja siitä 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 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 hehkukiveä louhimalla. Siitä voidaan valmistaa taas hehkukivipalikoita tai käyttää taikajuoman raaka-aineena, jolloin se lisää juoman vaikutuksen tehoa. - - - 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. - - - 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. - - - 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. - - - 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. - - - Kuin ovi, mutta käytetään pääasiassa aitojen kanssa. - - - Voidaan valmistaa meloniviipaleista. - - - Läpinäkyviä palikoita, joita voi käyttää lasipalikoiden sijasta. - - - Voidaan istuttaa kurpitsojen kasvattamiseksi. - - - 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 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. - - - Kasvaa ajan mittaan, kun sen asettaa. Voidaan kerätä keritsimillä. Sitä voi kiivetä kuin tikapuita. - - - 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ä. - - - 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. - - - Voi olla monenlaisia vaikutuksia, riippuen siitä, mihin sitä käytetään. - - - 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. - - - 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. - - - Voidaan täyttää vedellä vesiämpärin tai sateen avulla, minkä jälkeen siitä voi täyttää lasipulloja vedellä. - - - 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. - - - Kelluu vedessä ja sen päällä voi kävellä. - - - Käytetään Hornan linnoitusten rakentamiseen. Immuuni hornanhenkien tulipalloille. - - - Käytetään Hornan linnoituksissa. - - - Löytyy Hornan linnoituksista, ja pudottaa rikottaessa hornapahkan. - - - 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. - - - 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ä. - - - Hyödyllinen sytytettäessä asioita tuleen, tai asioiden satunnaiseen sytyttämiseen ammuttuna jakelulaitteesta. - - - 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. - - - 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. - - - Voidaan kasvattaa kaakaopapujen keräämiseksi. - - - Olentojen päitä voi asettaa koristeiksi tai pitää naamiona kypäräpaikassa. - - - Mustekala - - - Tiputtaa mustepussin tapettaessa. - - - Lehmä - - - Tiputtaa nahkaa tapettaessa. Voidaan myös lypsää ämpärin kanssa. - - - Lammas - - - Tiputtaa villaa kerittäessä (ellei sitä ole jo keritty). Voidaan värjätä, jolloin sen villasta tulee eriväristä. - - - Kana - - - Tiputtaa höyheniä tapettaessa, sekä munii toisinaan munia. - - - Sika - - - 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. - - - Lurkki - - - Räjähtää, jos menet liian lähelle! - - - Luuranko - - - Ampuu sinua nuolilla. Tiputtaa nuolia tapettaessa. - - - Hämähäkki - - - Hyökkää kimppuusi, jos menet sen lähelle. Osaa kiivetä seinillä. Tiputtaa siimaa tapettaessa. - - - Zombi - - - Hyökkää kimppuusi, jos menet sen lähelle. - - - Sikamieszombi - - - Aluksi rauhallinen, mutta puolustautuu laumana jos hyökkäät yhden kimppuun. - - - Hornanhenki - - - Ampuu sinua liekehtivillä palloilla, jotka räjähtävät osuessaan. - - - Lima - - - Jakautuu pienemmiksi limoiksi, kun sitä vahingoitetaan. - - - Ääreläinen - - - 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. - - - Luolahämähäkki - - - Myrkyllinen purema. - - - Sienilehmä - - - Tuottaa sienimuhennosta, jos sitä käytetään kulhon kanssa. Tiputtaa sieniä ja muuttuu normaaliksi lehmäksi, jos sen keritsee. - - - Lumigolemi - - - Pelaaja voi luoda lumigolemin lumipalikoista ja kurpitsasta. Ne viskovat lumipalloilla luojansa vihollisia. - - - Äärilisko - - - Suuri musta lohikäärme, joka löytyy Äärestä. - - - Roihu - - - Vihollinen, joita löytää Hornasta, yleensä Hornan linnoitusten sisältä. Tiputtaa tapettaessa roihusauvoja. - - - Magmakuutio - - - Löytyy Hornasta. Limojen tapaan sekin jakautuu pienemmiksi samanlaisiksi tapettaessa. - - - Kyläläinen - - - Oselotti - - - 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. - - - Räjähdysanimaattori - - - Luonnostaiteilijat - - - Numeroiden rouskutus ja statistiikka - - - Komenteleva koordinaattori - - - Alkuperäinen suunnittelu ja koodaus: - - - Projektinjohtaja/tuottaja - - - Muut Mojangin työntekijät - - - Minecraft PC:n johtava peliohjelmoija - - - Koodarininja - - - Toimitusjohtaja - - - Valkokaulustyöläinen - - - Asiakastuki - - - Toimiston DJ - - - Suunnittelija/ohjelmoija – Minecraftin taskuversio - - - Kehittäjä - - - Pääarkkitehti - - - Taidekehittäjä - - - Pelin luoja - - - Hauskuuden ohjaaja - - - Musiikki ja äänet - - - Ohjelmointi - - - Taide - - - Laadunvalvonta - - - Vastaava tuottaja - - - Päätuottaja - - - Tuottaja - - - Testauksen johtaja - - - Päätestaaja - - - Suunnitteluryhmä - - - Kehitysryhmä - - - Julkaisunhallinta - - - Johtaja, XBLA-julkaisu - - - Liiketoiminnan kehittäminen - - - Portfolion johtaja - - - Tuotantopäällikkö - - - Markkinointi - - - Yhteisöpäällikkö - - - Euroopan lokalisointiryhmä - - - Redmondin lokalisointiryhmä - - - Aasian lokalisointiryhmä - - - Käyttäjätutkimusryhmä - - - MGS Central -ryhmät - - - Virstanpylväiden kelpoisuustestaaja - - - Erityiskiitokset - - - Testauspäällikkö - - - Vanhempi johtava testaaja - - - Ohjelmiston laadunvalvonta - - - Projektin järjestelmätestaus - - - Järjestelmän lisätestaus - - - Avustavat testaajat - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Puumiekka - - - Kivimiekka - - - Rautamiekka - - - Timanttimiekka - - - Kultamiekka - - - Puulapio - - - Kivilapio - - - Rautalapio - - - Timanttilapio - - - Kultalapio - - - Puuhakku - - - Kivihakku - - - Rautahakku - - - Timanttihakku - - - Kultahakku - - - Puukirves - - - Kivikirves - - - Rautakirves - - - Timanttikirves - - - Kultakirves - - - Puukuokka - - - Kivikuokka - - - Rautakuokka - - - Timanttikuokka - - - Kultakuokka - - - Puuovi - - - Rautaovi - - - Rengaspanssarin kypärä - - - Rengasrintapanssari - - - Rengaspanssarin housut - - - Rengaspanssarin saappaat - - - Nahkalakki - - - Rautakypärä - - - Timanttikypärä - - - Kultakypärä - - - Nahkatunika - - - Rautarintapanssari - - - Timanttirintapanssari - - - Kultarintapanssari - - - Nahkahousut - - - Rautahousut - - - Timanttihousut - - - Kultahousut - - - Nahkasaappaat - - - Rautasaappaat - - - Timanttisaappaat - - - Kultasaappaat - - - Rautaharkko - - - Kultaharkko - - - Ämpäri - - - Vesiämpäri - - - Laavaämpäri - - - Tulukset - - - Omena - - - Jousi - - - Nuoli - - - Kivihiili - - - Puuhiili - - - Timantti - - - Keppi - - - Kulho - - - Sienimuhennos - - - Siima - - - Höyhen - - - Ruuti - - - Vehnänjyviä - - - Vehnä - - - Leipä - - - Piikivi - - - Raaka porsaankyljys - - - Paistettu porsaankyljys - - - Maalaus - - - Kultainen omena - - - Kyltti - - - Kaivoskärry - - - Satula - - - Punakivi - - - Lumipallo - - - Vene - - - Nahka - - - Maitoämpäri - - - Tiili - - - Savi - - - Sokeriruo'ot - - - Paperi - - - Kirja - - - Limapallo - - - Kaivoskärry ja arkku - - - Kaivoskärry ja uuni - - - Muna - - - Kompassi - - - Onkivapa - - - Kello - - - Hehkukivipöly - - - Raaka kala - - - Paistettu kala - - - Värijauhe - - - Mustepussi - - - Punainen väriaine - - - Kaktuksenvihreä väriaine - - - Kaakaopavun ruskea väriaine - - - Sininen väriaine - - - Violetti väriaine - - - Sinivihreä väriaine - - - Vaaleanharmaa väriaine - - - Harmaa väriaine - - - Pinkki väriaine - - - Limenvihreä väriaine - - - Keltainen väriaine - - - Vaaleansininen väriaine - - - Magenta väriaine - - - Oranssi väriaine - - - Luunvalkoinen väriaine - - - Luu - - - Sokeri - - - Kakku - - - Sänky - - - Punakivitoistin - - - Keksi - - - Kartta - - - Musiikkilevy - "13" - - - Musiikkilevy - "cat" - - - Musiikkilevy - "blocks" - - - Musiikkilevy - "chirp" - - - Musiikkilevy - "far" - - - Musiikkilevy - "mall" - - - Musiikkilevy - "mellohi" - - - Musiikkilevy - "stal" - - - Musiikkilevy - "strad" - - - Musiikkilevy - "ward" - - - Musiikkilevy - "11" - - - Musiikkilevy - "where are we now" - - - Keritsimet - - - Kurpitsansiemenet - - - Meloninsiemenet - - - Raaka kana - - - Paistettu kana - - - Raaka pihvi - - - Paistettu pihvi - - - Mätä liha - - - Äärenhelmi - - - Meloninviipale - - - Roihutanko - - - Hornanhengen kyynel - - - Kultahippu - - - Hornapahka - - - {*splash*}{*prefix*}juoma{*postfix*} - - - Lasipullo - - - Vesipullo - - - Hämähäkin silmä - - - Pilaantunut silmä - - - Roihujauhe - - - Magmavoide - - - Keittoteline - - - Pata - - - Ääreläisensilmä - - - Kimalteleva meloni - - - Lumouspullo - - - Tulilataus - - - Tulilataus (puuhiili) - - - Tulilataus (kivihiili) - - - Kehys - - - Luo: {*CREATURE*} - - - Hornatiili - - - Pääkallo - - - Luurangon pääkallo - - - Näivettäjäluurangon pääkallo - - - Zombin pää - - - Pää - - - Pää (%s) - - - Lurkin pää - - - Kivi - - - Ruohopalikka - - - Maa - - - Mukulakivi - - - Tammipuulankut - - - Kuusipuulankut - - - Koivupuulankut - - - Viidakkopuulankut - - - Taimi - - - Tammen taimi - - - Kuusen taimi - - - Koivun taimi - - - Viidakkopuun taimi - - - Peruskallio - - - Vesi - - - Laava - - - Hiekka - - - Hiekkakivi - - - Sora - - - Kultamalmi - - - Rautamalmi - - - Kivihiilimalmi - - - Puu - - - Tammipuu - - - Kuusipuu - - - Koivupuu - - - Viidakkopuu - - - Tammi - - - Kuusi - - - Koivu - - - Lehdet - - - Tammenlehdet - - - Kuusenhavut - - - Koivunlehdet - - - Viidakkopuunlehdet - - - Pesusieni - - - Lasi - - - Villa - - - Musta villa - - - Punainen villa - - - Vihreä villa - - - Ruskea villa - - - Sininen villa - - - Violetti villa - - - Sinivihreä villa - - - Vaaleanharmaa villa - - - Harmaa villa - - - Pinkki villa - - - Limenvihreä villa - - - Keltainen villa - - - Vaaleansininen villa - - - Magenta villa - - - Oranssi villa - - - Valkoinen villa - - - Kukka - - - Ruusu - - - Sieni - - - Kultapalikka - - - Kätevä tapa säilyttää kultaa. - - - Rautapalikka - - - Kätevä tapa säilyttää rautaa. - - - Kivilaatta - - - Kivilaatta - - - Hiekkakivilaatta - - - Tammipuulaatta - - - Mukulakivilaatta - - - Tiililaatta - - - Kivitiililaatta - - - Tammipuulaatta - - - Kuusipuulaatta - - - Koivupuulaatta - - - Viidakkopuulaatta - - - Hornatiililaatta - - - Tiili - - - Dynamiitti - - - Kirjahylly - - - Sammalkivi - - - Laavakivi - - - Soihtu - - - Soihtu (kivihiili) - - - Soihtu (puuhiili) - - - Tuli - - - Hirviönluoja - - - Tammipuuportaat - - + Arkku - - Punakivipöly + + Lumoa - - Timanttimalmi - - - Timanttipalikka - - - Kätevä tapa säilyttää timantteja. - - - Työpöytä - - - Viljelyskasvit - - - Viljelysmaa - - + Uuni - - Kyltti + + Tämän tyyppistä ladattavaa sisältöä ei ole juuri nyt saatavilla tälle pelille. - - Puuovi + + Haluatko varmasti poistaa tämän pelitallenteen? - - Tikkaat + + Odottaa hyväksyntää - - Raide + + Sensuroitu - - Sähköraide + + %s on liittynyt peliin. - - Paljastinraide + + %s on poistunut pelistä. - - Kiviportaat + + %s potkaistiin pelistä. - - Vipu - - - Painelaatta - - - Rautaovi - - - Punakivimalmi - - - Punakivisoihtu - - - Näppäin - - - Lumi - - - Jää - - - Kaktus - - - Savi - - - Sokeriruoko - - - Jukeboksi - - - Aita - - - Kurpitsa - - - Kurpitsalyhty - - - Hornakivi - - - Sieluhiekka - - - Hehkukivi - - - Portaali - - - Lasuriittimalmi - - - Lasuriittipalikka - - - Kätevä tapa säilyttää lasuriittia. - - - Jakelulaite - - - Sävelpalikka - - - Kakku - - - Sänky - - - Verkko - - - Korkea ruoho - - - Kuollut pensas - - - Diodi - - - Lukittu arkku - - - Lattialuukku - - - Villa (minkä värinen tahansa) - - - Mäntä - - - Tarttumamäntä - - - Sokeritoukkapalikka - - - Kiviiilet - - - Sammaleiset kivitiilet - - - Halkeilleet kivitiilet - - - Veistetyt kivitiilet - - - Sieni - - - Sieni - - - Rautatangot - - - Lasilevy - - - Meloni - - - Kurpitsan varsi - - - Melonin varsi - - - Köynnökset - - - Aidan portti - - - Tiiliportaat - - - Kivitiiliportaat - - - Sokeritoukkakivi - - - Sokeritoukkamukulakivi - - - Sokeritoukkakivitiili - - - Sienirihma - - - Lumpeenlehti - - - Hornatiili - - - Hornatiiliaita - - - Hornatiiliportaat - - - Hornapahka - - - Lumouspöytä - - + Keittoteline - - Pata + + Kirjoita kyltin teksti - - Ääriportaali + + Kirjoita teksti kylttiisi - - Ääriportaalin kehys + + Kirjoita otsikko - - Äärikivi + + Koepeli on päättynyt - - Lohikäärmeen muna + + Peli on täynnä - - Puska + + Ei voitu liittyä peliin, koska tilaa ei ole - - Saniainen + + Kirjoita viestisi otsikko - - Hiekkakiviportaat + + Kirjoita viestisi kuvaus - - Kuusipuuportaat - - - Koivupuuportaat - - - Viidakkopuuportaat - - - Punakivilamppu - - - Kaakao - - - Pääkallo - - - Nykyinen ohjaus - - - Malli - - - Liiku/juokse - - - Katso - - - Tauota - - - Hyppää - - - Hyppää/lennä ylös - - + Tavaraluettelo - - Selaa käden esinettä + + Raaka-aineet - - Toiminto + + Kirjoita kuvateksti - - Käytä + + Kirjoita viestisi kuvateksti - - Valmistaminen + + Kirjoita kuvaus - - Tiputa + + Tällä hetkellä soi: - - Hiivi + + Haluatko varmasti lisätä tämän kentän kiellettyjen kenttien luetteloosi? +Jos valitset OK, poistut samalla tästä pelistä. - - Hiivi/lennä alas + + Poista Kiellettyjen luettelosta - - Vaihda kameratilaa + + Automaattitallennuksen väli - - Pelaajat/kutsu + + Kielletty kenttä - - Liikkuminen (lentäessä) + + Peli, johon olet liittymässä, on kiellettyjen kenttien luettelossasi. +Jos päätät liittyä tähän peliin, kenttä poistetaan kiellettyjen kenttien luettelostasi. - - Malli 1 + + Kielletäänkö tämä kenttä? - - Malli 2 + + Automaattitallennuksen väli: POIS - - Malli 3 + + Käyttöliittymän läpinäkymättömyys - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Valmistaudutaan kentän automaattitallennukseen - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + HUD-näytön koko - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + minuuttia - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Ei voida asettaa tähän! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Laavan asettamista lähelle kentän syntypistettä ei sallita, koska muutoin pelaajat saattavat kuolla heti synnyttyään uudestaan. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Suosikkiulkoasut - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Pelaajan %s peli - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Tuntemattoman istunnon järjestäjän peli - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Vieras on kirjautunut ulos - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Nollaa asetukset - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Haluatko varmasti nollata asetuksesi niiden oletusarvoihin? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Latausvirhe - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Vieraileva pelaaja on kirjautunut ulos, minkä johdosta kaikki vierailevat pelaajat poistettiin pelistä. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Pelin luominen ei onnistunut - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Automaattisesti valittu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Ei pakettia: oletusulkoasut - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Kirjaudu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Et ole kirjautunut. Sinun pitää olla kirjautunut pelataksesi tätä peliä. Haluatko kirjautua nyt? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Moninpeli ei ole sallittu - - <![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;]]> + + Juo - - {*B*}Paina{*CONTROLLER_VK_A*} jatkaaksesi. - - - {*B*}Paina{*CONTROLLER_VK_A*} aloittaaksesi opetuspelin.{*B*} - Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. - - - Minecraft on peli, missä palikoita asettamalla voi rakentaa mitä tahansa kuvitteleekin. -Öisin hirviöt tulevat esiin, joten rakenna itsellesi suoja ennen kuin niin tapahtuu. - - - Katso ylös, alas ja ympärillesi painamalla{*CONTROLLER_ACTION_LOOK*}. - - - Liiku painamalla{*CONTROLLER_ACTION_MOVE*}. - - - 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. - - - Hyppää painamalla{*CONTROLLER_ACTION_JUMP*}. - - - 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... - - - 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. - - - Avaa valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. - - - Kun keräät ja valmistat lisää esineitä, tavaraluettelosi täyttyy.{*B*} - Avaa tavaraluettelo painamalla{*CONTROLLER_ACTION_INVENTORY*}. - - - 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. - - - Jos menetät elinvoimaa, mutta ruokapalkissasi on 9{*ICON_SHANK_01*} tai enemmän, elinvoimasi paranee automaattisesti. Ruuan syöminen palauttaa ruokapalkkia. - - - 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ä. - - - Ruokapalkkisi on alhainen, ja olet menettänyt elinvoimaa. Palauta ruokapalkkiasi ja ala parantua syömällä paistettu pihvi tavaraluettelostasi.{*ICON*}364{*/ICON*} - - - Keräämästäsi puusta voi valmistaa lankkuja. Avaa valmistusvalikko tehdäksesi niin.{*PlanksIcon*} - - - Usein valmistaminen vaatii useita vaiheita. Nyt kun sinulla on lankkuja, voit tehdä enemmän esineitä. Valmista työpöytä.{*CraftingTableIcon*} - - - Jotta saisit nopeutettua palikoiden keräämistä, voit valmistaa tarkoitukseen sopivia työkaluja. Joissain työkaluissa on kepeistä valmistettu kädensija. Valmista nyt keppejä.{*SticksIcon*} - - - Vaihda kädessäsi pitämää esinettä painamalla{*CONTROLLER_ACTION_LEFT_SCROLL*} tai{*CONTROLLER_ACTION_RIGHT_SCROLL*}. - - - Käytä esineitä, vuorovaikuta ja aseta joitain esineitä painamalla{*CONTROLLER_ACTION_USE*}. Asetetut esineet voi poimia uudestaan louhimalla ne oikealla työkalulla. - - - Kun työpöytä on valittuna, vie osoitin haluamaasi kohtaan ja aseta työpöytä siihen painamalla{*CONTROLLER_ACTION_USE*}. - - - Avaa työpöytä siirtämällä osoitin sen kohdalle ja painamalla{*CONTROLLER_ACTION_USE*}. - - - 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*} - - - 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*} - - - 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*} - - - Avaa säilytysastia - - - 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. - - - Lähistöllä on hylätty kaivosmiehen mökki, jonka saat korjattua turvalliseksi yöpaikaksi. - - - 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. - - - 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*} - - - Olet kerännyt tarpeeksi mukulakiviä uunin rakentamiseksi. Rakenna sellainen työpöydälläsi. - - - Aseta uuni maailmaan painamalla{*CONTROLLER_ACTION_USE*}, ja avaa se sitten. - - - Valmista uunin avulla puuhiiltä. Odotellessasi puuhiilen valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? - - - Valmista uunin avulla lasia. Odotellessasi lasin valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? - - - 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*} - - - Aseta ovi painamalla{*CONTROLLER_ACTION_USE*}. Maailmassa olevan oven voi avata ja sulkea painamalla{*CONTROLLER_ACTION_USE*}. - - - Öisin saattaa tulla erittäin pimeää, joten suojapaikkaasi kannattaa laittaa valaistusta, jotta näet ympärillesi. Valmista nyt soihtu kepeistä ja puuhiilestä valmistusvalikossa.{*TorchIcon*} - - + - Olet suorittanut opetuspelin ensimmäisen osan. - + Tälle alueelle on perustettu maatila. Viljelemällä maata saat luotua uudistuvan lähteen ruualle ja muille esineille. - + {*B*} - Paina{*CONTROLLER_VK_A*} jatkaaksesi opetuspeliä.{*B*} - Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. + Opettele lisää maanviljelystä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi maanviljelystä, paina{*CONTROLLER_VK_B*}. + + + 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. + + + Avaa luova valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. + + + Mene tämän aukon vastakkaiselle puolelle jatkaaksesi. + + + Nyt olet suorittanut Luovan tilan opetuspelin. + + + 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. + + + 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*} + + + 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*} + + + Luujauholla voi kasvattaa viljelyskasvit täysikokoisiksi, tai sienet valtaviksi sieniksi.{*ICON*}351:15{*/ICON*} + + + Vehnä käy läpi useita vaiheita kasvaessaan ja se on valmis korjattavaksi, kun sen väri tummenee.{*ICON*}59:7{*/ICON*} + + + Kurpitsat ja melonit vaativat istutetun siemenen viereen lisäksi palikan, johon kasvis voi kasvaa, kun sen varsi on täysikokoinen. + + + 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*} + + + 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ää. + + + + 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. + + + + Tällä alueella on portaali Hornaan! + + + + {*B*} + Opettele lisää portaaleista ja Hornasta painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi portaaleista ja Hornasta, paina{*CONTROLLER_VK_B*}. + + + 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*} + + + Punakivitoistimilla pystyy pidentämään matkaa, jonka virta kulkee, tai asettaa piiriin viiveen. + {*ICON*}356{*/ICON*} + + + 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*} + + + + Portaaleja valmistetaan asettamalla laavakivipalikoita kehykseksi, joka on neljän palikan levyinen ja viiden palikan korkuinen. Kulmapalikoita ei tarvita. + + + + Hornan kautta pystyy matkustamaan nopeasti Ylämaailmassa. Yhden palikan kulkeminen Hornassa vastaa 3 palikan kulkemista Ylämaailmassa. + + + + Nyt olet Luovassa tilassa. + + + + {*B*} + Opettele lisää Luovasta tilasta{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi Luovasta tilasta, paina{*CONTROLLER_VK_B*}. + + + + 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ä. - - 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ä. - - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää tavaraluetteloa, paina{*CONTROLLER_VK_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*}, voit poimia puolet niistä. - - - 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*}. - - - Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen. - - + - Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_VK_BACK*}. + Kun haluat käyttää portaalia Hornaan, seiso sen sisällä. Näyttö muuttuu violetiksi ja kuulet äänen. Muutaman sekunnin kuluttua siirryt toiseen ulottuvuuteen. - + - Poistu nyt tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. + 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. - + + Nyt olet suorittanut maanviljelyn opetuspelin. + + + Eri työkalut toimivat paremmin eri materiaaleihin. Käytä kirvestä puunrunkojen hakkaamiseen. + + + 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. + + + Jotkin työkalut sopivat paremmin vihollisten kimppuun hyökkäämiseen. Miekkaa kannattaa käyttää hyökkäämiseen. + + + 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. + + + Et voi poistua tältä alueelta ennen kuin olet suorittanut opetuspelin. + + + Eri työkalut toimivat paremmin eri materiaaleihin. Käytä lapiota pehmeiden materiaalien, kuten maan ja hiekan louhimiseen. + + + 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... + + + 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*}. + + + Arkussa lammen rannalla on onki. Ota onki arkusta ja laita se käteesi, niin voit käyttää sitä. + + + 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ää. + + + 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. + + + Ui ylöspäin pitämällä{*CONTROLLER_ACTION_JUMP*} painettuna. + + + 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*}. + + + Rautagolemit luodaan pinoamalla neljä rautapalikkaa kuvan osoittamalla tavalla, ja laittamalla kurpitsa keskimmäisen palikan päälle. Rautagolemit hyökkäävät vihollistesi kimppuun. + + + 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. + + + 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. + + + Eläin ei voi siirtyä uudestaan Rakkaustilaan ennen kuin noin 5 minuutin päästä. + + - 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. + Tällä alueella eläimet ovat aitauksessa. Voit kasvattaa eläimiä ja saada ne tuottamaan poikasia. - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää Luovan tilan tavaraluetteloa, paina{*CONTROLLER_VK_B*}. - - - 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*}. - - + -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. + {*B*} + Opettele lisää eläinten kasvattamisesta{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi eläinten kasvattamisesta, paina{*CONTROLLER_VK_B*}. - - Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen maailmaan. Jos haluat poistaa kaikki esineet pikavalintapalkista, paina{*CONTROLLER_VK_X*}. + + Jotta saisit eläimet lisääntymään, sinun pitää syöttää niille oikeaa ruokaa, jolloin ne siirtyvät "Rakkaustilaan". - - Selaa yläreunan Ryhmätyyppivälilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*}, niin voit valita, minkä esineryhmän esineitä haluat poimia. + + 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*} - + - Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_VK_BACK*}. + {*B*} + Opettele lisää golemeista{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi golemeista, paina{*CONTROLLER_VK_B*}. - - Poistu nyt Luovan tilan tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. + + Golemeja luodaan asettamalla kurpitsa palikkapinon päälle. - + + Lumigolemit luodaan laittamalla kaksi lumipalikkaa päällekkäin, ja niiden päälle kurpitsa. Lumigolemit viskovat vihollisiasi lumipalloilla. + + + 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. + + + Nyt olet suorittanut eläinten kasvattamisen opetuspelin. + + -Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiäsi esineitä uusiksi esineiksi. + Tällä alueella on kurpitsoja ja palikoita, joista voi tehdä lumigolemin ja rautagolemin. - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo valmistaa esineitä, paina{*CONTROLLER_VK_B*}. - - - {*B*} - Avaa esineen kuvaus painamalla{*CONTROLLER_VK_X*}. - - - {*B*} - Näytä valitun esineen valmistamiseksi vaaditut raaka-aineet painamalla{*CONTROLLER_VK_X*}. - - - {*B*} - Näytä tavaraluettelo uudestaan painamalla{*CONTROLLER_VK_X*}. - - - 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*}. - - - Valmistusalueella näkyvät esineet, joita tarvitaan uuden esineen valmistamiseksi. Valmista esine painamalla{*CONTROLLER_VK_A*} ja aseta se tavaraluetteloosi. - - + - 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ä. + 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ä. - + - 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. + Jos pata tyhjenee, sen voi täyttää uudestaan vesiämpärillä. - + - Parhaillaan valittuna olevan esineen kuvaus näkyy tässä. Kuvauksesta pystyy päättelemään, mihin esinettä kenties voi käyttää. + Valmista tulenkestojuoma keittotelinettä käyttäen. Tarvitset vesipullon, hornapahkan ja magmavoidetta. - - - Valittuna olevan esineen valmistamiseksi vaaditut raaka-aineet näkyvät tässä. - - - Keräämästäsi puusta voi valmistaa lankkuja. Valitse lankkukuvake ja valmista niitä painamalla{*CONTROLLER_VK_A*}.{*PlanksIcon*} - - - - 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*}. - - - - Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse työkalut.{*ToolsIcon*} - - - - Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse rakennukset.{*StructuresIcon*} - - - - Vaihda esinettä, jonka tahdot valmistaa, painamalla{*CONTROLLER_MENU_NAVIGATE*}. Joistain esineistä voi tehdä eri versioita riippuen käytetyistä materiaaleista. Valitse puulapio.{*WoodenShovelIcon*} - - - - 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*} - - - - 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*}. - - - - Joitain esineitä ei voi valmistaa työpöydällä, vaan niihin tarvitaan uuni. Valmista nyt uuni.{*FurnaceIcon*} - - - - Aseta valmistamasi uuni maailmaan. Se kannattaa asettaa sisälle suojapaikkaasi.{*B*} - Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. - - - - Tämä on uunivalikko. Uunin avulla saat muutettua esineitä kuumentamalla niitä. Uunilla pystyt esimerkiksi muuttamaan rautamalmia rautaharkoiksi. - - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää uunia, paina{*CONTROLLER_VK_B*}. - - - - 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. - - - - Monia puuesineitä voidaan käyttää polttoaineena, mutta kaikki eivät pala yhtä kauan. Saatat myös löytää maailmasta muita polttoaineita. - - - - Kun esineesi on kuumennettu, voit siirtää ne tuottoalueelta tavaraluetteloosi. Kannattaa kokeilla, mitä pystyt valmistamaan eri raaka-aineista. - - - - 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. - - - - Puuhiiltä voi käyttää polttoaineena, tai yhdessä kepin kanssa siitä pystyy valmistamaan soihdun. - - - - Kun raaka-ainepaikkaan asetetaan hiekkaa, siitä voi valmistaa lasia. Valmista pari lasipalikkaa, joista saat ikkunat suojapaikkaasi. - - - - Tämä on keittovalikko. Täällä voit luoda juomia, joilla on erilaisia vaikutuksia. - - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää keittotelinettä, paina{*CONTROLLER_VK_B*}. - - - - 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ä. - - - - 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. - - - - Kun sinulla on juoma, voit muokata sen vaikutuksia. Punakivipölyn lisääminen kasvattaa vaikutuksen kestoa ja hehkukivipölyä lisäämällä juomasta saa tehokkaamman. - - - - 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. - - - - Luo tulenkestojuoma lisäämällä ensin vesipulloon hornapahka ja sen jälkeen magmavoidetta. - - - - Poistu nyt keittovalikosta painamalla{*CONTROLLER_VK_B*}. - - - - Tältä alueelta löytyvät keittoteline, pata sekä arkku täynnä keittämiseen tarvittavia esineitä. + + 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. {*B*} @@ -3009,22 +902,22 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä Voit täyttää lasipullon padasta, jossa on vettä, tai vesipalikasta. Täytä nyt lasipullo osoittamalla vesilähdettä ja painamalla{*CONTROLLER_ACTION_USE*}. - - - - Jos pata tyhjenee, sen voi täyttää uudestaan vesiämpärillä. - - - - Valmista tulenkestojuoma keittotelinettä käyttäen. Tarvitset vesipullon, hornapahkan ja magmavoidetta. - - - 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. Käytä tulenkestojuomaa itseesi. + + + + 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. + + + + Kun lumouspaikkaan asetetaan esine, oikealla olevissa painikkeissa näkyy valikoima satunnaisia lumouksia. + + + + Painikkeen numero kertoo, miten paljon kokemuspisteitä kyseisen lumouksen tekeminen vaatii. Jos kokemustasosi ei ole tarpeeksi korkea, painiketta ei voi painaa. @@ -3039,83 +932,81 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä Opettele lisää lumousvalikon käyttämistä{*CONTROLLER_VK_A*}.{*B*} Jos osaat jo käyttää lumousvalikkoa, paina{*CONTROLLER_VK_B*}. - + - 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. + Tältä alueelta löytyvät keittoteline, pata sekä arkku täynnä keittämiseen tarvittavia esineitä. - + - Kun lumouspaikkaan asetetaan esine, oikealla olevissa painikkeissa näkyy valikoima satunnaisia lumouksia. + Puuhiiltä voi käyttää polttoaineena, tai yhdessä kepin kanssa siitä pystyy valmistamaan soihdun. - + - Painikkeen numero kertoo, miten paljon kokemuspisteitä kyseisen lumouksen tekeminen vaatii. Jos kokemustasosi ei ole tarpeeksi korkea, painiketta ei voi painaa. + Kun raaka-ainepaikkaan asetetaan hiekkaa, siitä voi valmistaa lasia. Valmista pari lasipalikkaa, joista saat ikkunat suojapaikkaasi. + + + + Tämä on keittovalikko. Täällä voit luoda juomia, joilla on erilaisia vaikutuksia. + + + + Monia puuesineitä voidaan käyttää polttoaineena, mutta kaikki eivät pala yhtä kauan. Saatat myös löytää maailmasta muita polttoaineita. + + + + Kun esineesi on kuumennettu, voit siirtää ne tuottoalueelta tavaraluetteloosi. Kannattaa kokeilla, mitä pystyt valmistamaan eri raaka-aineista. + + + + 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. + + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää keittotelinettä, paina{*CONTROLLER_VK_B*}. + + + + 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. + + + + Luo tulenkestojuoma lisäämällä ensin vesipulloon hornapahka ja sen jälkeen magmavoidetta. + + + + Poistu nyt keittovalikosta painamalla{*CONTROLLER_VK_B*}. + + + + 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ä. + + + + 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. + + + + Kun sinulla on juoma, voit muokata sen vaikutuksia. Punakivipölyn lisääminen kasvattaa vaikutuksen kestoa ja hehkukivipölyä lisäämällä juomasta saa tehokkaamman. Lumoa esine valitsemalla lumous ja painamalla{*CONTROLLER_VK_A*}. Silloin kokemuspisteistäsi vähennetään lumouksen hinta. - + - 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. + Heitä siima veteen ja ala kalastaa painamalla{*CONTROLLER_ACTION_USE*}. Kelaa siimaa painamalla{*CONTROLLER_ACTION_USE*} uudestaan. + {*FishingRodIcon*} - + - Tällä alueella on lumouspöytä ja muutamia muita esineitä, joiden avulla opit tekemään lumouksia. + 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*} - - {*B*} - Opettele lisää lumouksista{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi lumouksista, paina{*CONTROLLER_VK_B*}. - - + - Lumouspöydän avulla pystyt lisäämään aseisiin, panssareihin ja joihinkin työkaluihin erikoisvaikutuksia, kuten useamman esineen tuottaminen palikkaa louhiessa tai parannettu vastustuskyky. - - - - Kirjahyllyjen asettaminen lumouspöydän ympärille lisää sen tehoa ja pääset käsiksi korkeamman tason lumouksiin. - - - - 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. - - - - Kokemuspisteitä saa myös lumouspullolla, joka luo kokemuskuulia laskeutumispaikkaansa, kun sen heittää. Luodut kuulat voi sitten kerätä talteen. - - - - Tällä alueella löydät arkuista joitain lumottuja esineitä, lumouspulloja ja muutamia esineitä, joita voit lumota opetellaksesi käyttämään lumouspöytää. - - - - Kuljet nyt kaivoskärryllä. Jos haluat poistua kaivoskärrystä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Opettele lisää kaivoskärryistä{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi kaivoskärryistä, paina{*CONTROLLER_VK_B*}. - - - - Kaivoskärry kulkee raiteilla. Uunilla voit myös valmistaa moottoroidun kaivoskärryn sekä kaivoskärryn, jossa on arkku. - {*RailIcon*} - - - - 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*} - - - - Purjehdit nyt veneellä. Jos haluat poistua veneestä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - - {*B*} - Opettele lisää veneistä{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi veneistä, paina{*CONTROLLER_VK_B*}. + 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*} @@ -3132,25 +1023,24 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä {*B*} Opettele lisää kalastamisesta{*CONTROLLER_VK_A*}.{*B*} Jos tiedät jo tarpeeksi kalastamisesta, paina{*CONTROLLER_VK_B*}. - - - - Heitä siima veteen ja ala kalastaa painamalla{*CONTROLLER_ACTION_USE*}. Kelaa siimaa painamalla{*CONTROLLER_ACTION_USE*} uudestaan. - {*FishingRodIcon*} - - - - 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*} - - - - 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*} 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*} + + + + Tällä alueella on muutamia yksinkertaisia punakivi- ja mäntäpiirejä, sekä arkku, josta löytyy piirien laajentamiseen tarvittavia esineitä. + + + + {*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*}. + + + + 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ä. @@ -3168,222 +1058,290 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä Jos pelissäsi on muita pelaajia ja haluatte nukkua, kaikkien on oltava sängyssä samaan aikaan. {*ICON*}355{*/ICON*} - - - Tällä alueella on muutamia yksinkertaisia punakivi- ja mäntäpiirejä, sekä arkku, josta löytyy piirien laajentamiseen tarvittavia esineitä. - - + {*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*}. + Opettele lisää veneistä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi veneistä, paina{*CONTROLLER_VK_B*}. - + - 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ä. + Lumouspöydän avulla pystyt lisäämään aseisiin, panssareihin ja joihinkin työkaluihin erikoisvaikutuksia, kuten useamman esineen tuottaminen palikkaa louhiessa tai parannettu vastustuskyky. - + - 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ä. + Kirjahyllyjen asettaminen lumouspöydän ympärille lisää sen tehoa ja pääset käsiksi korkeamman tason lumouksiin. - - 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*} - - - Punakivitoistimilla pystyy pidentämään matkaa, jonka virta kulkee, tai asettaa piiriin viiveen. - {*ICON*}356{*/ICON*} - - - 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*} - - + - 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. + 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. - + - Tällä alueella on portaali Hornaan! + 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. - + - {*B*} - Opettele lisää portaaleista ja Hornasta painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi portaaleista ja Hornasta, paina{*CONTROLLER_VK_B*}. + Tällä alueella on lumouspöytä ja muutamia muita esineitä, joiden avulla opit tekemään lumouksia. - + + {*B*} + Opettele lisää lumouksista{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi lumouksista, paina{*CONTROLLER_VK_B*}. + + - Portaaleja valmistetaan asettamalla laavakivipalikoita kehykseksi, joka on neljän palikan levyinen ja viiden palikan korkuinen. Kulmapalikoita ei tarvita. + Kokemuspisteitä saa myös lumouspullolla, joka luo kokemuskuulia laskeutumispaikkaansa, kun sen heittää. Luodut kuulat voi sitten kerätä talteen. - + - 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ä. - + Kaivoskärry kulkee raiteilla. Uunilla voit myös valmistaa moottoroidun kaivoskärryn sekä kaivoskärryn, jossa on arkku. + {*RailIcon*} - + - Kun haluat käyttää portaalia Hornaan, seiso sen sisällä. Näyttö muuttuu violetiksi ja kuulet äänen. Muutaman sekunnin kuluttua siirryt toiseen ulottuvuuteen. + 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*} - + - 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. + Purjehdit nyt veneellä. Jos haluat poistua veneestä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - + - Hornan kautta pystyy matkustamaan nopeasti Ylämaailmassa. Yhden palikan kulkeminen Hornassa vastaa 3 palikan kulkemista Ylämaailmassa. + Tällä alueella löydät arkuista joitain lumottuja esineitä, lumouspulloja ja muutamia esineitä, joita voit lumota opetellaksesi käyttämään lumouspöytää. - + - Nyt olet Luovassa tilassa. + Kuljet nyt kaivoskärryllä. Jos haluat poistua kaivoskärrystä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Opettele lisää Luovasta tilasta{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi Luovasta tilasta, paina{*CONTROLLER_VK_B*}. - - - 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ää. - - - Avaa luova valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. - - - Mene tämän aukon vastakkaiselle puolelle jatkaaksesi. - - - Nyt olet suorittanut Luovan tilan opetuspelin. - - - - Tälle alueelle on perustettu maatila. Viljelemällä maata saat luotua uudistuvan lähteen ruualle ja muille esineille. - - - - {*B*} - Opettele lisää maanviljelystä{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi maanviljelystä, paina{*CONTROLLER_VK_B*}. - - - 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. - - - 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. - - - Vehnä käy läpi useita vaiheita kasvaessaan ja se on valmis korjattavaksi, kun sen väri tummenee.{*ICON*}59:7{*/ICON*} - - - Kurpitsat ja melonit vaativat istutetun siemenen viereen lisäksi palikan, johon kasvis voi kasvaa, kun sen varsi on täysikokoinen. - - - 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*} - - - 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*} - - - 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*} - - - Luujauholla voi kasvattaa viljelyskasvit täysikokoisiksi, tai sienet valtaviksi sieniksi.{*ICON*}351:15{*/ICON*} - - - Nyt olet suorittanut maanviljelyn opetuspelin. - - - - Tällä alueella eläimet ovat aitauksessa. Voit kasvattaa eläimiä ja saada ne tuottamaan poikasia. - - - - {*B*} - Opettele lisää eläinten kasvattamisesta{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi eläinten kasvattamisesta, paina{*CONTROLLER_VK_B*}. - - - Jotta saisit eläimet lisääntymään, sinun pitää syöttää niille oikeaa ruokaa, jolloin ne siirtyvät "Rakkaustilaan". - - - 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. - - - 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. - - - Eläin ei voi siirtyä uudestaan Rakkaustilaan ennen kuin noin 5 minuutin päästä. - - - 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*} - - - 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. - - - Nyt olet suorittanut eläinten kasvattamisen opetuspelin. - - - - Tällä alueella on kurpitsoja ja palikoita, joista voi tehdä lumigolemin ja rautagolemin. - - - - {*B*} - Opettele lisää golemeista{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi golemeista, paina{*CONTROLLER_VK_B*}. - - - Golemeja luodaan asettamalla kurpitsa palikkapinon päälle. - - - Lumigolemit luodaan laittamalla kaksi lumipalikkaa päällekkäin, ja niiden päälle kurpitsa. Lumigolemit viskovat vihollisiasi lumipalloilla. - - - Rautagolemit luodaan pinoamalla neljä rautapalikkaa kuvan osoittamalla tavalla, ja laittamalla kurpitsa keskimmäisen palikan päälle. Rautagolemit hyökkäävät vihollistesi kimppuun. - - - 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. - - - Et voi poistua tältä alueelta ennen kuin olet suorittanut opetuspelin. - - - Eri työkalut toimivat paremmin eri materiaaleihin. Käytä lapiota pehmeiden materiaalien, kuten maan ja hiekan louhimiseen. - - - Eri työkalut toimivat paremmin eri materiaaleihin. Käytä kirvestä puunrunkojen hakkaamiseen. - - - 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. - - - Jotkin työkalut sopivat paremmin vihollisten kimppuun hyökkäämiseen. Miekkaa kannattaa käyttää hyökkäämiseen. - - - 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ä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. - - - Ui ylöspäin pitämällä{*CONTROLLER_ACTION_JUMP*} painettuna. - - - 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*}. - - - 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*}. - - - Arkussa lammen rannalla on onki. Ota onki arkusta ja laita se käteesi, niin voit käyttää sitä. - - - 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ää. + + {*B*} + Opettele lisää kaivoskärryistä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi kaivoskärryistä, paina{*CONTROLLER_VK_B*}. Jos siirrät osoittimen valikon ulkopuolelle kantaessasi esinettä, voit tiputtaa sen. + + Lue + + + Ripusta + + + Heitä + + + Avaa + + + Vaihda sävelkorkeutta + + + Räjäytä + + + Istuta + + + Avaa koko peli + + + Poista tallenne + + + Poista + + + Käännä maata + + + Kerää + + + Jatka + + + Ui ylös + + + Lyö + + + Lypsä + + + Kerää + + + Tyhjennä + + + Satuloi + + + Aseta + + + Syö + + + Ratsasta + + + Purjehdi + + + Kasvata + + + Nuku + + + Herää + + + Soita + + + Asetukset + + + Siirrä panssari + + + Siirrä ase + + + Ota käyttöön + + + Siirrä raaka-aine + + + Siirrä polttoaine + + + Siirrä työkalu + + + Vedä + + + Selaa ylös + + + Selaa alas + + + Rakkaustila + + + Laukaise + + + Etuoikeudet + + + Estä + + + Luova + + + Kiellä kenttä + + + Valitse ulkoasu + + + Sytytä + + + Kutsu kavereita + + + Hyväksy + + + Keritse + + + Liiku + + + Asenna uudestaan + + + Asetukset + + + Suorita komento + + + Asenna täysi versio + + + Asenna koeversio + + + Asenna + + + Lennätä ulos + + + Päivitä Verkkopeliluettelo + + + Ryhmäpelit + + + Kaikki pelit + + + Poistu + + + Peru + + + Peru liittyminen + + + Vaihda ryhmää + + + Valmistaminen + + + Luo + + + Ota/aseta + + + Näytä tavarat + + + Näytä kuvaus + + + Näytä raaka-aineet + + + Palaa + + + Muistutus: + + + + + + Peliin on sen viimeisimmässä versiossa lisätty uusia ominaisuuksia, mukaan lukien uusia alueita opetuspelin maailmaan. + 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. @@ -3394,28 +1352,9 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä {*EXIT_PICTURE*} Kun olet valmis tutkimaan kauempana olevia paikkoja, tällä alueella kaivosmiehen mökin lähistöllä on ovi, joka johtaa pieneen linnaan. - - Muistutus: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Peliin on sen viimeisimmässä versiossa lisätty uusia ominaisuuksia, mukaan lukien uusia alueita opetuspelin maailmaan. - {*B*}Pelaa opetuspeli läpi normaalisti painamalla{*CONTROLLER_VK_A*}.{*B*} Ohita pääopetuspeli painamalla{*CONTROLLER_VK_B*}. - - - Tältä alueelta löydät valmiita paikkoja, joissa opit kalastamisesta, veneistä, männistä ja punakivestä. - - - Tämän alueen ulkopuolelta löydät esimerkkejä mm. rakennuksista, maanviljelystä, kaivoskärryistä ja raiteista, lumoamisesta, juomien keittämisestä, kaupankäynnistä ja takomisesta! - - - - Ruokapalkkisi on laskenut niin alas, että et enää parane itsestään. @@ -3429,102 +1368,19 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä Käytä - - Palaa + + Tältä alueelta löydät valmiita paikkoja, joissa opit kalastamisesta, veneistä, männistä ja punakivestä. - - Poistu + + Tämän alueen ulkopuolelta löydät esimerkkejä mm. rakennuksista, maanviljelystä, kaivoskärryistä ja raiteista, lumoamisesta, juomien keittämisestä, kaupankäynnistä ja takomisesta! - - Peru - - - Peru liittyminen - - - Päivitä Verkkopeliluettelo - - - Ryhmäpelit - - - Kaikki pelit - - - Vaihda ryhmää - - - Näytä tavarat - - - Näytä kuvaus - - - Näytä raaka-aineet - - - Valmistaminen - - - Luo - - - Ota/aseta + + + Ruokapalkkisi on laskenut niin alas, että et enää parane itsestään. Ota - - Ota kaikki - - - Ota puolet - - - Aseta - - - Aseta kaikki - - - Aseta yksi - - - Tiputa - - - Tiputa kaikki - - - Tiputa yksi - - - Vaihda - - - Pikasiirrä - - - Tyhjennä pikavalinta - - - Mikä tämä on? - - - Jaa Facebookissa - - - Vaihda suodin - - - Lähetä kaveripyyntö - - - Selaa alas - - - Selaa ylös - Seuraava @@ -3534,18 +1390,18 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä Potkaise pelaaja + + Lähetä kaveripyyntö + + + Selaa alas + + + Selaa ylös + Värjää - - Louhi - - - Syötä - - - Kesytä - Paranna @@ -3555,1067 +1411,816 @@ Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiä Seuraa minua - - Lennätä ulos + + Louhi - - Tyhjennä + + Syötä - - Satuloi + + Kesytä - + + Vaihda suodin + + + Aseta kaikki + + + Aseta yksi + + + Tiputa + + + Ota kaikki + + + Ota puolet + + Aseta - - Lyö + + Tiputa kaikki - - Lypsä + + Tyhjennä pikavalinta - - Kerää + + Mikä tämä on? - - Syö + + Jaa Facebookissa - - Nuku + + Tiputa yksi - - Herää + + Vaihda - - Soita - - - Ratsasta - - - Purjehdi - - - Kasvata - - - Ui ylös - - - Avaa - - - Vaihda sävelkorkeutta - - - Räjäytä - - - Lue - - - Ripusta - - - Heitä - - - Istuta - - - Käännä maata - - - Kerää - - - Jatka - - - Avaa koko peli - - - Poista tallenne - - - Poista - - - Asetukset - - - Kutsu kavereita - - - Hyväksy - - - Keritse - - - Kiellä kenttä - - - Valitse ulkoasu - - - Sytytä - - - Liiku - - - Asenna täysi versio - - - Asenna koeversio - - - Asenna - - - Asenna uudestaan - - - Asetukset - - - Suorita komento - - - Luova - - - Siirrä raaka-aine - - - Siirrä polttoaine - - - Siirrä työkalu - - - Siirrä panssari - - - Siirrä ase - - - Ota käyttöön - - - Vedä - - - Laukaise - - - Etuoikeudet - - - Estä - - - Selaa ylös - - - Selaa alas - - - Rakkaustila - - - Juo - - - Kierrä - - - Piilota - - - Tyhjennä kaikki paikat - - - OK - - - Peru - - - Minecraft-kauppa - - - Haluatko varmasti poistua nykyisestä pelistäsi ja liittyä uuteen? Kaikki tallentamaton edistyminen menetetään. - - - Poistu pelistä - - - Tallenna peli - - - Poistu tallentamatta - - - Haluatko varmasti korvata tämän maailman edellisen tallenteen tämän maailman nykyisellä versiolla? - - - Haluatko varmasti poistua tallentamatta? Menetät kaiken edistymisen tässä maailmassa! - - - Aloita peli - - - Vahingoittunut tallenne - - - Tämä tallenne on viallinen tai vahingoittunut. Haluatko poistaa sen? - - - Haluatko varmasti poistua päävalikkoon ja erottaa kaikki pelaajat pelistä? Kaikki tallentamaton edistyminen menetetään. - - - Tallenna ja poistu - - - Poistu tallentamatta - - - Haluatko varmasti poistua päävalikkoon? Kaikki tallentamaton edistyminen menetetään. - - - Haluatko varmasti poistua päävalikkoon? Edistymisesi menetetään! - - - Luo uusi maailma - - - Suorita opetuspeli - - - Opetuspeli - - - Nimeä maailmasi - - - Anna nimi maailmallesi - - - Syötä siemen maailmasi luomiseksi - - - Lataa tallennettu maailma - - - Liity peliin painamalla START - - - Poistutaan pelistä - - - On tapahtunut virhe. Poistutaan päävalikkoon. - - - Yhteyden luominen epäonnistui - - - Yhteys katkesi - - - Yhteys palvelimelle katkesi. Poistutaan päävalikkoon. - - - Palvelin katkaisi yhteyden - - - Sinut potkaistiin pelistä - - - Sinut potkaistiin pelistä lentämisen takia - - - Yhteyden muodostaminen kesti liian pitkään - - - Palvelin on täynnä - - - Istunnon järjestäjä on poistunut pelistä. - - - Et voi liittyä tähän peliin, koska et ole kenenkään siinä pelaavan kaveri. - - - Et voi liittyä tähän peliin, koska istunnon järjestäjä on aiemmin potkaissut sinut pois. - - - Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin vanhempaa versiota. - - - Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin uudempaa versiota. - - - Uusi maailma - - - Palkinto avattu! - - - 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 - - - Pisteeni - - - Yhteensä - - - Sijoitukset: - - - Sija - - - Valmistaudutaan tallentamaan kenttä - - - Valmistellaan osioita... - - - Viimeistellään... - - - Rakennetaan maastoa - - - Simuloidaan hieman maailmaa - - - Otetaan palvelin käyttöön - - - Luodaan syntyalue - - - 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 - - - Vaihdetaan paikalliseen peliin - - - Odota kun istunnon järjestäjä tallentaa pelin - - - Siirrytään Ääreen - - - Poistutaan Äärestä - - - Tämä sänky on varattu - - - Vain öisin voi nukkua - - - %s nukkuu sängyssä. Jotta ajan voisi kelata aamuun, kaikkien pelaajien on nukuttava sängyssä samaan aikaan. - - - Kotisi sänky puuttui tai oli esteen takana - - - Et voi levätä nyt, koska lähistöllä on hirviöitä - - - Sinä nukut sängyssä. Jotta ajan voi kelata aamuun, kaikkien pelaajien on nukuttava sängyssä samaan aikaan. - - - Työkalut ja aseet - - - Aseet - - - Ruoka - - - Rakennukset - - - Panssari - - - Mekanismit - - - Kulkuneuvot - - - Koristeet - - - Rakennuspalikat - - - Punakivi ja kulkuneuvot - - - Sekalaiset - - - Keittäminen - - - Työkalut, aseet ja panssarit - - - Materiaalit - - - Kirjautunut ulos - - - Vaikeustaso - - - Musiikki - - - Ääni - - - Gamma - - - Pelin herkkyys - - - Käyttöliittymän herkkyys - - - Rauhallinen - - - Helppo - - - Tavallinen - - - Vaikea - - - Tällä vaikeustasolla pelaajan elinvoima paranee ajan kuluessa, eikä ympäristössä esiinny vihollisia. - - - Tällä vaikeustasolla ympäristöön syntyy hirviöitä, mutta ne tekevät pelaajalle vähemmän vahinkoa kuin Tavallisella vaikeustasolla. - - - Tällä vaikeustasolla ympäristöön syntyy hirviöitä ja ne tekevät normaalia vahinkoa pelaajaan. - - - 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ä! - - - Koepeli on päättynyt - - - Peli on täynnä - - - Ei voitu liittyä peliin, koska tilaa ei ole - - - Kirjoita kyltin teksti - - - Kirjoita teksti kylttiisi - - - Kirjoita otsikko - - - Kirjoita viestisi otsikko - - - Kirjoita kuvateksti - - - Kirjoita viestisi kuvateksti - - - Kirjoita kuvaus - - - Kirjoita viestisi kuvaus - - - Tavaraluettelo - - - Raaka-aineet - - - Keittoteline - - - Arkku - - - Lumoa - - - Uuni - - - Raaka-aine - - - Polttoaine - - - Jakelulaite - - - Tämän tyyppistä ladattavaa sisältöä ei ole juuri nyt saatavilla tälle pelille. - - - %s on liittynyt peliin. - - - %s on poistunut pelistä. - - - %s potkaistiin pelistä. - - - Haluatko varmasti poistaa tämän pelitallenteen? - - - Odottaa hyväksyntää - - - Sensuroitu - - - Tällä hetkellä soi: - - - Nollaa asetukset - - - Haluatko varmasti nollata asetuksesi niiden oletusarvoihin? - - - Latausvirhe - - - Pelaajan %s peli - - - Tuntemattoman istunnon järjestäjän peli - - - Vieras on kirjautunut ulos - - - Vieraileva pelaaja on kirjautunut ulos, minkä johdosta kaikki vierailevat pelaajat poistettiin pelistä. - - - Kirjaudu - - - Et ole kirjautunut. Sinun pitää olla kirjautunut pelataksesi tätä peliä. Haluatko kirjautua nyt? - - - Moninpeli ei ole sallittu - - - Pelin luominen ei onnistunut - - - Automaattisesti valittu - - - Ei pakettia: oletusulkoasut - - - Suosikkiulkoasut - - - Kielletty kenttä - - - Peli, johon olet liittymässä, on kiellettyjen kenttien luettelossasi. -Jos päätät liittyä tähän peliin, kenttä poistetaan kiellettyjen kenttien luettelostasi. - - - Kielletäänkö tämä kenttä? - - - Haluatko varmasti lisätä tämän kentän kiellettyjen kenttien luetteloosi? -Jos valitset OK, poistut samalla tästä pelistä. - - - Poista Kiellettyjen luettelosta - - - Automaattitallennuksen väli - - - Automaattitallennuksen väli: POIS - - - minuuttia - - - Ei voida asettaa tähän! - - - Laavan asettamista lähelle kentän syntypistettä ei sallita, koska muutoin pelaajat saattavat kuolla heti synnyttyään uudestaan. - - - Käyttöliittymän läpinäkymättömyys - - - Valmistaudutaan kentän automaattitallennukseen - - - HUD-näytön koko - - - HUD-näytön koko (jaettu näyttö) - - - Siemen - - - Avaa ulkoasupaketti - - - Jos haluat käyttää valitsemaasi ulkoasua, sinun pitää avata tämä paketti. -Haluaisitko avata tämän ulkoasupaketin nyt? - - - Avaa tekstuuripaketti - - - Jotta voisit käyttää tätä tekstuuripakettia, sinun pitää avata se. -Haluatko avata sen nyt? - - - Tekstuurikoepaketti - - - Käytät tekstuuripaketin koeversiota. Et pysty tallentamaan tätä maailmaa, ellet avaa täyttä versiota. -Haluatko avata tekstuuripaketin täyden version? - - - Tekstuuripakettia ei löytynyt - - - Avaa täysi versio - - - Lataa koeversio - - - Lataa täysi versio - - - Tämä maailma käyttää yhdistelmäpakettia tai tekstuuripakettia, jota sinulla ei ole! -Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? - - - Hanki koeversio - - - Hanki täysi versio - - - Potkaise pelaaja - - - Haluatko varmasti potkaista tämän pelaajan pelistä? Hän ei pääse liittymään takaisin ennen kuin aloitat maailman uudestaan. - - - Pelaajakuvapaketit - - - Teemat - - - Ulkoasupaketit - - - Salli kaverien kaverit - - - Et voi liittyä tähän peliin, koska se on rajoitettu istunnon järjestäjän kavereille. - - - Et voi liittyä peliin - - - Valittu - - - Valittu ulkoasu: - - - Ladattava sisältö on vioittunut - - - Tämä ladattava sisältö on vioittunut eikä sitä voi käyttää. Sinun pitää poistaa se ja asentaa se sitten uudestaan Minecraft-kaupan valikosta. - - - 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. - - - Pelitilasi on muuttunut - - - Nimeä maailmasi uudelleen - - - Kirjoita uusi nimi maailmallesi - - - Pelitila: Selviytyminen - - - Pelitila: Luova - - - Selviytyminen - - - Luova - - - Luotu Selviytymistilassa - - - Luotu Luovassa tilassa - - - Renderoi pilvet - - - Mitä haluat tehdä tälle pelitallenteelle? - - - Nimeä tallenne uudelleen - - - Automaattitallennus: %d... - - - Päällä - - - Pois - - - Tavallinen - - - Täysin tasainen - - - Kun tämä on valittuna, peli pelataan verkossa. - - - Kun tämä on valittuna, vain kutsutut pelaajat saavat liittyä. - - - Kun tämä on valittuna, kaveriluettelossasi olevien henkilöiden kaverit saavat liittyä peliin. - - - Kun tämä on käytössä, pelaajat voivat aiheuttaa vahinkoa toisille pelaajille. Toimii vain Selviytymistilassa. - - - Kun tämä ei ole käytössä, peliin liittyvät pelaajat eivät voi rakentaa tai louhia ilman lupaa. - - - Kun tämä on käytössä, tuli saattaa levitä läheisiin tulenarkoihin palikoihin. - - - Kun tämä on käytössä, dynamiitti räjähtää aktivoitaessa. - - - Kun tämä on käytössä, Horna luodaan uudelleen. Tästä on hyötyä, jos pelaat vanhempaa tallennetta, missä Hornan linnoituksia ei ollut. - - - Kun tämä on käytössä, maailmaan luodaan rakennelmia, kuten kyliä ja linnakkeita. - - - Kun tämä on käytössä, Ylämaailmaan ja Hornaan luodaan täysin tasainen maailma. - - - Kun tämä on käytössä, lähelle pelaajan syntypistettä luodaan arkku, joka sisältää muutamia hyödyllisiä esineitä. + + Pikasiirrä Ulkoasupaketit - - Teemat + + Punaiseksi värjätty lasilevy - - Pelaajakuvat + + Vihreäksi värjätty lasilevy - - Avatar-esineet + + Ruskeaksi värjätty lasilevy - - Tekstuuripaketit + + Valkoiseksi värjätty lasi - - Yhdistelmäpaketit + + Värjätty lasilevy - - {*PLAYER*} syttyi tuleen + + Mustaksi värjätty lasilevy - - {*PLAYER*} paloi kuoliaaksi + + Siniseksi värjätty lasilevy - - {*PLAYER*} yritti uida laavassa + + Harmaaksi värjätty lasilevy - - {*PLAYER*} tukehtui seinään + + Pinkiksi värjätty lasilevy - - {*PLAYER*} hukkui + + Limenvihreäksi värjätty lasilevy - - {*PLAYER*} kuoli nälkään + + Violetiksi värjätty lasilevy - - {*PLAYER*} pisteltiin kuoliaaksi + + Sinivihreäksi värjätty lasilevy - - {*PLAYER*} tippui maahan liian kovaa + + Vaaleanharmaaksi värjätty lasilevy - - {*PLAYER*} tipahti ulos maailmasta + + Oranssiksi värjätty lasi - - {*PLAYER*} kuoli + + Siniseksi värjätty lasi - - {*PLAYER*} räjähti + + Violetiksi värjätty lasi - - {*PLAYER*} kuoli taikuuteen + + Sinivihreäksi värjätty lasi - - {*PLAYER*} kuoli Ääriliskon henkäykseen + + Punaiseksi värjätty lasi - - {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet + + Vihreäksi värjätty lasi - - {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet + + Ruskeaksi värjätty lasi - - {*SOURCE*} ampui pelaajaa {*PLAYER*} + + Vaaleanharmaaksi värjätty lasi - - {*SOURCE*} ampui pelaajaa {*PLAYER*} tulipallolla + + Keltaiseksi värjätty lasi - - {*SOURCE*} pommitti pelaajaa {*PLAYER*} + + Vaaleansiniseksi värjätty lasi - - {*SOURCE*} tappoi pelaajan {*PLAYER*} + + Magentaksi värjätty lasi - - Peruskallion peitto + + Harmaaksi värjätty lasi - - Näytä HUD-näyttö + + Pinkiksi värjätty lasi - - Näytä käsi + + Limen vihreäksi värjätty lasi - - Kuolinviestit + + Keltaiseksi värjätty lasilevy - - Animoitu hahmo + + Vaaleanharmaa - - Muokattu ulkoasun animaatio + + Harmaa - - Et voi enää louhia tai käyttää esineitä + + Pinkki - - Nyt voit louhia ja käyttää esineitä + + Sininen - - Et voi enää asettaa palikoita + + Violetti - - Nyt voit asettaa palikoita + + Sinivihreä - - Nyt voit käyttää ovia ja kytkimiä + + Limenvihreä - - Et voi enää käyttää ovia tai kytkimiä + + Oranssi - - Nyt voit käyttää säilytysastioita (kuten arkkuja) + + Valkoinen - - Et voi enää käyttää säilytysastioita (kuten arkkuja) + + Muokattu - - Et voi enää hyökätä olentojen kimppuun + + Keltainen - - Nyt voit hyökätä olentojen kimppuun + + Vaaleansininen - - Et voi enää hyökätä pelaajien kimppuun + + Magenta - - Nyt voit hyökätä pelaajien kimppuun + + Ruskea - - Et voi enää hyökätä eläinten kimppuun + + Valkoiseksi värjätty lasilevy - - Nyt voit hyökätä eläinten kimppuun + + Pieni pallo - - Olet nyt moderaattori + + Iso pallo - - Et ole enää moderaattori + + Vaaleansiniseksi värjätty lasilevy - - Nyt voit lentää + + Magentaksi värjätty lasilevy - - Et voi enää lentää + + Oranssiksi värjätty lasilevy - - Et enää väsy + + Tähdenmuotoinen - - Nyt väsyt + + Musta - - Nyt olet näkymätön + + Punainen - - Et ole enää näkymätön + + Vihreä - - Nyt olet haavoittumaton + + Lurkinmuotoinen - - Et ole enää haavoittumaton + + Räjähdys - - %d MSP + + Tuntematon muoto - - Äärilisko + + Mustaksi värjätty lasi - - %s on saapunut Ääreen + + Hevosen rautapanssari - - %s on poistunut Äärestä + + Hevosen kultapanssari - + + Hevosen timanttipanssari + + + Punakivivertain + + + Kaivoskärry ja dynamiittia + + + Kaivoskärry ja hyppijä + + + Lieka + + + Majakka + + + Ansoitettu arkku + + + Painotettu painelaatta (kevyt) + + + Nimilaatta + + + Puulankut (kaikki tyypit) + + + Komentopalikka + + + Ilotulitetähti + + + Näitä eläimiä voi kesyttää ja niillä voi ratsastaa. Niihin voi kiinnittää arkun. + + + Muuli + + + 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. + + + Hevonen + + + Näitä eläimiä voi kesyttää ja niillä voi ratsastaa. + + + Aasi + + + Zombihevonen + + + Tyhjä kartta + + + Hornatähti + + + Ilotulitusraketti + + + Luurankohevonen + + + Näivettäjä + + + Nämä valmistetaan näivettäjän kalloista ja sieluhiekasta. Ne ampuvat sinua räjähtävillä kalloilla. + + + Painotettu painelaatta (raskas) + + + Vaaleanharmaaksi värjätty savi + + + Harmaaksi värjätty savi + + + Pinkiksi värjätty savi + + + Siniseksi värjätty savi + + + Violetiksi värjätty savi + + + Sinivihreäksi värjätty savi + + + Limenvihreäksi värjätty savi + + + Oranssiksi värjätty savi + + + Valkoiseksi värjätty savi + + + Värjätty lasi + + + Keltaiseksi värjätty savi + + + Vaaleansiniseksi värjätty savi + + + Magentaksi värjätty savi + + + Ruskeaksi värjätty savi + + + Hyppijä + + + Aktivointikisko + + + Pudottaja + + + Punakivivertain + + + Päivänvalosensori + + + Punakivipalikka + + + Värjätty savi + + + Mustaksi värjätty savi + + + Punaiseksi värjätty savi + + + Vihreäksi värjätty savi + + + Heinäpaali + + + Kovetettu savi + + + Kivihiilipalikka + + + Häivytys + + + 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ä. + + + Kun tämä on käytössä, pelaajat saavat pitää tavaransa kuollessaan. + + + Kun tämä ei ole käytössä, olennot eivät synny itsestään. + + + Pelitila: Seikkailu + + + Seikkailu + + + Syötä siemen luodaksesi saman maaston uudestaan. Jätä tyhjäksi, niin maailmasta tulee sattumanvarainen + + + Kun tämä ei ole käytössä, hirviöt ja eläimet eivät pudota saalista (esimerkiksi lurkit eivät pudota ruutia). + + + {*PLAYER*} putosi tikapuilta + + + {*PLAYER*} putosi liaaneista + + + {*PLAYER*} lensi pois vedestä + + + Kun tämä ei ole käytössä, palikat eivät pudota tavaroita tuhoutuessaan (esimerkiksi kivipalikoista ei putoa mukulakiviä). + + + Kun tämä ei ole käytössä, pelaajat eivät parane luonnollisesti. + + + Kun tämä ei ole käytössä, vuorokaudenaika ei muutu. + + + Kaivoskärry + + + Kiinnitä + + + Vapauta + + + Kiinnitä + + + Nouse ratsailta + + + Kiinnitä arkku + + + Laukaise + + + Nimeä + + + Majakka + + + Ensisijainen voima + + + Toissijainen voima + + + Hevonen + + + Pudottaja + + + Hyppijä + + + {*PLAYER*} tippui korkealta + + + Luomismunaa ei voi käyttää tällä hetkellä. Lepakoiden enimmäismäärä maailmassa on saavutettu. + + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien hevosien enimmäismäärä on saavutettu. + + + Peliasetukset + + + {*SOURCE*} ampui pelaajan tulipalloksi {*PLAYER*} esineellä {*ITEM*} + + + {*SOURCE*} nuiji pelaajan {*PLAYER*} esineellä {*ITEM*} + + + {*SOURCE*} tappoi pelaajan {*PLAYER*} esineellä {*ITEM*} + + + Olentojen haitanteko + + + Palikoiden pudotukset + + + Luonnollinen paraneminen + + + Päivänvalon kierto + + + Pidä tavarat + + + Olentojen syntyminen + + + Olentojen saalis + + + {*SOURCE*} ampui pelaajan {*PLAYER*} esineellä {*ITEM*} + + + {*PLAYER*} putosi liian kauas ja hänet lopetti {*SOURCE*} + + + {*PLAYER*} putosi liian kauas ja hänet lopetti {*SOURCE*} esineellä {*ITEM*} + + + {*PLAYER*} käveli tuleen, kun {*SOURCE*} taisteli häntä vastaan + + + {*SOURCE*} pudotti pelaajan {*PLAYER*} + + + {*SOURCE*} pudotti pelaajan {*PLAYER*} + + + {*SOURCE*} pudotti pelaajan {*PLAYER*} esineellä {*ITEM*} + + + {*PLAYER*} paloi poroksi, kun {*SOURCE*} taisteli häntä vastaan + + + {*SOURCE*} räjäytti pelaajan {*PLAYER*} + + + {*PLAYER*} näivettyi pois + + + {*SOURCE*} surmasi pelaajan {*PLAYER*} esineellä {*ITEM*} + + + {*PLAYER*} yritti uida laavassa, koska {*SOURCE*} jahtasi häntä + + + {*PLAYER*} hukkui, kun {*SOURCE*} jahtasi häntä + + + {*PLAYER*} käveli kaktukseen, kun {*SOURCE*} jahtasi häntä + + + Nouse ratsaille + + -{*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*} +Jotta hevosta voisi ohjata, sille pitää laittaa satula, jonka voi ostaa kyläläisiltä tai löytää maailmaan kätketyistä arkuista. + + + Kesyille aaseille ja muuleille voi laittaa satulalaukut kiinnittämällä niihin arkun. Satulalaukkuja voi käyttää ratsastettaessa tai hiivittäessä. + + + +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ää. + + + +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. + + + +Kesytettyinä niiden ympärille ilmestyy rakkaussydämiä eivätkä ne enää yritä viskata pelaajaa selästään. + + + +Yritä nyt ratsastaa tällä hevosella. Nouse ratsaille painamalla {*CONTROLLER_ACTION_USE*}, kun kädessäsi ei ole tavaraa tai työkaluja. + + + +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. + + + +Jos majakan pyramidilla on vähintään 4 tasoa, voit lisäksi valita toissijaiseksi voimaksi paranemisen tai vahvemman ensisijaisen voiman. + + + +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. + + + Tämän pyramidin huipulla on sammunut majakka. + + + +Tämä on majakkavalikko, mistä voit valita voimat, jotka majakkasi antaa. + + + +{*B*}Paina {*CONTROLLER_VK_A*} jatkaaksesi. +{*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää majakkavalikkoa. + + + +Majakkavalikosta voit valita 1 ensisijaisen voiman majakallesi. Mitä enemmän tasoja pyramidissasi on, sitä suuremmasta voimavalikoimasta voit valita. + + + +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. + + + Tämä on hevosen tavaraluettelo. + + + +{*B*}Paina {*CONTROLLER_VK_A*} jatkaaksesi. +{*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää hevosen tavaraluetteloa. + + + +Hevosen tavaraluettelosta voit siirtää tai ottaa käyttöön tavaroita hevosellesi, aasillesi tai muulillesi. + + + Tuikkiminen + + + Vana + + + Lentoaika: + + + Satuloi hevosesi asettamalla satula satulapaikkaan. Hevosille voi antaa panssarin asettamalla hevospanssarin panssaripaikkaan. + + + Olet löytänyt muulin. + + + + {*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. + + + +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ä. + + + +Tästä valikosta voit lisäksi siirtää tavaroita oman tavaraluettelosi ja aasiin tai muuliin sidottujen satulalaukkujen välillä. + + + Olet löytänyt hevosen. + + + Olet löytänyt aasin. + + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää majakoista. + {*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää majakoita. + + + +Ilotulitetähtiä valmistetaan asettamalla ruutia ja väriainetta valmistusruudukkoon. + + + Väriaine määrittää ilotulitetähden räjähdyksen värin. + + + Ilotulitetähden muoto määritetään lisäämällä joko tulilataus, kultahippu, höyhen tai olennonpää. + + + +Vaihtoehtoisesti voit asettaa useita ilotulitetähtiä valmistusruudukkoon lisätäksesi ne ilotulitteeseen. + + + +Jos täytät useampia paikkoja valmistusruudukosta ruudilla, se kasvattaa korkeutta, missä kaikki ilotulitetähdet räjähtävät. + + + +Voit ottaa valmiin ilotulitetähden tuottopaikasta, kun haluat käyttää sitä valmistuksessa. + + + Vana tai tuikkiminen voidaan lisätä timanteilla tai hehkukivipölyllä. + + + +Ilotulitteet ovat koriste-esineitä, jotka voi laukaista kädestä tai jakelulaitteella. Ne valmistetaan paperista, ruudista ja valinnaisesti erilaisista ilotulitetähdistä. + + + Ilotuliteähtien värejä, hiipumista, muotoa, kokoa ja vaikutuksia (kuten vana ja tuikkiminen) voi muokata käyttämällä valmistuksessa ylimääräisiä ainesosia. + + + +Kokeile valmistaa työpöydällä ilotulitteita arkuista löytyvistä erilaisista esineistä. + + + Kun ilotulitetähti on valmis, voit asettaa sen hiipumisvärin käyttämällä väriainetta. + + + +Täältä löytyvissä arkuista löytyy erilaisia esineitä, joita voi käyttää ILOTULITTEIDEN valmistuksessa! + + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää ilotulitteista. + {*B*}Paina {*CONTROLLER_VK_B*}, jos tiedät jo miten ilotulitteita käytetään. + + + Kun tahdot valmistaa ilotulitteen, aseta ruuti ja paperi 3x3-kokoiseen valmistusruudukkoon, joka näkyy tavaraluettelosi yläpuolella. + + + Tämä huone sisältää hyppijöitä. + + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää hyppijöistä. + {*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää hyppijöitä. + + + +Hyppijöitä käytetään siirtämään tavaroita säilöihin tai niistä pois, sekä poimimaan automaattisesti niihin heitettyjä tavaroita. + + + +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. + + + +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. + + + +Kokeile käyttää majakkaa asettaaksesi sen antamat voimat. Maksuna voit käyttää annettuja rautaharkkoja. + + + +Ne voivat vaikuttaa keittotelineisiin, arkkuihin, jakelulaitteisiin, pudottajiin, kaivoskärryihin joissa on arkku, kaivoskärryihin joissa on hyppijä sekä muihin hyppijöihin. + + + +Tässä huoneessa on näytillä erilaisia hyödyllisiä hyppijän käyttömahdollisuuksia, joilla voit tehdä kokeita. + + + +Tämä on ilotulitekäyttöliittymä, jolla voit valmistaa ilotulitteita ja ilotulitetähtiä. + + + +{*B*}Paina {*CONTROLLER_VK_A*} jatkaaksesi. +{*B*}Paina {*CONTROLLER_VK_B*}, jos tiedät jo miten ilotulitekäyttöliittymää käytetään. + + + +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. + + + Jos hyppijä saa virtaa punakivestä, se sammuu ja lakkaa imemästä ja asettamasta tavaroita. + + + Hyppijä osoittaa suuntaan, johon se yrittää asettaa tavaroita. Jos haluat suunnata hyppijän kohti tiettyä palikkaa, aseta se palikkaa vasten hiipiessäsi. + + + Näitä vihollisia löytyy suolta. Ne hyökkäävät viskomalla taikajuomia. Ne pudottavat taikajuomia kuollessaan. + + + Maalausten/kehysten enimmäismäärä maailmassa on saavutettu. + + + Et voi luoda vihollisia Rauhallisella vaikeustasolla. + + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. + + + Luomismunaa ei voi käyttää tällä hetkellä. Mustekalojen enimmäismäärä maailmassa on saavutettu. + + + Luomismunaa ei voi käyttää tällä hetkellä. Vihollisten enimmäismäärä maailmassa on saavutettu. + + + Luomismunaa ei voi käyttää tällä hetkellä. Kyläläisten enimmäismäärä maailmassa on saavutettu. + + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien susien enimmäismäärä on saavutettu. + + + Olentojen päiden enimmäismäärä maailmassa on saavutettu. + + + Katso peilistä + + + Vasenkätisyys + + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien kanojen enimmäismäärä on saavutettu. + + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sienilehmien enimmäismäärä on saavutettu. + + + Veneiden enimmäismäärä maailmassa on saavutettu. + + + Luomismunaa ei voi käyttää tällä hetkellä. Kanojen enimmäismäärä maailmassa on saavutettu. @@ -4667,9 +2272,62 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Nollaa Horna + + %s on saapunut Ääreen + + + %s on poistunut Äärestä + + + +{*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*} + Haluatko varmasti nollata Hornan sen oletustilaan tässä tallenteessa? Menetät kaiken, mitä olet Hornassa rakentanut! + + Luomismunaa ei voi käyttää tällä hetkellä. Sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. + + + Luomismunaa ei voi käyttää tällä hetkellä. Sienilehmien enimmäismäärä on saavutettu. + + + Luomismunaa ei voi käyttää tällä hetkellä. Susien enimmäismäärä maailmassa on saavutettu. + Nollaa Horna @@ -4677,113 +2335,11 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Älä nollaa Hornaa - Tätä sienilehmää ei voi keritä tällä hetkellä. Sikojen, lampaiden, lehmien ja kissojen enimmäismäärä on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Sikojen, lampaiden, lehmien ja kissojen enimmäismäärä on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Sienilehmien enimmäismäärä on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Susien enimmäismäärä maailmassa on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Kanojen enimmäismäärä maailmassa on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Mustekalojen enimmäismäärä maailmassa on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Vihollisten enimmäismäärä maailmassa on saavutettu. - - - Luomismunaa ei voi käyttää tällä hetkellä. Kyläläisten enimmäismäärä maailmassa on saavutettu. - - - Maalausten/kehysten enimmäismäärä maailmassa on saavutettu. - - - Et voi luoda vihollisia Rauhallisella vaikeustasolla. - - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sikojen, lampaiden, lehmien ja kissojen enimmäismäärä on saavutettu. - - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien susien enimmäismäärä on saavutettu. - - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien kanojen enimmäismäärä on saavutettu. - - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sienilehmien enimmäismäärä on saavutettu. - - - Veneiden enimmäismäärä maailmassa on saavutettu. - - - Olentojen päiden enimmäismäärä maailmassa on saavutettu. - - - Katso peilistä - - - Vasenkätisyys + Tätä sienilehmää ei voi keritä tällä hetkellä. Sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. Kuolit! - - Synny uudelleen - - - Ladattavan sisällön tarjoukset - - - Vaihda ulkoasua - - - Peliohje - - - Ohjaus - - - Asetukset - - - Tekijät - - - Asenna sisältö uudestaan - - - Virheenkorjausasetukset - - - Tuli leviää - - - Dynamiitti räjähtää - - - Pelaaja vastaan pelaaja - - - Luota pelaajiin - - - Istunnon järjestäjän oikeudet - - - Luo rakennelmia - - - Täysin tasainen maailma - - - Bonusarkku - Maailman asetukset @@ -4793,18 +2349,18 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Saa käyttää ovia ja kytkimiä + + Luo rakennelmia + + + Täysin tasainen maailma + + + Bonusarkku + Saa avata säilytysastioita - - Saa hyökätä pelaajien kimppuun - - - Saa hyökätä eläinten kimppuun - - - Moderaattori - Potkaise pelaaja @@ -4814,185 +2370,306 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Väsyminen pois päältä + + Saa hyökätä pelaajien kimppuun + + + Saa hyökätä eläinten kimppuun + + + Moderaattori + + + Istunnon järjestäjän oikeudet + + + Peliohje + + + Ohjaus + + + Asetukset + + + Synny uudelleen + + + Ladattavan sisällön tarjoukset + + + Vaihda ulkoasua + + + Tekijät + + + Dynamiitti räjähtää + + + Pelaaja vastaan pelaaja + + + Luota pelaajiin + + + Asenna sisältö uudestaan + + + Virheenkorjausasetukset + + + Tuli leviää + + + Äärilisko + + + {*PLAYER*} kuoli Ääriliskon henkäykseen + + + {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet + + + {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet + + + {*PLAYER*} kuoli + + + {*PLAYER*} räjähti + + + {*PLAYER*} kuoli taikuuteen + + + {*SOURCE*} ampui pelaajaa {*PLAYER*} + + + Peruskallion peitto + + + Näytä HUD-näyttö + + + Näytä käsi + + + {*SOURCE*} ampui pelaajaa {*PLAYER*} tulipallolla + + + {*SOURCE*} pommitti pelaajaa {*PLAYER*} + + + {*SOURCE*} tappoi pelaajan {*PLAYER*} taikuudella + + + {*PLAYER*} tipahti ulos maailmasta + + + Tekstuuripaketit + + + Yhdistelmäpaketit + + + {*PLAYER*} syttyi tuleen + + + Teemat + + + Pelaajakuvat + + + Avatar-esineet + + + {*PLAYER*} paloi kuoliaaksi + + + {*PLAYER*} kuoli nälkään + + + {*PLAYER*} pisteltiin kuoliaaksi + + + {*PLAYER*} tippui maahan liian kovaa + + + {*PLAYER*} yritti uida laavassa + + + {*PLAYER*} tukehtui seinään + + + {*PLAYER*} hukkui + + + Kuolinviestit + + + Et ole enää moderaattori + + + Nyt voit lentää + + + Et voi enää lentää + + + Et voi enää hyökätä eläinten kimppuun + + + Nyt voit hyökätä eläinten kimppuun + + + Olet nyt moderaattori + + + Et enää väsy + + + Nyt olet haavoittumaton + + + Et ole enää haavoittumaton + + + %d MSP + + + Nyt väsyt + + + Nyt olet näkymätön + + + Et ole enää näkymätön + + + Nyt voit hyökätä pelaajien kimppuun + + + Nyt voit louhia ja käyttää esineitä + + + Et voi enää asettaa palikoita + + + Nyt voit asettaa palikoita + + + Animoitu hahmo + + + Muokattu ulkoasun animaatio + + + Et voi enää louhia tai käyttää esineitä + + + Nyt voit käyttää ovia ja kytkimiä + + + Et voi enää hyökätä olentojen kimppuun + + + Nyt voit hyökätä olentojen kimppuun + + + Et voi enää hyökätä pelaajien kimppuun + + + Et voi enää käyttää ovia tai kytkimiä + + + Nyt voit käyttää säilytysastioita (kuten arkkuja) + + + Et voi enää käyttää säilytysastioita (kuten arkkuja) + Näkymätön - - Istunnon järjestäjän asetukset + + Majakat - - Pelaajat/kutsu + + {*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*} + - - Verkkopeli + + Ilotulitteet - - Vain kutsu + + Kielet - - Lisäasetukset + + Hevoset - - Lataa + + {*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*} + - - Uusi maailma + + {*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. - - Maailman nimi + + {*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. - - Siemen maailmageneraattorille + + Muuttuu käytettäessä kartaksi siitä osasta maailmaa, jolla sillä hetkellä olet, ja täydentyy tutkiessasi. - - Jätä tyhjäksi, niin siemen on satunnainen + + Putoaa näivettäjältä. Käytetään majakan valmistamiseen. - - Pelaajat + + Hyppijät - - Liity peliin + + {*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*} + - - Aloita peli + + Pudottajat - - Pelejä ei löytynyt - - - Pelaa peliä - - - Tulostilastot - - - Ohjeet ja asetukset - - - Avaa koko peli - - - Jatka peliä - - - Tallenna peli - - - Vaikeustaso: - - - Pelityyppi: - - - Rakennelmat: - - - Kenttätyyppi: - - - PvP: - - - Luota pelaajiin: - - - Dynamiitti: - - - Tuli leviää: - - - Asenna teema uudelleen - - - Asenna pelaajakuva 1 uudelleen - - - Asenna pelaajakuva 2 uudelleen - - - Asenna avatar-esine 1 uudelleen - - - Asenna avatar-esine 2 uudelleen - - - Asenna avatar-esine 3 uudelleen - - - Asetukset - - - Äänet - - - Ohjaus - - - Grafiikka - - - Käyttöliittymä - - - Nollaa oletusarvoihin - - - Kuvan keikkuminen - - - Vinkit - - - Pelin sisäiset vinkit - - - 2 pelaajan vertik. jaettu näyttö - - - Valmis - - - Muokkaa kyltin viestiä: - - - Täytä näyttökuvasi tiedot - - - Kuvateksti - - - Näyttökuva pelistä - - - Muokkaa kyltin viestiä: - - - Klassiset Minecraft-tekstuurit, kuvakkeet ja käyttöliittymä! - - - Näytä kaikki yhdistelmämaailmat - - - Ei tehosteita - - - nopeus - - - hitaus - - - kiire - - - louhintauupumus - - - voima - - - heikkous + + EI KÄYTÖSSÄ välitön elinvoima @@ -5003,62 +2680,3239 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? tehostettu hyppy + + louhintauupumus + + + voima + + + heikkous + pahoinvointi + + EI KÄYTÖSSÄ + + + EI KÄYTÖSSÄ + + + EI KÄYTÖSSÄ + paraneminen kesto - - tulen kesto + + Etsitään siementä maailmageneraattoria varten - - vesihengitys + + 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. - - näkymättömyys + + Kiskot jotka voivat ottaa käyttöön ja poistaa käytöstä kaivoskärryjä, joissa on hyppijä, sekä aktivoida kaivoskärryjä, joissa on dynamiittia. - - sokeus + + Käytetään varastoimaan ja tiputtamaan tavaroita, tai työntämään tavaroita toiseen säilöön, kun se saa punakivilatauksen. - - yönäkö + + Värikkäitä palikoita, joita valmistetaan värjäämällä kovetettua savea. - - nälkä + + Tuottaa punakivilatauksen. Lataus on vahvempi, jos laatalla on useampia esineitä. Vaatii enemmän painoa kuin kevyt laatta. + + + Käytetään punakivivoimanlähteenä. Voidaan muuttaa takaisin punakiveksi. + + + Käytetään keräämään tavaroita tai siirtämään tavaroita sisään ja ulos säilöistä. + + + Voidaan syöttää hevosille, aaseille tai muuleille, mikä parantaa 10 sydäntä. Nopeuttaa varsojen kasvua. + + + Lepakko + + + Näitä lentäviä otuksia löytyy luolista tai muista suurista suljetuista tiloista. + + + Noita + + + Valmistetaan sulattamalla savea ahjossa. + + + Valmistetaan lasista ja väriaineesta. + + + Valmistetaan värjätystä lasista. + + + Tuottaa punakivilatauksen. Lataus on vahvempi, jos laatalla on useampia esineitä. + + + Palikka, joka lähettää punakivisignaalia perustuen auringonvaloon (tai sen puutteeseen). + + + Erikoiskaivoskärry, joka toimii hyppijän tavoin. Se kerää kiskoilla lojuvat ja sen yllä olevissa säilöissä olevat tavarat. + + + Erikoispanssari, jonka voi pukea hevoselle. Antaa panssariin +5. + + + Käytetään määrittämään ilotulitteen väri, vaikutus ja muoto. + + + Käytetään punakivipiireissä ylläpitämään, vertaamaan tai pienentämään signaalin voimakkuutta, tai mittaamaan tiettyjä palikoiden tiloja. + + + Kaivoskärry, joka toimi liikkuvana dynamiittipalikkana. + + + Erikoispanssari, jonka voi pukea hevoselle. Antaa panssariin +7. + + + Käytetään komentojen suorittamiseen. + + + Heijastaa valonsäteen taivaalle ja voi aiheuttaa tilavaikutuksia läheisiin pelaajiin. + + + 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. + + + Erikoispanssari, jonka voi pukea hevoselle. Antaa panssariin +11. + + + Käytetään sitomaan olentoja pelaajaan tai aidanpylväisiin. + + + Käytetään maailman olentojen nimeämiseen. + + + kiire + + + Avaa koko peli + + + Jatka peliä + + + Tallenna peli + + + Pelaa peliä + + + Tulostilastot + + + Ohjeet ja asetukset + + + Vaikeustaso: + + + PvP: + + + Luota pelaajiin: + + + Dynamiitti: + + + Pelityyppi: + + + Rakennelmat: + + + Kenttätyyppi: + + + Pelejä ei löytynyt + + + Vain kutsu + + + Lisäasetukset + + + Lataa + + + Istunnon järjestäjän asetukset + + + Pelaajat/kutsu + + + Verkkopeli + + + Uusi maailma + + + Pelaajat + + + Liity peliin + + + Aloita peli + + + Maailman nimi + + + Siemen maailmageneraattorille + + + Jätä tyhjäksi, niin siemen on satunnainen + + + Tuli leviää: + + + Muokkaa kyltin viestiä: + + + Täytä näyttökuvasi tiedot + + + Kuvateksti + + + Pelin sisäiset vinkit + + + 2 pelaajan vertik. jaettu näyttö + + + Valmis + + + 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. + + + {*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. + + + {*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. + + + {*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. + + + {*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. + + + {*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ä. + + + {*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*} + + + {*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. + + + {*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. + + + Seuraava sivu + + + {*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. + + + {*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. + + + {*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. + + + {*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. + + + Olitko sinä Mineconissa? + + + Kukaan Mojangissa ei ole koskaan nähnyt Junkboyn kasvoja. + + + Tiesitkö, että on olemassa Minecraft Wiki? + + + Älä katso suoraan kohti bugeja. + + + Lurkit syntyivät koodausvirheestä. + + + Onko se kana vai onko se ankka? + + + Mojangin uusi toimisto on siisti! + + + {*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*}. + + + {*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*}. + + + {*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ä. + + + Minecon 2013 pidettiin Floridan Orlandossa, USA:ssa! + + + .party() oli mahtava! + + + Oleta aina ennemmin, että huhut ovat valetta kuin totta! + + + Edellinen sivu + + + Kaupankäynti + + + Alasin + + + Ääri + + + Kenttien kieltäminen + + + Luova tila + + + Järjestäjän ja pelaajan asetukset + + + {*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. + + + {*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*} + + + Tekee enemmän vahinkoa kuin pelkkä käsi. + + + Käytetään kaivamaan maata, ruohoa, hiekkaa, soraa ja lunta nopeammin kuin paljain käsin. Lumipallojen kaivamiseen tarvitaan lapio. + + + Juokseminen + + + Uutta + + + {*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*} + + + Näyttökuvien jakaminen + + + Arkut + + + Valmistaminen + + + Uuni + + + Perusteet + + + HUD-näyttö + + + Tavaraluettelo + + + Jakelulaite + + + Lumoaminen + + + Portaali Hornaan + + + Moninpeli + + + Eläinten hoitaminen + + + Eläinten kasvattaminen + + + Juomien keittäminen + + + deadmau5 tykkää Minecraftista! + + + Sikamiehet eivät hyökkää kimppuusi, ellet itse hyökkää ensin. + + + Voit vaihtaa kohtaa, johon synnyt uudelleen, ja kelata aikaa aamuun asti sängyssä nukkumalla. + + + Iske tulipallot takaisin hornanhenkiä päin! + + + Tee soihtuja, niin voit valaista paikkoja öisin. Hirviöt välttelevät soihtujen valaisemia alueita. + + + Pääset nopeammin paikaista toiseen raiteilla kulkevalla kaivoskärryllä. + + + Istuta taimia, niin niistä kasvaa puita. + + + Rakentamalla portaalin voit matkustaa toiseen ulottuvuuteen – Hornaan. + + + Kaivaminen suoraan alas tai suoraan ylös ei ole hyvä ajatus. + + + Luujauhoa (valmistetaan luurangon luusta) voidaan käyttää lannoitteena, joka saa kasvit kasvamaan välittömästi! + + + Lurkit räjähtävät, kun ne pääsevät lähellesi! + + + Painamalla{*CONTROLLER_VK_B*} voit tiputtaa käsissäsi pitelemäsi esineen. + + + Käytä työhön oikeaa työkalua. + + + Jos et löydä yhtään kivihiiltä soihtujasi varten, voit valmistaa uunissa puusta puuhiiltä. + + + Paistettujen porsaankyljysten syömisestä saa enemmän elinvoimaa kuin raaoista kyljyksistä. + + + Jos olet valinnut pelin vaikeustasoksi Rauhallinen, elinvoimasi paranee automaattisesti, eikä yöllä esiinny hirviöitä. + + + Syötä sudelle luu, niin se kesyyntyy. Voit käskeä sen istumaan tai seuraamaan sinua. + + + Voit tiputtaa esineitä ollessasi tavaraluettelossa siirtämällä osoittimen pois luettelosta ja painamalla{*CONTROLLER_VK_A*}. + + + Uutta ladattavaa sisältöä on saatavilla! Löydät sen päävalikosta Minecraft-kaupan painikkeen takaa. + + + Voit vaihtaa hahmosi ulkonäköä Minecraft-kaupasta ostetulla Ulkoasupaketilla. Valitse päävalikosta "Minecraft-kauppa", niin näet, mitä on saatavilla. + + + Tee kuvasta kirkkaampi tai tummempi muuttamalla gamma-asetuksia. + + + Kun nukkuu yönsä sängyssä, peli kelautuu aamuun, mutta moninpelissä kaikkien pelaajien on nukuttava sängyssä samaan aikaan. + + + Kuokalla voi kääntää maata kasvien istuttamista varten. + + + Hämähäkit eivät hyökkää päivällä – ellet itse hyökkää niiden kimppuun. + + + Maan tai hiekan kaivaminen on nopeampaa lapiolla kuin käsin. + + + Sioista saa kerättyä porsaankyljyksiä. Kun ne paistaa ja syö, saa takaisin elinvoimaa. + + + Lehmistä saa kerättyä nahkaa, josta voi valmistaa panssareita. + + + Jos sinulla on tyhjä ämpäri, voit täyttää sen lehmästä lypsämälläsi maidolla, tai vedellä tai laavalla! + + + Laavakiveä syntyy, kun vesi osuu laavalähdepalikkaan. + + + Pelissä on nyt pinottavia aitoja. + + + Jotkin eläimet seuraavat, jos pitää vehnää kädessään. + + + Jos eläin ei voi liikkua enempää kuin 20 palikkaa johonkin suuntaan, se ei katoa. + + + Kesyjen susien elinvoiman näkee niiden hännän asennosta. Paranna niitä syöttämällä niille lihaa. + + + Paista kaktus uunissa, niin saat vihreää väriainetta. + + + Peliohje-valikoiden Uutta-osiosta löytyy uusin päivitystieto pelistä. + + + Musiikista vastaa C418. + + + Kuka on Notch? + + + Mojangilla on enemmän palkintoja kuin työntekijöitä! + + + Jotkut julkkiksetkin pelaavat Minecraftia! + + + Notchilla on yli miljoona seuraajaa Twitterissä! + + + Kaikki ruotsalaiset eivät ole vaaleatukkaisia. Joillakin, kuten Jensillä ja Mojangilla, on jopa punaiset hiukset! + + + Peliä päivitetään jossain vaiheessa! + + + Asettamalla kaksi arkkua rinnakkain saa yhden suuren arkun. + + + Pidä varasi rakentaessasi villasta rakennuksia avoimeen maastoon, sillä ukkosmyrskyjen salamat saattavat sytyttää villan tuleen. + + + Yhdellä ämpärillisellä laavaa voi sulattaa 100 palikkaa uunissa. + + + Nuottipalikan soitin muuttuu sen alla olevan materiaalin mukaan. + + + Kun lähdepalikka poistetaan, voi kestää minuutteja ennen kuin laava katoaa KOKONAAN. + + + Mukulakivi kestää hornanhenkien tulipalloja, minkä ansiosta sillä on hyvä suojata portaaleja. + + + Palikat, joita voi käyttää valonlähteinä, sulattavat lunta ja jäätä. Näihin kuuluvat soihdut, hehkukivi ja kurpitsalyhdyt. + + + Zombit ja luurangot selviytyvät auringonvalossa, jos ne ovat vedessä. + + + Kanat munivat 5-10 minuutin välein. + + + Laavakiveä voi louhia ainoastaan timanttihakulla. + + + Lurkit ovat helpoimmin saatavilla oleva ruudin lähde. + + + Jos hyökkäät suden kimppuun, kaikki lähistön sudet suuttuvat ja hyökkäävät kimppuusi. Sama pätee Sikamieszombeihin. + + + Sudet eivät pääse Hornaan. + + + Sudet eivät hyökkää lurkkien kimppuun. + + + Vaaditaan kivipalikoiden ja malmin louhimiseen. + + + Käytetään kakkureseptissä sekä taikajuomien raaka-aineena. + + + 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. + + + 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. + + + Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen omenan. + + + Palauttaa 2{*ICON_SHANK_01*}, ja parantaa elinvoimaa 4 sekunnin ajan. Valmistetaan omenasta ja kultahipuista. + + + Palauttaa 2{*ICON_SHANK_01*}. Sen syöminen saattaa myrkyttää sinut. + + + Käytetään punakivipiireissä toistimena, viivyttimenä ja/tai diodina. + + + Käytetään kaivoskärryjen ohjaamiseen. + + + Kiihdyttää sen yli ajavia kaivoskärryjä saadessaan virtaa. Pysäyttää yli ajavat kaivoskärryt, kun ei saa virtaa. + + + Toimii kuin painelaatta (lähettää punakivisignaalin saadessaan virtaa), mutta sen voi aktivoida vain kaivoskärryllä. + + + Käytetään lähettämään sähkönpurkaus painettaessa. Pysyy aktiivisena noin sekunnin ajan ennen kuin se sammuu taas. + + + Käytetään varastoimaan ja heittämään ulos esineitä satunnaisessa järjestyksessä, kun se saa punakivilatauksen. + + + Soittaa sävelen aktivoitaessa. Iske sitä muuttaaksesi sävelkorkeutta. Tämän asettaminen eri palikoiden päälle muuttaa soittimen tyyppiä. + + + Palauttaa 2,5{*ICON_SHANK_01*}. Valmistetaan paistamalla raakaa kalaa uunissa. + + + Palauttaa 1{*ICON_SHANK_01*}. + + + Palauttaa 1{*ICON_SHANK_01*}. + + + Palauttaa 3{*ICON_SHANK_01*}. + + + Käytetään jousen ammuksina. + + + Palauttaa 2,5{*ICON_SHANK_01*}. + + + Palauttaa 1{*ICON_SHANK_01*}. Voidaan käyttää 6 kertaa. + + + Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Tämän syöminen saattaa myrkyttää sinut. + + + Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. + + + Palauttaa 4{*ICON_SHANK_01*}. Valmistetaan paistamalla porsaankyljys uunissa. + + + Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan syöttää oselotille, jotta se kesyyntyisi. + + + Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla raaka kana uunissa. + + + Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. + + + Palauttaa 4{*ICON_SHANK_01*}. + + + Käytetään kuljettamaan sinua, eläintä tai hirviötä raiteita pitkin. + + + Käytetään villan värjäämiseen vaaleansiniseksi. + + + Käytetään villan värjäämiseen sinivihreäksi. + + + Käytetään villan värjäämiseen violetiksi. + + + Käytetään villan värjäämiseen limenvihreäksi. + + + Käytetään villan värjäämiseen harmaaksi. + + + 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.) + + + Käytetään villan värjäämiseen magentaksi. + + + Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. + + + Käytetään kirjojen ja karttojen valmistamiseen. + + + Voidaan käyttää kirjahyllyjen valmistamiseen. Lumoamalla siitä saa valmistettua lumottuja kirjoja. + + + Käytetään villan värjäämiseen siniseksi. + + + Soittaa musiikkilevyjä. + + + Valmista näistä erittäin kestäviä työkaluja, aseita tai panssareita. + + + Käytetään villan värjäämiseen oranssiksi. + + + Kerätään lampaista ja voidaan värjätä väriaineilla. + + + Käytetään rakennusmateriaalina ja voidaan värjätä väriaineilla. Tätä reseptiä ei suositella, koska villaa saa helposti lampaista. + + + Käytetään villan värjäämiseen mustaksi. + + + Käytetään kuljettamaan tavaroita raiteita pitkin. + + + Kulkee raiteita pitkin ja voi työntää muita kaivoskärryjä, jos siihen laitetaan kivihiiltä. + + + Käytetään kun tahdotaan matkustaa vedessä nopeammin kuin uimalla. + + + Käytetään villan värjäämiseen vihreäksi. + + + Käytetään villan värjäämiseen punaiseksi. + + + Käytetään kasvattamaan välittömästi viljelyskasveja, puita, korkeaa ruohoa, valtavia sieniä sekä kukkia, ja voidaan käyttää väriaineresepteissä. + + + Käytetään villan värjäämiseen pinkiksi. + + + Käytetään väriaineena ruskean villan värjäämisessä, keksien raaka-aineena tai kaakaopalkojen kasvattamisessa. + + + Käytetään villan värjäämiseen hopeanväriseksi. + + + Käytetään villan värjäämiseen keltaiseksi. + + + Mahdollistaa hyökkäykset matkan päästä nuolilla. + + + Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + + Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + + Kiiltävä harkko, josta voi tehdä tästä materiaalista valmistettuja työkaluja. Valmistetaan sulattamalla malmia uunissa. + + + Mahdollistaa harkkojen, jalokivien tai väriaineiden valmistamisen asetettaviksi palikoiksi. Voidaan käyttää kalliina rakennuspalikkana tai kätevänä malmivarastona. + + + 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. + + + + Antaa käyttäjälle 8 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. + + + Rautaovet voi avata vain punakivellä, näppäimillä tai kytkimillä. + + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + + Käytetään puupalikoiden hakkaamiseen nopeammin kuin paljain käsin. + + + Käytetään kääntämään maa- ja ruohopalikoita maanviljelyä varten. + + + Puiset ovet avataan käyttämällä niitä, lyömällä niitä tai punakivellä. + + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 4 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + + Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. + + + Käytetään kätevien portaiden tekemiseen. + + + Käytetään astiana sienimuhennokselle. Voit pitää kulhon, kun muhennos on syöty. + + + Käytetään varastoimaan ja kuljettamaan vettä, laavaa ja maitoa. + + + Käytetään varastoimaan ja kuljettamaan vettä. + + + Näyttää sinun tai muiden pelaajien kirjoittaman tekstin. + + + Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. + + + Käytetään aiheuttamaan räjähdyksiä. Aktivoidaan asettamisen jälkeen sytyttämällä se tuluksilla tai sähkönpurkauksella. + + + Käytetään varastoimaan ja kuljettamaan laavaa. + + + Näyttää auringon ja kuun aseman. + + + Osoittaa aloituspisteeseesi. + + + Luo kuvan tutkitusta alueesta, kun sitä pitää kädessä. Sitä voi hyödyntää reittiä etsiessä. + + + Käytetään varastoimaan ja kuljettamaan maitoa. + + + Käytetään luomaan tulta, sytyttämään dynamiitin ja avaamaan portaalin, kun se on ensin luotu. + + + Käytetään kalastamiseen. + + + 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. + + + Käytetään rakennusmateriaalina ja niistä voi valmistaa monia asioita. Voidaan valmistaa minkälaisesta puusta tahansa. + + + Käytetään rakennusmateriaalina. Painovoima ei vaikuta siihen niin kuin normaaliin hiekkaan. + + + Käytetään rakennusmateriaalina. + + + Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. + + + Käytetään pitkien portaiden tekemiseen. Kaksi päällekkäin asetettua laattaa muodostavat normaalikokoisen kahden laatan palikan. + + + Käytetään luomaan valoa. Soihdut myös sulattavat lunta ja jäätä. + + + Käytetään soihtujen, nuolten, kylttien, tikapuiden, aitojen sekä työkalujen ja aseiden kädensijojen valmistamiseen. + + + Sen sisään voi varastoida palikoita ja esineitä. Kahden arkun asettaminen rinnakkain luo suuremman arkun, joka kaksinkertaistaa varastotilan. + + + 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. + + + + Käytetään pystysuoraan kiipeämiseen. + + + 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. + + + Sallii sinun valmistaa suuremman valikoiman esineitä kuin normaali valmistaminen. + + + Sallii sinun sulattaa malmia, valmistaa puuhiiltä ja lasia, sekä paistaa kaloja ja porsaankyljyksiä. + + + Rautakirves + + + Punakivilamppu + + + Viidakkopuuportaat + + + Koivupuuportaat + + + Nykyinen ohjaus + + + Pääkallo + + + Kaakao + + + Kuusipuuportaat + + + Lohikäärmeen muna + + + Äärikivi + + + Ääriportaalin kehys + + + Hiekkakiviportaat + + + Saniainen + + + Puska + + + Malli + + + Valmistaminen + + + Käytä + + + Toiminto + + + Hiivi/lennä alas + + + Hiivi + + + Tiputa + + + Selaa käden esinettä + + + Tauota + + + Katso + + + Liiku/juokse + + + Tavaraluettelo + + + Hyppää/lennä ylös + + + Hyppää + + + Ääriportaali + + + Kurpitsan varsi + + + Meloni + + + Lasilevy + + + Aidan portti + + + Köynnökset + + + Melonin varsi + + + Rautatangot + + + Halkeilleet kivitiilet + + + Sammaleiset kivitiilet + + + Kiviiilet + + + Sieni + + + Sieni + + + Veistetyt kivitiilet + + + Tiiliportaat + + + Hornapahka + + + Hornatiiliportaat + + + Hornatiiliaita + + + Pata + + + Keittoteline + + + Lumouspöytä + + + Hornatiili + + + Sokeritoukkamukulakivi + + + Sokeritoukkakivi + + + Kivitiiliportaat + + + Lumpeenlehti + + + Sienirihma + + + Sokeritoukkakivitiili + + + Vaihda kameratilaa + + + Jos menetät elinvoimaa, mutta ruokapalkissasi on 9{*ICON_SHANK_01*} tai enemmän, elinvoimasi paranee automaattisesti. Ruuan syöminen palauttaa ruokapalkkia. + + + 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. + + + Kun keräät ja valmistat lisää esineitä, tavaraluettelosi täyttyy.{*B*} + Avaa tavaraluettelo painamalla{*CONTROLLER_ACTION_INVENTORY*}. + + + Keräämästäsi puusta voi valmistaa lankkuja. Avaa valmistusvalikko tehdäksesi niin.{*PlanksIcon*} + + + Ruokapalkkisi on alhainen, ja olet menettänyt elinvoimaa. Palauta ruokapalkkiasi ja ala parantua syömällä paistettu pihvi tavaraluettelostasi.{*ICON*}364{*/ICON*} + + + 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ä. + + + Avaa valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. + + + 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. + + + Liiku painamalla{*CONTROLLER_ACTION_MOVE*}. + + + Katso ylös, alas ja ympärillesi painamalla{*CONTROLLER_ACTION_LOOK*}. + + + 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. + + + 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... + + + Hyppää painamalla{*CONTROLLER_ACTION_JUMP*}. + + + Usein valmistaminen vaatii useita vaiheita. Nyt kun sinulla on lankkuja, voit tehdä enemmän esineitä. Valmista työpöytä.{*CraftingTableIcon*} + + + 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. + + + Avaa säilytysastia + + + 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*} + + + 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*} + + + 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. + + + Lähistöllä on hylätty kaivosmiehen mökki, jonka saat korjattua turvalliseksi yöpaikaksi. + + + 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*} + + + Käytä esineitä, vuorovaikuta ja aseta joitain esineitä painamalla{*CONTROLLER_ACTION_USE*}. Asetetut esineet voi poimia uudestaan louhimalla ne oikealla työkalulla. + + + Vaihda kädessäsi pitämää esinettä painamalla{*CONTROLLER_ACTION_LEFT_SCROLL*} tai{*CONTROLLER_ACTION_RIGHT_SCROLL*}. + + + Jotta saisit nopeutettua palikoiden keräämistä, voit valmistaa tarkoitukseen sopivia työkaluja. Joissain työkaluissa on kepeistä valmistettu kädensija. Valmista nyt keppejä.{*SticksIcon*} + + + 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*} + + + Avaa työpöytä siirtämällä osoitin sen kohdalle ja painamalla{*CONTROLLER_ACTION_USE*}. + + + Kun työpöytä on valittuna, vie osoitin haluamaasi kohtaan ja aseta työpöytä siihen painamalla{*CONTROLLER_ACTION_USE*}. + + + Minecraft on peli, missä palikoita asettamalla voi rakentaa mitä tahansa kuvitteleekin. +Öisin hirviöt tulevat esiin, joten rakenna itsellesi suoja ennen kuin niin tapahtuu. + + + + + + + + + + + + + + + + + + + + + + + + Malli 1 + + + Liikkuminen (lentäessä) + + + Pelaajat/kutsu + + + + + + Malli 3 + + + Malli 2 + + + + + + + + + + + + + + + {*B*}Paina{*CONTROLLER_VK_A*} aloittaaksesi opetuspelin.{*B*} + Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. + + + {*B*}Paina{*CONTROLLER_VK_A*} jatkaaksesi. + + + + + + + + + + + + + + + + + + + + + + + + + + + Sokeritoukkapalikka + + + Kivilaatta + + + Kätevä tapa säilyttää rautaa. + + + Rautapalikka + + + Tammipuulaatta + + + Hiekkakivilaatta + + + Kivilaatta + + + Kätevä tapa säilyttää kultaa. + + + Kukka + + + Valkoinen villa + + + Oranssi villa + + + Kultapalikka + + + Sieni + + + Ruusu + + + Mukulakivilaatta + + + Kirjahylly + + + Dynamiitti + + + Tiili + + + Soihtu + + + Laavakivi + + + Sammalkivi + + + Hornatiililaatta + + + Tammipuulaatta + + + Kivitiililaatta + + + Tiililaatta + + + Viidakkopuulaatta + + + Koivupuulaatta + + + Kuusipuulaatta + + + Magenta villa + + + Koivunlehdet + + + Kuusenhavut + + + Tammenlehdet + + + Lasi + + + Pesusieni + + + Viidakkopuunlehdet + + + Lehdet + + + Tammi + + + Kuusi + + + Koivu + + + Kuusipuu + + + Koivupuu + + + Viidakkopuu + + + Villa + + + Pinkki villa + + + Harmaa villa + + + Vaaleanharmaa villa + + + Vaaleansininen villa + + + Keltainen villa + + + Limenvihreä villa + + + Sinivihreä villa + + + Vihreä villa + + + Punainen villa + + + Musta villa + + + Violetti villa + + + Sininen villa + + + Ruskea villa + + + Soihtu (kivihiili) + + + Hehkukivi + + + Sieluhiekka + + + Hornakivi + + + Lasuriittipalikka + + + Lasuriittimalmi + + + Portaali + + + Kurpitsalyhty + + + Sokeriruoko + + + Savi + + + Kaktus + + + Kurpitsa + + + Aita + + + Jukeboksi + + + Kätevä tapa säilyttää lasuriittia. + + + Lattialuukku + + + Lukittu arkku + + + Diodi + + + Tarttumamäntä + + + Mäntä + + + Villa (minkä värinen tahansa) + + + Kuollut pensas + + + Kakku + + + Sävelpalikka + + + Jakelulaite + + + Korkea ruoho + + + Verkko + + + Sänky + + + Jää + + + Työpöytä + + + Kätevä tapa säilyttää timantteja. + + + Timanttipalikka + + + Uuni + + + Viljelysmaa + + + Viljelyskasvit + + + Timanttimalmi + + + Hirviönluoja + + + Tuli + + + Soihtu (puuhiili) + + + Punakivipöly + + + Arkku + + + Tammipuuportaat + + + Kyltti + + + Punakivimalmi + + + Rautaovi + + + Painelaatta + + + Lumi + + + Näppäin + + + Punakivisoihtu + + + Vipu + + + Raide + + + Tikkaat + + + Puuovi + + + Kiviportaat + + + Paljastinraide + + + Sähköraide + + + Olet kerännyt tarpeeksi mukulakiviä uunin rakentamiseksi. Rakenna sellainen työpöydälläsi. + + + Onkivapa + + + Kello + + + Hehkukivipöly + + + Kaivoskärry ja uuni + + + Muna + + + Kompassi + + + Raaka kala + + + Punainen väriaine + + + Kaktuksenvihreä väriaine + + + Kaakaopavun ruskea väriaine + + + Paistettu kala + + + Värijauhe + + + Mustepussi + + + Kaivoskärry ja arkku + + + Lumipallo + + + Vene + + + Nahka + + + Kaivoskärry + + + Satula + + + Punakivi + + + Maitoämpäri + + + Paperi + + + Kirja + + + Limapallo + + + Tiili + + + Savi + + + Sokeriruo'ot + + + Sininen väriaine + + + Kartta + + + Musiikkilevy - "13" + + + Musiikkilevy - "cat" + + + Sänky + + + Punakivitoistin + + + Keksi + + + Musiikkilevy - "blocks" + + + Musiikkilevy - "mellohi" + + + Musiikkilevy - "stal" + + + Musiikkilevy - "strad" + + + Musiikkilevy - "chirp" + + + Musiikkilevy - "far" + + + Musiikkilevy - "mall" + + + Kakku + + + Harmaa väriaine + + + Pinkki väriaine + + + Limenvihreä väriaine + + + Violetti väriaine + + + Sinivihreä väriaine + + + Vaaleanharmaa väriaine + + + Keltainen väriaine + + + Luunvalkoinen väriaine + + + Luu + + + Sokeri + + + Vaaleansininen väriaine + + + Magenta väriaine + + + Oranssi väriaine + + + Kyltti + + + Nahkatunika + + + Rautarintapanssari + + + Timanttirintapanssari + + + Rautakypärä + + + Timanttikypärä + + + Kultakypärä + + + Kultarintapanssari + + + Kultahousut + + + Nahkasaappaat + + + Rautasaappaat + + + Nahkahousut + + + Rautahousut + + + Timanttihousut + + + Nahkalakki + + + Kivikuokka + + + Rautakuokka + + + Timanttikuokka + + + Timanttikirves + + + Kultakirves + + + Puukuokka + + + Kultakuokka + + + Rengasrintapanssari + + + Rengaspanssarin housut + + + Rengaspanssarin saappaat + + + Puuovi + + + Rautaovi + + + Rengaspanssarin kypärä + + + Timanttisaappaat + + + Höyhen + + + Ruuti + + + Vehnänjyviä + + + Kulho + + + Sienimuhennos + + + Siima + + + Vehnä + + + Paistettu porsaankyljys + + + Maalaus + + + Kultainen omena + + + Leipä + + + Piikivi + + + Raaka porsaankyljys + + + Keppi + + + Ämpäri + + + Vesiämpäri + + + Laavaämpäri + + + Kultasaappaat + + + Rautaharkko + + + Kultaharkko + + + Tulukset + + + Kivihiili + + + Puuhiili + + + Timantti + + + Omena + + + Jousi + + + Nuoli + + + Musiikkilevy - "ward" + + + + Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse rakennukset.{*StructuresIcon*} + + + + Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse työkalut.{*ToolsIcon*} + + + + 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*}. + + + + 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*}. + + + + 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*} + + + + Vaihda esinettä, jonka tahdot valmistaa, painamalla{*CONTROLLER_MENU_NAVIGATE*}. Joistain esineistä voi tehdä eri versioita riippuen käytetyistä materiaaleista. Valitse puulapio.{*WoodenShovelIcon*} + + + Keräämästäsi puusta voi valmistaa lankkuja. Valitse lankkukuvake ja valmista niitä painamalla{*CONTROLLER_VK_A*}.{*PlanksIcon*} + + + + 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ä. + + + Valmistusalueella näkyvät esineet, joita tarvitaan uuden esineen valmistamiseksi. 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 valmistaa. Valitse sitten valmistettava esine painamalla{*CONTROLLER_MENU_NAVIGATE*}. + + + + Valittuna olevan esineen valmistamiseksi vaaditut raaka-aineet näkyvät tässä. + + + + Parhaillaan valittuna olevan esineen kuvaus näkyy tässä. Kuvauksesta pystyy päättelemään, mihin esinettä kenties voi käyttää. + + + + 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. + + + + Joitain esineitä ei voi valmistaa työpöydällä, vaan niihin tarvitaan uuni. Valmista nyt uuni.{*FurnaceIcon*} + + + Sora + + + Kultamalmi + + + Rautamalmi + + + Laava + + + Hiekka + + + Hiekkakivi + + + Kivihiilimalmi + + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää uunia, paina{*CONTROLLER_VK_B*}. + + + + Tämä on uunivalikko. Uunin avulla saat muutettua esineitä kuumentamalla niitä. Uunilla pystyt esimerkiksi muuttamaan rautamalmia rautaharkoiksi. + + + + Aseta valmistamasi uuni maailmaan. Se kannattaa asettaa sisälle suojapaikkaasi.{*B*} + Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. + + + Puu + + + Tammipuu + + + + 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. + + + {*B*} + Näytä tavaraluettelo uudestaan painamalla{*CONTROLLER_VK_X*}. + + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää tavaraluetteloa, paina{*CONTROLLER_VK_B*}. + + + 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ä. + + + + {*B*} + Paina{*CONTROLLER_VK_A*} jatkaaksesi opetuspeliä.{*B*} + Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. + + + + Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen. + + + 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*}. + + + 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ä. + + + + Olet suorittanut opetuspelin ensimmäisen osan. + + + + Valmista uunin avulla lasia. Odotellessasi lasin valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? + + + Valmista uunin avulla puuhiiltä. Odotellessasi puuhiilen valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? + + + Aseta uuni maailmaan painamalla{*CONTROLLER_ACTION_USE*}, ja avaa se sitten. + + + Öisin saattaa tulla erittäin pimeää, joten suojapaikkaasi kannattaa laittaa valaistusta, jotta näet ympärillesi. Valmista nyt soihtu kepeistä ja puuhiilestä valmistusvalikossa.{*TorchIcon*} + + + Aseta ovi painamalla{*CONTROLLER_ACTION_USE*}. Maailmassa olevan oven voi avata ja sulkea painamalla{*CONTROLLER_ACTION_USE*}. + + + 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*} + + + + Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + +Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiäsi esineitä uusiksi esineiksi. + + + Poistu nyt Luovan tilan tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. + + + + Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + {*B*} + Näytä valitun esineen valmistamiseksi vaaditut raaka-aineet painamalla{*CONTROLLER_VK_X*}. + + + {*B*} + Avaa esineen kuvaus painamalla{*CONTROLLER_VK_X*}. + + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo valmistaa esineitä, paina{*CONTROLLER_VK_B*}. + + + Selaa yläreunan Ryhmätyyppivälilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*}, niin voit valita, minkä esineryhmän esineitä haluat poimia. + + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää Luovan tilan tavaraluetteloa, paina{*CONTROLLER_VK_B*}. + + + + 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. + + + + Poistu nyt tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. + + + Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen maailmaan. Jos haluat poistaa kaikki esineet pikavalintapalkista, paina{*CONTROLLER_VK_X*}. + + + +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*}. + + + Vesi + + + Lasipullo + + + Vesipullo + + + Hämähäkin silmä + + + Kultahippu + + + Hornapahka + + + {*splash*}{*prefix*}juoma{*postfix*} + + + Pilaantunut silmä + + + Pata + + + Ääreläisensilmä + + + Kimalteleva meloni + + + Roihujauhe + + + Magmavoide + + + Keittoteline + + + Hornanhengen kyynel + + + Kurpitsansiemenet + + + Meloninsiemenet + + + Raaka kana + + + Musiikkilevy - "11" + + + Musiikkilevy - "where are we now" + + + Keritsimet + + + Paistettu kana + + + Äärenhelmi + + + Meloninviipale + + + Roihutanko + + + Raaka pihvi + + + Paistettu pihvi + + + Mätä liha + + + Lumouspullo + + + Tammipuulankut + + + Kuusipuulankut + + + Koivupuulankut + + + Ruohopalikka + + + Maa + + + Mukulakivi + + + Viidakkopuulankut + + + Koivun taimi + + + Viidakkopuun taimi + + + Peruskallio + + + Taimi + + + Tammen taimi + + + Kuusen taimi + + + Kivi + + + Kehys + + + Luo: {*CREATURE*} + + + Hornatiili + + + Tulilataus + + + Tulilataus (puuhiili) + + + Tulilataus (kivihiili) + + + Pääkallo + + + Pää + + + Pää (%s) + + + Lurkin pää + + + Luurangon pääkallo + + + Näivettäjäluurangon pääkallo + + + Zombin pää + + + 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 @@ -5066,29 +5920,38 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? : paraneminen + + : Ikävyys + + + : kiire + + + : heikkous + + + : voima + + + tulen kesto + + + Kylläisyys + : kesto - - : tulen kesto + + : hyppy - - : vesihengitys + + Näivettäjä - - : näkymättömyys + + Elinvoimatehoste - - : sokeus - - - : yönäkö - - - : nälkä - - - : myrkky + + Imukyky @@ -5099,9 +5962,78 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? III + + : näkymättömyys + IV + + : vesihengitys + + + : tulen kesto + + + : yönäkö + + + : myrkky + + + : nälkä + + + imukyky + + + kylläisyys + + + elinvoimatehoste + + + : sokeus + + + mädätys + + + koruton + + + valju + + + laimea + + + kirkas + + + samea + + + kelvoton + + + lipevä + + + pehmeä + + + tunaroitu + + + lattea + + + kömpelö + + + mauton + räjähtävä @@ -5111,50 +6043,14 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? tylsä - - mauton + + upea - - kirkas + + harras - - samea - - - laimea - - - koruton - - - valju - - - kelvoton - - - lattea - - - kömpelö - - - tunaroitu - - - lipevä - - - pehmeä - - - miellyttävä - - - tyylikäs - - - paksu + + lumoava elegantti @@ -5162,149 +6058,152 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? hieno - - lumoava - - - upea - - - hienostunut - - - harras - helmeilevä - - väkevä - - - iljettävä - - - hajuton - löyhkäävä kitkerä + + hajuton + + + väkevä + + + iljettävä + + + miellyttävä + + + hienostunut + + + paksu + + + tyylikäs + + + Palauttaa pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. + + + Vähentää välittömästi pelaajien, eläinten ja hirviöiden elinvoimaa. + + + 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ä. + 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. + + + Lisää välittömästi pelaajien, eläinten ja hirviöiden elinvoimaa. + + + Vähentää pelaajien ja hirviöiden hyökätessä tekemää vahinkoa. + + + Käytetään kaikkien juomien perustana. Laita keittotelineeseen luodaksesi juomia. + ällöttävä haiseva - - Käytetään kaikkien juomien perustana. Laita keittotelineeseen luodaksesi juomia. - - - 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ää. - - - Vähentää 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. - - - Palauttaa pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. - - - Tekee pelaajista, eläimistä ja hirviöistä immuuneja vahingolle tulesta, laavasta ja ammutuista roihuhyökkäyksistä. - - - Vähentää pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. + + 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 - - - Tehokkuus + + Maksimielinvoima Silkkikosketus - - Särkymätön + + Tehokkuus - - Saaliin kerääminen + + Vesimieltymys Onni - - Voima + + Saaliin kerääminen - - Liekki + + Särkymätön - - Lyönti + + Tulisuojaus - - Loputtomuus + + Suojaus - - I + + Liekehtivä - - II + + Alas leijuminen - - III + + Hengitys + + + Ammussuoja + + + 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,44 +6247,59 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Kätevä tapa varastoida smaragdeja. - - Mukulakivistä tehty seinä. + + Samantapainen kuin arkku, paitsi että äärenarkkuun asetetut tavarat ovat saatavilla pelaajan jokaisessa muussakin äärenarkussa, jopa eri ulottuvuuksissa. - - Voidaan käyttää aseiden, työkalujen ja panssarien korjaamiseen. + + IX - - Sulatetaan uunissa hornakvartsin tuottamiseksi. + + VIII - - Käytetään koristeena. + + Voidaan louhia rautaisella tai sitä paremmalla hakulla smaragdien keräämiseksi. - - Voidaan kaupata kyläläisille. - - - Käytetään koristeena. Siihen voi istuttaa kukkia, taimia, kaktuksia tai sieniä. + + 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ä. + Palauttaa 0,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan istuttaa viljelysmaahan. - - Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla peruna uunissa. + + Sulatetaan uunissa hornakvartsin tuottamiseksi. + + + Voidaan käyttää aseiden, työkalujen ja panssarien korjaamiseen. + + + Voidaan kaupata kyläläisille. + + + Käytetään koristeena. + + + Palauttaa 4{*ICON_SHANK_01*}. - 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. + Palauttaa 1{*ICON_SHANK_01*}. Tämän syöminen saattaa myrkyttää sinut. Käytetään satuloidun sian ohjaamiseen ratsastettaessa. - - Palauttaa 4{*ICON_SHANK_01*}. + + Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla peruna uunissa. + + + Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan porkkanasta ja kultahipuista. Käytetään alasimen kanssa aseiden, työkalujen tai panssarin lumoamiseen. @@ -5387,6 +6307,15 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? 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 + + Kurpitsapiirakka - - Peruna - - - 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,37 +1,122 @@  - - 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 + + + Jaetun näytön online-tunnukset + + + Trophyt + + + 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ä. + + + 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. + + + Online-tunnukset: + + + 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. + + + + Paketti 1.04 (Pelipäivitys 14) + + + Online-tunnukset pelissä + + + Katso mitä minä tein Minecraft: PlayStation®Vita Edition -pelissä! + + + Lataus epäonnistui. Yritä myöhemmin uudelleen. + + + Peliin liittyminen epäonnistui rajoittavan NAT-tyypin takia. Tarkista verkkoasetuksesi. + + + Lähetys epäonnistui. Yritä myöhemmin uudelleen. + + + Lataus valmis! + + + 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. + + + Tallennus kesken + + + Minecraft: PlayStation®Vita Editionin tallennustiedoille ei ole riittävästi tilaa. Tee tilaa poistamalla muita Minecraft: PlayStation®Vita Editionin tallennuksia. + + + Lähettäminen peruttu + + + Olet perunut tämän tallenteen lähettämisen tallenteensiirtoalueelle. + + + Lähetä tallennus PS3™/PS4™-järjestelmälle + + + Lähetetään tietoja: %d%% + + + "PSN" + + + Lataa PS3™-tallenne + + + Ladataan tietoja: %d%% + + + Tallennetaan + + + Lähetys valmis! + + + Oletko varma, että haluat lähettää tämän tallenteen ja korvata mahdollisen aiemman tallennuksen tallennussiirtoalueelta? + + + Muunnetaan dataa + + + EI KÄYTÖSSÄ + + + EI KÄYTÖSSÄ {*T3*}PELIOHJE: LUOVA TILA{*ETW*}{*B*}{*B*} @@ -46,32 +131,80 @@ lentää vasemmalle painamalla{*CONTROLLER_ACTION_DPAD_LEFT*}, ja lentää oikea 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. - - EI KÄYTÖSSÄ - - - EI KÄYTÖSSÄ - "EI KÄYTÖSSÄ" - - "EI KÄYTÖSSÄ" - - - Kutsu kavereita - 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? 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? - - Tämä maailma on aiemmin tallennettu Luovassa tilassa, ja siksi sen trophyt ja tulostilastojen päivitykset eivät ole käytössä. + + "EI KÄYTÖSSÄ" - - 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? + + Kutsu kavereita + + + Minecraft-foorumissa on osio, joka on omistettu PlayStation®Vita Edition -pelille. + + + Uusimmat tiedot tästä pelistä löytää Twitteristä osoitteista @4JStudios ja @Kappische! + + + NOT USED + + + Voit käyttää PlayStation®Vita-järjestelmän kosketusnäyttöä valikoiden selaamiseen. + + + Älä katso ääreläistä silmiin! + + + {*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ä. + + + {*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. + + + Uskomme, että 4J Studios on poistanut Herobrinen PlayStation®Vita-järjestelmän pelistä, mutta emme ole asiasta aivan varmoja. + + + Minecraft: PlayStation®Vita Edition rikkoi useita ennätyksiä! + + + Olet pelannut Minecraft: PlayStation®Vita Edition -koepeliä pisimmän sallitun ajan! Haluatko avata koko pelin ja jatkaa hauskuutta? + + + Minecraft: PlayStation®Vita Edition -pelin lataaminen ei onnistunut, eikä sitä voi jatkaa. + + + Keittäminen + + + Sinut palautettiin aloitusnäyttöön, koska kirjauduit ulos "PSN"-verkosta. + + + Peliin liittyminen ei onnistunut, koska yksi tai useampi pelaaja ei saa pelata verkossa Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. + + + 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. + + + 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. + + + 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. + + + Sinä et saa liittyä tähän peli-istuntoon, koska verkkopelaaminen on estetty Sony Entertainment Network -tililläsi keskustelurajoitusten vuoksi. Yhteys "PSN"-verkkoon katkesi. Poistutaan päävalikkoon. @@ -79,11 +212,23 @@ Lentotilassa voit nousta ylemmäs pitämällä{*CONTROLLER_ACTION_JUMP*} painett Yhteys "PSN"-verkkoon katkesi. + + Tämä maailma on aiemmin tallennettu Luovassa tilassa, ja siksi sen trophyt ja tulostilastojen päivitykset eivät ole käytössä. + + + 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? + 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? + + Vierailevat pelaajat eivät voi avata koko peliä. Kirjaudu sisään Sony Entertainment Network -tilillä. + + + Online-tunnus + 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. @@ -93,151 +238,7 @@ Haluatko avata koko pelin? Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Tarvitset koko pelin, jotta voisit hyväksyä tämän kutsun. Haluatko avata koko pelin? - - Vierailevat pelaajat eivät voi avata koko peliä. Kirjaudu sisään Sony Entertainment Network -tilillä. - - - Online-tunnus - - - Keittäminen - - - Sinut palautettiin aloitusnäyttöön, koska kirjauduit ulos "PSN"-verkosta. - - - Olet pelannut Minecraft: PlayStation®Vita Edition -koepeliä pisimmän sallitun ajan! Haluatko avata koko pelin ja jatkaa hauskuutta? - - - Minecraft: PlayStation®Vita Edition -pelin lataaminen ei onnistunut, eikä sitä voi jatkaa. - - - Peliin liittyminen ei onnistunut, koska yksi tai useampi pelaaja ei saa pelata verkossa Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. - - - 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. - - - Sinä et saa liittyä tähän peli-istuntoon, koska verkkopelaaminen on estetty Sony Entertainment Network -tililläsi keskustelurajoitusten vuoksi. - - - 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. - - - 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. - - - 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ä. - - - 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. - - - Jaetun näytön online-tunnukset - - - Trophyt - - - Online-tunnukset: - - - Online-tunnukset pelissä - - - Katso mitä minä tein Minecraft: PlayStation®Vita Edition -pelissä! - - - 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. - - - - Paketti 1.04 (Pelipäivitys 14) - - - SELECT - - - 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ä. - - - Haluatko kirjautua "PSN"-verkkoon? - - - 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. - - - PlayStation®Vita-järjestelmä - - - Vaihda verkkotilaa - - - Valitse verkkotila - - - Valitse Ad Hoc -verkko, jos haluat yhdistää läheisiin PlayStation®Vita-järjestelmiin, tai "PSN", jos haluat yhdistää ystäviin kaikkialla maailmassa. - - - Ad Hoc -verkko - - - "PSN" - - - Lataa PlayStation®3-järjestelmä tallenne - - - - Lähetä tallenne PlayStation®3/PlayStation®4-järjestelmälle - - - Lähettäminen peruttu - - - Olet perunut tämän tallenteen lähettämisen tallenteensiirtoalueelle. - - - Lähetetään tietoja: %d%% - - - Ladataan tietoja: %d%% - - - Oletko varma, että haluat lähettää tämän tallenteen ja korvata mahdollisen aiemman tallennuksen tallennussiirtoalueelta? - - - Muunnetaan dataa - - - Tallennetaan - - - Lähetys valmis! - - - Lähetys epäonnistui. Yritä myöhemmin uudelleen. - - - Lataus valmis! - - - Lataus epäonnistui. Yritä myöhemmin uudelleen. - - - Peliin liittyminen epäonnistui rajoittavan NAT-tyypin takia. Tarkista verkkoasetuksesi. - - - 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. - - - - Tallennus kesken - - - Minecraft: PlayStation®Vita Editionin tallennustiedoille ei ole riittävästi tilaa. Tee tilaa poistamalla muita Minecraft: PlayStation®Vita Editionin tallennuksia. + + 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 - - - Vous vous êtes déconnecté de "PSN" : partie interrompue. - - - Vous n'êtes pas connecté. - - - Ce jeu intègre des fonctionnalités qui nécessitent une connexion à "PSN", mais vous êtes actuellement hors ligne. - - - Réseau Ad Hoc hors ligne. - - - 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 - - - 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é. + + La sauvegarde des paramètres sur votre compte Sony Entertainment Network a échoué. Problème de compte Sony Entertainment Network - - La sauvegarde des paramètres sur votre compte Sony Entertainment Network a échoué. + + 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 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 ? + + 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. + + + Réseau Ad Hoc hors ligne. + + + Problème de trophée + + + Vous vous êtes déconnecté de "PSN" : partie interrompue. + + + Vous vous êtes déconnecté de "PSN" : retour à l'écran titre + + + Votre système de stockage ne dispose pas de suffisamment d'espace libre pour créer une sauvegarde. + + + 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,251 +1,3571 @@  - - 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 - - N'oubliez pas : les rumeurs tiennent plus de l'invention que de la réalité ! + + Charger monde sauvegardé - - {*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. + + Lancer le didacticiel - - {*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. + + Didacticiel - - {*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. + + Nommer votre monde - - {*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. + + Sauv. endommagée - - {*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. + + OK - - {*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. + + Annuler - - {*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. + + 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*} + + + 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. + + + Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. + + + Vous êtes désormais en mode Créatif. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le mode Créatif.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur ce mode. + + + 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. + + + 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. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les lits.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les lits. + + + Placez votre lit dans un lieu sûr et bien éclairé pour éviter que les monstres ne vous tirent du sommeil au beau milieu de la nuit. Si vous avez déjà utilisé un lit, vous réapparaîtrez à son emplacement si vous mourez. + {*ICON*}355{*/ICON*} + + + Si votre partie compte d'autres joueurs, tous devront être au lit au même moment avant de pouvoir dormir. + {*ICON*}355{*/ICON*} + + + {*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. + + + L'utilisation d'une table d'enchantement vous permet d'appliquer aux objets certains effets spéciaux, comme renforcer la résistance aux dégâts ou augmenter le nombre de ressources produites lorsque vous minez un bloc. + + + Placer des bibliothèques autour de la table d'enchantement augmente sa puissance et permet d'accéder aux niveaux d'enchantement supérieurs. + + + L'enchantement d'objets coûte des niveaux d'expérience qu'on obtient au moyen d'orbes d'expérience. Pour obtenir ces orbes, tuez des monstres et animaux, prélevez du minerai, élevez des animaux, pêchez ou fondez/cuisinez certains objets dans un four. + + + Les enchantements sont tous aléatoires, mais les meilleurs d'entre eux ne seront disponibles qu'à haut niveau d'expérience et nécessiteront de très nombreuses bibliothèques disposées autour de la table d'enchantement pour en augmenter la puissance. + + + Dans cette zone, vous trouverez une table d'enchantement ainsi que plusieurs objets qui vous aideront à vous familiariser avec l'enchantement. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enchantement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur l'enchantement. + + + 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. + + + Le chariot de mine circule sur des rails. Vous pouvez fabriquer des chariots motorisés et des chariots de transport. + {*RailIcon*} + + + Vous pouvez aussi aménager des rails de propulsion : alimentés par les torches et circuits de redstone, ils augmentent la vitesse du chariot. Ces rails peuvent être associés à des interrupteurs, leviers et plaques de détection pour mettre en oeuvre des systèmes complexes. + {*PoweredRailIcon*} + + + Vous naviguez à bord d'un bateau. Pour descendre, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + Dans les coffres de cette zone, vous trouverez certains objets enchantés, des fioles d'expérience ainsi que certains objets qui restent à enchanter sur la table d'enchantement. + + + Vous êtes à bord d'un chariot de mine. Pour descendre, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chariots de mine.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les chariots de mine n'ont déjà plus de secrets pour vous. + + + Si vous déplacez le pointeur hors des limites de l'interface alors qu'un objet lui est annexé, vous pouvez jeter cet objet. + + + Lire + + + Suspendre + + + Lancer + + + Ouvrir + + + Changer tonalité + + + Exploser + + + Planter + + + Déverrouiller le jeu complet + + + Supp. sauvegarde + + + Supprimer + + + Faucher + + + Récolter + + + Continuer + + + Nager (haut) + + + Frapper + + + Traire + + + Prélever + + + Vider + + + Selle + + + Placer + + + Manger + + + Monter + + + Naviguer + + + Faire pousser + + + Dormir + + + Se réveiller + + + Jouer + + + Options + + + Déplacer l'armure + + + Déplacer l'arme + + + Équiper + + + Déplacer ingrédient + + + Déplacer combustible + + + Outil Déplacement + + + Bander + + + Page Haut + + + Page Bas + + + Mode Romance + + + Lâcher + + + Privilèges + + + Parer + + + Créatif + + + Exclure le niveau + + + Sélectionner skin + + + Allumer + + + Inviter des amis + + + Accepter + + + Tondre + + + Naviguer + + + Réinstaller + + + Options + + + Exécuter ordre + + + Installer la version complète + + + Installer la version d'évaluation + + + Installer + + + Éjecter + + + Actualiser jeux + + + Party Games + + + Tous les jeux + + + Quitter + + + Annuler + + + Annuler connexion + + + Changer catégorie + + + Artisanat + + + Créer + + + Prendre/Placer + + + Inventaire + + + Description + + + Ingrédients + + + Retour + + + Rappel : + + + + + + De nouvelles fonctionnalités ont été ajoutées à la dernière version du jeu, dont de nouvelles zones dans le monde didacticiel. + + + Vous ne disposez pas des ingrédients nécessaires pour confectionner cet objet. Le champ situé en bas à gauche de l'écran répertorie les ingrédients requis pour cette tâche d'artisanat. + + + Félicitations, vous êtes arrivé à la fin de ce didacticiel. Désormais, le temps s'écoule normalement dans le jeu et la nuit ne va pas tarder à tomber avec son cortège de monstres ! Terminez votre abri ! + + + {*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. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour parcourir normalement le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour passer le didacticiel principal. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la barre de nourriture et les aliments.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur la barre de nourriture et les aliments. + + + Sélectionner + + + Utiliser + + + Ici, vous trouverez des zones déjà configurées qui vous en apprendront davantage sur la pêche, les bateaux, les pistons et la redstone. + + + À l'extérieur de cette zone, vous trouverez des exemples de bâtiments, de terres labourées, de chariots de mine et de rails, des tables d'enchantement, des alambics, des exemples de commerce, des enclumes... et bien plus encore ! + + + Votre barre de nourriture est à un niveau où votre santé ne se régénère plus. + + + Prendre + + + Suivant + + + Précédent + + + Exclure joueur + + + Envoyer requête d'ami + + + Page Bas + + + Page Haut + + + Teindre + + + Soigner + + + Assis + + + Suis-moi + + + Miner + + + Nourrir + + + Apprivoiser + + + Changer de filtre + + + Placer tout + + + Placer un + + + Lâcher + + + Prendre tout + + + Prendre la moitié + + + Placer + + + Jeter tout + + + Vider la barre de sélection rapide + + + Plus d'info + + + Partager sur Facebook + + + Jeter un + + + Permuter + + + Dépl. rapide + + + Packs de skins + + + Vitre teintée en rouge + + + Vitre teintée en vert + + + Vitre teintée en marron + + + Verre teinté en blanc + + + Vitre teintée + + + Vitre teintée en noir + + + Vitre teintée en bleu + + + Vitre teintée en gris + + + Vitre teintée en rose + + + Vitre teintée en vert clair + + + Vitre teintée en violet + + + Vitre teintée en cyan + + + Vitre teintée en gris clair + + + Verre teinté en orange + + + Verre teinté en bleu + + + Verre teinté en violet + + + Verre teinté en cyan + + + Verre teinté en rouge + + + Verre teinté en vert + + + Verre teinté en marron + + + Verre teinté en gris clair + + + Verre teinté en jaune + + + Verre teinté en bleu ciel + + + Verre teinté en magenta + + + Verre teinté en gris + + + Verre teinté en rose + + + Verre teinté en vert clair + + + Vitre teintée en jaune + + + Gris clair + + + Gris + + + Rose + + + Bleu + + + Violet + + + Cyan + + + Vert clair + + + Orange + + + Blanc + + + Personnalisé + + + Jaune + + + Bleu ciel + + + Magenta + + + Marron + + + Vitre teintée en blanc + + + Petite boule + + + Grosse boule + + + Vitre teintée en bleu ciel + + + Vitre teintée en magenta + + + Vitre teintée en orange + + + En forme d'étoile + + + Noir + + + Rouge + + + Vert + + + En forme de creeper + + + Explosé + + + Forme inconnue + + + Verre teinté en noir + + + Armure en fer pour cheval + + + Armure en or pour cheval + + + Armure en diamant pour cheval + + + Comparateur de redstone + + + Chariot de mine avec TNT + + + Chariot de mine avec entonnoir + + + Laisse + + + Balise + + + Coffre piégé + + + Plaque de détection pondérée (légère) + + + Étiquette + + + Planches de bois (tout type) + + + Bloc de commande + + + Étoile de feu d'artifice + + + Ces animaux peuvent être apprivoisés, puis montés. Ils peuvent être équipés d'un coffre. + + + Mule + + + 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. + + + Cheval + + + Ces animaux peuvent être apprivoisés, puis montés. + + + Âne + + + Cheval zombie + + + Carte vide + + + Étoile du Nether + + + Fusée d'artifice + + + Squelette de cheval + + + Wither + + + Se fabrique avec des crânes de wither et du sable des âmes. Il lance des crânes explosifs. + + + Plaque de détection pondérée (lourde) + + + Argile teinte en gris clair + + + Argile teinte en gris + + + Argile teinte en rose + + + Argile teinte en bleu + + + Argile teinte en violet + + + Argile teinte en cyan + + + Argile teinte en vert clair + + + Argile teinte en orange + + + Argile teinte en blanc + + + Verre teinté + + + Argile teinte en jaune + + + Argile teinte en bleu ciel + + + Argile teinte en magenta + + + Argile teinte en marron + + + Entonnoir + + + Rail déclencheur + + + Dropper + + + Comparateur de redstone + + + Capteur de lumière + + + Bloc de redstone + + + Argile teinte + + + Argile teinte en noir + + + Argile teinte en rouge + + + Argile teinte en vert + + + Botte de foin + + + Argile cuite + + + Bloc de charbon + + + Atténuation en + + + 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. + + + Lorsque cette option est activée, les joueurs conservent leur inventaire quand ils meurent. + + + Lorsque cette option est désactivée, les créatures n'apparaissent pas naturellement. + + + Mode de jeu : Aventure + + + Aventure + + + Saisissez une graine pour générer à nouveau le même terrain. Laissez le champ vide pour un monde aléatoire. + + + 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). + + + {*PLAYER*} a chuté d'une échelle + + + {*PLAYER*} a chuté d'une plante grimpante + + + {*PLAYER*} a chuté d'une étendue d'eau + + + 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). + + + Lorsque cette option est désactivée, la santé des joueurs ne se régénère pas naturellement. + + + Lorsque cette option est désactivée, l'heure ne change pas. + + + Chariot de mine + + + Guider + + + Libérer + + + Fixer + + + Descendre + + + Fixer coffre + + + Lancer + + + Nommer + + + Balise + + + Pouvoir principal + + + Pouvoir secondaire + + + Cheval + + + Dropper + + + Entonnoir + + + {*PLAYER*} a chuté de haut + + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de chauves-souris. + + + Cet animal ne peut pas entrer en mode Romance. Vous avez atteint le nombre maximal de chevaux en cours d'élevage. + + + Options de jeu + + + {*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*} + + + Destruction par créature + + + Production de blocs + + + Régénération naturelle + + + Cycle jour/nuit + + + Conserver inventaire + + + Apparition de créature + + + Butin de créature + + + {*PLAYER*} s'est fait abattre par {*SOURCE*} avec {*ITEM*} + + + {*PLAYER*} a chuté trop loin et s'est fait tuer par {*SOURCE*} + + + {*PLAYER*} a chuté trop loin et s'est fait tuer par {*SOURCE*} avec {*ITEM*} + + + {*PLAYER*} a marché dans un feu en combattant {*SOURCE*} + + + {*PLAYER*} a été poussé à la chute par {*SOURCE*} + + + {*PLAYER*} a été poussé à la chute par {*SOURCE*} + + + {*PLAYER*} a été poussé à la chute par {*SOURCE*} avec {*ITEM*} + + + {*PLAYER*} s'est fait carboniser en combattant {*SOURCE*} + + + {*PLAYER*} s'est fait exploser par {*SOURCE*} + + + {*PLAYER*} a été tué par un wither + + + {*PLAYER*} s'est fait tuer par {*SOURCE*} avec {*ITEM*} + + + {*PLAYER*} a tenté de nager 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*} + + + En selle + + + 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. + + + + 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. + + + + 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. + + + + + 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. + + + Une fois que l'animal est apprivoisé, des coeurs apparaissent autour de lui et il ne tentera plus de vous désarçonner. + + + + + Essayez de monter ce cheval, maintenant. Utilisez {*CONTROLLER_ACTION_USE*} sans objet ni outil à la main pour grimper en selle. + + + + + 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. + + + + + 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. + + + + + 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. + + + + Au sommet de cette pyramide se trouve une balise inactive. + + + + L'interface de balise, qui vous permet de choisir des pouvoirs à attribuer à votre balise. + + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'interface de balise. + + + + + 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. + + + + + 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. + + + + + Interface de l'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 des chevaux. + + + + + L'inventaire du cheval vous permet de transférer ou d'équiper des objets sur votre cheval, votre âne ou votre mule. + + + + Crépitement + + + Traînée + + + Durée de vol : + + + +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. + + + + Vous avez trouvé une mule. + + + + {*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. + + + + + 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. + + + + + 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. + + + + Vous avez trouvé un cheval. + + + Vous avez trouvé un âne. + + + + {*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. + + + + Pour fabriquer une étoile de feu d'artifice, combinez de la poudre à canon et de la teinture dans la grille d'artisanat. + + + La teinture permet de définir la couleur de l'explosion de l'étoile de feu d'artifice. + + + 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. + + + Vous pouvez placer plusieurs étoiles de feu d'artifice dans la grille d'artisanat pour les ajouter à votre feu d'artifice. + + + Plus vous placez de poudre à canon dans votre grille d'artisanat, plus vos étoiles de feu d'artifice exploseront haut. + + + Retirez le feu d'artifice de l'emplacement de production une fois prêt. + + + Utilisez des diamants ou de la poudre de glowstone pour ajouter des traînées ou des crépitements. + + + 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. + + + 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. + + + Essayez de fabriquer un feu d'artifice sur la table d'artisanat en utilisant les éléments fournis dans les coffres. + + + 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. + + + Vous trouverez dans les coffres différents éléments à utiliser pour 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 savez déjà utiliser les feux d'artifice. + + + + 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. + + + 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 savez déjà tout sur les entonnoirs. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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). + + + + + 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. + + + + + Vous trouverez dans cette pièce différents agencements d'entonnoirs utiles qui vous permettront d'observer et d'expérimenter. + + + + Voici l'interface des feux d'artifice, qui vous permet de fabriquer des fusées et des étoiles de feu d'artifice. + + + {*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. + + + +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. + + + + + Cependant, si un entonnoir est alimenté par une redstone, il devient inactif et cesse toute aspiration et tout stockage d'objets. + + + + + 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. + + + + Ces ennemies se trouvent dans les marais et attaquent en vous jetant des potions. Elles produisent des potions quand elles sont tuées. + + + Le nombre maximal de tableaux/cadres dans un monde a été atteint. + + + Vous ne pouvez pas faire apparaître d'ennemis en mode Pacifique. + + + 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. + + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de pieuvres dans un monde. + + + Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal d'ennemis dans un monde a été atteint. + + + Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal de villageois dans un monde a été atteint. + + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de loups en cours d'élevage a été atteint. + + + Le nombre maximal de crânes dans un monde a été atteint. + + + Inverser + + + Gaucher + + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de poulets en cours d'élevage a été atteint. + + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de champimeuh en cours d'élevage a été atteint. + + + Le nombre maximal de bateaux dans un monde a été atteint. + + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de poulets dans un monde. + + + {*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*} + + + {*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*} + + + Réinitialiser le Nether + + + %s est entré(e) dans l'Ender + + + %s a quitté l'Ender + + + {*C3*}Je vois le joueur dont tu parles.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*} ?{*EF*}{*B*}{*B*} +{*C3*}Oui. Fais attention. Son niveau est plus élevé maintenant. Il peut lire nos pensées.{*EF*}{*B*}{*B*} +{*C2*}Ça ne fait rien. Il pense qu'on fait partie du jeu.{*EF*}{*B*}{*B*} +{*C3*}Je l'aime bien, ce joueur. Il a bien joué. Il n'a jamais baissé les bras.{*EF*}{*B*}{*B*} +{*C2*}Il lit nos pensées comme des mots sur un écran.{*EF*}{*B*}{*B*} +{*C3*}C'est sa façon d'imaginer bien des choses quand il est plongé dans le rêve d'un jeu.{*EF*}{*B*}{*B*} +{*C2*}Les mots font une interface remarquable. Très flexible. Et bien moins terrifiante que d'observer la réalité qui se trouve derrière l'écran.{*EF*}{*B*}{*B*} +{*C3*}Ils entendaient des voix, avant que les joueurs ne sachent lire. C'était l'époque où ceux qui ne jouaient pas appelaient les joueurs sorcières et sorciers. Et eux, rêvaient de voler dans les airs, sur des bâtons envoûtés par des démons. {*EF*}{*B*}{*B*} +{*C2*}De quoi rêvait ce joueur ?{*EF*}{*B*}{*B*} +{*C3*}De la lumière du soleil et des arbres. Du feu et de l'eau. Il l'a rêvé et l'a créé. Puis il a rêvé de destruction. Il a rêvé de chasser et d'être chassé. Il a rêvé d'un 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*} + + + 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 ! + + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches, chats et chevaux. + + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de champimeuh. + + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de loups dans un monde. + + + Réinitialiser le Nether + + + Ne pas réinitialiser le Nether + + + Pas de tonte de champimeuh pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches, chats et chevaux. + + + Vous êtes mort ! + + + Options du monde + + + Construction et minage possibles + + + Utilisation portes et leviers possible + + + Génération de structures + + + Monde superplat + + + Coffre bonus + + + Ouverture de conteneurs possible + + + Exclure joueur + + + Vol possible + + + Fatigue désactivée + + + Attaque des joueurs possible + + + Attaque des animaux possible + + + Modérateur + + + Privilèges d'hôte + + + Comment jouer + + + Commandes + + + Paramètres + + + Réapparaître + + + Contenu téléchargeable + + + Changer de skin + + + Générique + + + Explosion de TNT + + + Joueur contre joueur + + + Joueurs de confiance + + + Réinstaller le contenu + + + Debug Settings + + + Propagation du feu + + + Dragon de l'Ender + + + {*PLAYER*} a été tué(e) par le souffle du Dragon de l'Ender. + + + {*PLAYER*} s'est fait tuer par {*SOURCE*} + + + {*PLAYER*} s'est fait tuer par {*SOURCE*} + + + {*PLAYER*} a péri + + + {*PLAYER*} a explosé + + + {*PLAYER*} a trépassé par magie + + + {*PLAYER*} s'est fait tirer dessus par {*SOURCE*} + + + Brouillard d'adminium + + + Afficher interface + + + Afficher main + + + {*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} + + + {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} + + + {*PLAYER*} s'est fait tuer par {*SOURCE*} avec la magie + + + {*PLAYER*} a chuté du bout du monde + + + Packs de textures + + + Packs mash-up + + + {*PLAYER*} a brûlé + + + Thèmes + + + Images du joueur + + + Objets pour avatar + + + {*PLAYER*} a joué avec les allumettes + + + {*PLAYER*} a crevé de faim + + + {*PLAYER*} a reçu une piqûre mortelle + + + {*PLAYER*} a percuté le sol + + + {*PLAYER*} a piqué une tête dans la lave + + + {*PLAYER*} a suffoqué dans un mur + + + {*PLAYER*} a péri par noyade + + + Messages mortuaires + + + Vous n'êtes plus modérateur + + + Vous pouvez maintenant voler + + + Vous ne pouvez plus voler + + + Vous ne pouvez plus attaquer les animaux + + + Vous pouvez maintenant attaquer les animaux + + + Vous êtes désormais modérateur + + + Vous ne vous fatiguerez plus + + + Vous êtes maintenant invulnérable + + + Vous n'êtes plus invulnérable + + + %d MSP + + + Vous pouvez maintenant vous fatiguer + + + Vous êtes maintenant invisible + + + Vous n'êtes plus invisible + + + Vous pouvez maintenant attaquer des joueurs + + + Vous pouvez maintenant miner et utiliser des objets + + + Vous ne pouvez plus placer de blocs + + + Vous pouvez maintenant placer des blocs + + + Personnage animé + + + Animation skin perso + + + Vous ne pouvez plus miner ou utiliser d'objet + + + Vous pouvez maintenant utiliser portes et leviers + + + Vous ne pouvez plus attaquer des monstres + + + Vous pouvez maintenant attaquer des monstres + + + Vous ne pouvez plus attaquer des joueurs + + + Vous ne pouvez plus utiliser portes et leviers + + + Vous pouvez maintenant utiliser des conteneurs (coffres, par exemple) + + + Vous ne pouvez plus utiliser de conteneurs (coffres, par exemple) + + + Invisible + + + 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*} + + + + 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*} + + + + Droppers + + + NOT USED + + + Santé + + + Dégâts + + + Saut + + + Fatigue de mineur + + + Force + + + Faiblesse + + + Nausée + + + NOT USED + + + NOT USED + + + NOT USED + + + Régénération + + + Résistance + + + Recherche d'une graine pour le générateur de monde + + + 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. + + + Rails capables d'activer/désactiver les chariots de mine avec entonnoir et de déclencher les chariots de mine avec TNT. + + + Sert à stocker/relâcher des objets ou à pousser des objets dans un autre conteneur sous l'effet d'une charge de redstone. + + + Blocs colorés fabriqués en teintant de l'argile durcie. + + + 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. + + + Sert de source d'énergie de redstone. Peut être transformé à nouveau en redstone. + + + Sert à attraper des objets, à les transférer dans des conteneurs ou à les en sortir. + + + Peut être donné aux chevaux, aux ânes ou aux mules afin de restaurer jusqu'à 10 coeurs. Accélère la croissance des poulains. + + + Chauve-souris + + + Ces créatures volantes vivent dans les grottes ou autres vastes espaces clos. + + + Sorcière + + + Créé en faisant cuire de l'argile dans un four. + + + Se fabrique avec du verre et un colorant. + + + Se fabrique avec du verre teinté + + + Fournit une charge de redstone. La charge sera d'autant plus puissante que le nombre d'objets sur le plateau sera élevé. + + + Bloc émettant un signal de redstone en fonction de la lumière du soleil (ou de son absence). + + + 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. + + + Armure spéciale pouvant être équipée sur un cheval. Fournit 5 armures. + + + Sert à déterminer la couleur, l'effet et la forme d'un feu d'artifice. + + + Sert dans les circuits de redstone pour entretenir, comparer ou soustraire la puissance du signal ou pour mesurer certains états de blocs. + + + Type de chariot de mine se comportant comme un bloc de TNT mouvant. + + + Armure spéciale pouvant être équipée sur un cheval. Fournit 7 armures. + + + Sert à exécuter des ordres. + + + Projette un rayon de lumière dans le ciel et peut procurer des effets de statut aux joueurs proches. + + + 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. + + + Armure spéciale pouvant être équipée sur un cheval. Fournit 11 points d'armure. + + + Sert à attacher des créatures au joueur ou à des poteaux de clôture + + + Sert à nommer des créatures dans le monde. + + + Hâte + + + Jeu complet + + + Reprendre le jeu + + + Sauvegarder la partie + + + Jouer + + + Classements + + + Aide et options + + + Difficulté : + + + Joueur contre joueur : + + + Joueurs de confiance : + + + TNT : + + + Type de partie : + + + Structures : + + + Type de niveau : + + + Aucune partie trouvée + + + Sur invitation + + + Plus d'options + + + Charger + + + Options de l'hôte + + + Joueurs/Invitation + + + Jeu en ligne + + + Nouveau monde + + + Joueurs + + + Rejoindre la partie + + + Commencer la partie + + + Nom du monde + + + Graine pour le générateur de monde + + + Champ vide pour une graine aléatoire + + + Propagation du feu : + + + Modifier le message : + + + Renseigner la légende de votre capture d'écran + + + Sous-titre + + + Infobulles en jeu + + + Écran partagé (2 joueurs) + + + Terminé + + + Capture d'écran du jeu + + + Pas d'effet + + + Rapidité + + + Lenteur + + + Modifier le message : + + + Les textures, icônes et interface utilisateur classiques de Minecraft ! + + + Afficher tous les mondes mash-up + + + Conseils + + + Réinstaller l'article pour avatar 1 + + + Réinstaller l'article pour avatar 2 + + + Réinstaller l'article pour avatar 3 + + + Réinstaller le thème + + + Réinstaller l'image du joueur 1 + + + Réinstaller l'image du joueur 2 + + + Options + + + Interface utilisateur + + + Paramètres par défaut + + + Tremblements caméra + + + Audio + + + Contrôle + + + Vidéo + + + Sert en alchimie. Produite par les Ghasts à leur mort. + + + Produite par les Cochons zombies à leur mort. Les Cochons zombies se rencontrent dans le Nether. Permet de confectionner des potions. + + + Sert en alchimie. Pousse dans les forteresses du Nether. Peut aussi être plantée dans du sable des âmes. + + + 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. + + + Peut servir de décoration. + + + 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. + + + Peut avoir divers effets selon ce sur quoi elle est utilisée. + + + Sert en alchimie et intervient dans la fabrication d'objets comme l'oeil d'Ender ou la crème de magma. + + + Sert en alchimie. + + + Sert à la création de potions simples et volatiles. + + + Peut être remplie d'eau et servir d'ingrédient de base d'une potion distillée dans l'alambic. + + + Aliment vénéneux et ingrédient alchimique. Se trouve sur les cadavres d'araignées ou d'araignées bleues. + + + Sert en alchimie. Intervient principalement dans la création de potions néfastes. + + + Lorsqu'il est placé, pousse sans interruption. Se prélève avec des cisailles. Peut-être utilisé comme une échelle. + + + Comparable à une porte, mais s'utilise principalement avec une barrière. + + + Se fabrique avec des tranches de pastèque. + + + Des blocs transparents qui peuvent servir d'alternative aux blocs de verre. + + + 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. + + + Faite de blocs de pierre. On en trouve généralement dans les forts. + + + Sert de clôture, comparable aux barrières. + + + À planter pour faire pousser des citrouilles. + + + Sert à la construction et à la décoration. + + + Ralentit vos mouvements lorsque vous passez à travers. Utilisez des cisailles pour la détruire et prélever du fil. + + + Produit un poisson d'argent lorsqu'elle est détruite. Peut également produire un poisson d'argent si à proximité d'un autre poisson d'argent en train d'être attaqué. + + + À planter pour faire pousser des pastèques. + + + Produite par les Enderman à leur mort. Lorsqu'elle est lancée, le joueur est téléporté jusqu'à la zone d'impact de la perle du néant et perdra un peu de santé. + + + Un bloc de terre couronnée de gazon. Se prélève à l'aide d'une pelle. Sert de matériau de construction. + + + 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. + + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + + + Créés en faisant fondre du Netherrack dans un four. Peuvent être transformés en blocs de briques du Nether. + + + Émet de la lumière quand elle est activée. + + + Similaires à une vitrine, affichent les objets ou blocs qui y sont placés. + + + Lancez-le pour faire apparaître une créature du type indiqué. + + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + + + Leur récolte permet d'obtenir des fèves de cacao. + + + Vache + + + Produit du cuir une fois tuée. Utilisez un seau pour la traire. + + + Mouton + + + Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. + + + Pieuvre + + + Produit une poche d'encre une fois tuée. + + + Utile pour enflammer des choses ou pour provoquer des incendies lorsqu'on en place dans un distributeur. + + + Flotte sur l'eau et permet de marcher dessus. + + + Sert à construire des forteresses du Nether. Invulnérable aux boules de feu des Ghasts. + + + Sert dans les forteresses du Nether. + + + 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. + + + Sert en alchimie. + + + Comparable aux blocs d'herbe, mais très efficace pour faire pousser des champignons. + + + Se trouve dans les forteresses du Nether et produit des verrues du Nether lorsqu'elle est brisée. + + + Un type de bloc rencontré dans l'Ender. Elle est dotée d'une résistance très élevée aux explosions et constitue donc un matériau de construction très utile. + + + Ce bloc est créé lorsque le Dragon de l'Ender est terrassé. + + + Lancée, elle produit des orbes d'expérience qui augmentent vos points d'expérience une fois ramassés. + + + Permet au joueur, moyennant ses points d'expérience, d'enchanter épées, pioches, haches, pelles, arcs et armures. + + + S'active à l'aide de l'oeil d'Ender et permet au joueur de voyager jusqu'à la dimension de l'Ender. + + + Sert à créer un portail de l'Ender. + + + 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. + + + Obtenue par la cuisson d'argile dans un four. + + + Peut être transformée en briques à la chaleur d'un four. + + + Une fois brisée, produit des boules d'argile qui peuvent être transformées en briques dans le four. + + + Travaillé à la hache. Transformé en planches ou utilisé comme combustible. + + + Créé par la fusion du sable dans un four. Peut servir de matériau de construction, mais sera détruit si vous tentez de le miner. + + + Obtenue en travaillant la pierre à l'aide d'une pioche. Peut servir à la construction d'un four ou à la fabrication d'outils en pierre. + + + Un moyen peu encombrant d'entreposer des boules de neige. + + + Combiné à un bol, sert à la préparation de ragoûts. + + + Ne peut être travaillée qu'à l'aide d'une pioche en diamant. Résulte d'un mélange d'eau et de lave inerte. Sert à la construction des portails. + + + Libère des monstres dans l'environnement. + + + Se creuse à l'aide d'une pelle pour créer des boules de neige. + + + Produit parfois des graines de blé si détruite. + + + Transformable en colorant. + + + 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. + + + Se mine avec une pioche pour prélever du charbon. + + + Se mine avec une pioche en pierre pour prélever du lapis-lazuli. + + + Se mine avec une pioche en fer pour prélever des diamants. + + + Sert de décoration. + + + Se mine à l'aide d'une pioche en fer (ou mieux). Transformé en lingots d'or dans le four. + + + Se mine à l'aide d'une pioche en pierre (ou mieux). Transformé en lingots de fer dans le four. + + + Se mine avec une pioche en fer pour prélever de la poudre de redstone. + + + Impossible à briser. + + + Enflamme n'importe quoi à son contact. Peut être prélevée dans un seau. + + + Prélevé à l'aide d'une pelle. Peut être fondu en verre dans le four. Soumis à la gravité s'il ne repose sur aucun autre bloc. + + + Se mine avec une pioche pour prélever de la pierre taillée. + + + Prélevée à l'aide d'une pelle. Sert de matériau de construction. + + + Une fois plantée, peut prospérer et devenir un arbre. + + + Se place au sol pour créer un câble conducteur d'électricité. Ajouté à une potion, permet d'en augmenter la durée. + + + Prélevé sur les cadavres de vaches. Sert à la confection d'armures ou de livres. + + + Prélevée sur les cadavres de slimes. Sert d'ingrédient pour les potions et permet de confectionner des pistons collants. + + + Produit aléatoirement par les poules. Sert à la préparation d'aliments. + + + Obtenu en creusant le gravier. Sert à la confection d'un briquet à silex. + + + Utilisée sur un cochon, vous permet de le chevaucher. Vous pouvez ensuite diriger le cochon à l'aide d'une carotte et d'un bâton. + + + Obtenue en creusant la neige. Peut servir de projectile. + + + Obtenue en minant un bloc de glowstone. Sert à la reconstitution de blocs de glowstone et combiné à une potion, permet d'en augmenter la puissance. + + + Une fois détruit, produit une pousse d'arbre à replanter pour créer un nouvel arbre. + + + Sert à la construction et à la décoration. Se trouve dans les donjons. + + + Sert à tondre la laine des moutons et à récolter les blocs de feuillage. + + + Prélevé sur les cadavres de squelettes. Sert à la confection de poudre d'os. Donnez-en à manger à un loup pour le domestiquer. + + + Obtenu sur les creepers tués par un squelette. À lire dans un juke-box. + + + Éteint les flammes et contribue à la prospérité des cultures. À prélever dans un seau. + + + Obtenu par la récolte des cultures. Sert à la préparation d'aliments. + + + Sert à la confection de sucre. + + + Peut servir de casque ou se combiner avec une torche pour produire une citrouille-lanterne. C'est également l'ingrédient principal de la tarte à la citrouille. + + + Brûle indéfiniment si embrasé. + + + Une fois arrivées à maturité, les cultures peuvent être récoltées pour produire du blé. + + + Un sol fertile préparé pour la culture des graines. + + + Passé au four, sert à la confection d'un colorant vert. + + + Ralentit le mouvement de toute créature qui circule dessus. + + + Prélevé sur les cadavres de poulets. Sert à la confection des flèches. + + + Prélevé sur les cadavres de creepers. Sert à la confection de TNT et de potions. + + + Plantées dans une terre labourée, produisent des cultures. Assurez-vous que les graines soient assez exposées au soleil ! + + + Emprunter un portail permet de circuler entre la Surface et le Nether. + + + Alimente le four en combustible. Sert à la confection des torches. + + + Prélevé sur les cadavres d'araignées. Sert à la confection des arcs et des cannes à pêche, et peut-être placé au sol comme fil de détente pour actionner des crochets. + + + 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. + + + 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 + + + Pelle en fer + + + Pelle en diamant + + + Pelle en or + + + Épée en or + + + Pelle en bois + + + Pelle en pierre + + + Pioche en bois + + + Pioche en or + + + Hache en bois + + + Hache en pierre + + + Pioche en pierre + + + Pioche en fer + + + Pioche en diamant + + + Épée en diamant + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Épée en bois + + + Épée en pierre + + + Épée en fer + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Décoche des boules de feu qui explosent à l'impact. + + + Slime + + + Se divise en plusieurs slimes plus petits dès qu'il est touché. + + + Cochon zombie + + + Inoffensifs de nature, ils vous attaqueront en groupe si vous vous en prenez à l'un d'entre eux. + + + Ghast + + + Enderman + + + Araignée bleue + + + Sa morsure est empoisonnée. + + + Champimeuh + + + 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. + + + Attaque dès que vous approchez. + + + Produit de la viande de porc une fois tué. Utilisez une selle pour le chevaucher. + + + Loup + + + 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. + + + Poulet + + + Produit des plumes une fois tué. Pond aussi des oeufs, à l'occasion. + + + Cochon + + + Creeper + + + Araignée + + + Attaque dès que vous approchez. Peut escalader les murs. Produit du fil une fois tuée. + + + Zombie + + + Explose si vous l'approchez de trop près ! + + + Squelette + + + Vous décoche des flèches. Produit des flèches et des os une fois tué. + + + Combiné à un bol, sert à la préparation de ragoûts de champignons. Produit des champignons et devient une vache normale une fois tondue. + + + 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 + + + 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. + + + Golem de neige + + + 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. + + + Dragon de l'Ender + + + Cube de magma + + + 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. Peut être créé à partir de blocs de fer et de citrouilles. + + + 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 + + + Permet d'obtenir des enchantements plus puissants lorsqu'on en place autour de la table d'enchantement. {*T3*}COMMENT JOUER : FOUR{*ETW*}{*B*}{*B*} @@ -282,6 +3602,23 @@ Les matières premières pour les potions sont :{*B*}{*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. + + + {*T3*}COMMENT JOUER : GRAND COFFRE{*ETW*}{*B*}{*B*} +Deux coffres placés côte à côte se combineront pour former un grand coffre où vous pourrez entreposer toujours plus d'objets.{*B*}{*B*} +Son mode d'utilisation est identique à celui du coffre de base. + + + {*T3*}COMMENT JOUER : ARTISANAT{*ETW*}{*B*}{*B*} +Depuis l'interface d'artisanat, vous pouvez combiner divers objets de votre inventaire pour en créer de nouveaux. Utilisez{*CONTROLLER_ACTION_CRAFTING*} pour afficher l'interface d'artisanat.{*B*}{*B*} +Parcourez les onglets, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie d'objets que vous souhaitez confectionner, puis utilisez{*CONTROLLER_MENU_NAVIGATE*} pour choisir l'article à créer.{*B*}{*B*} +La grille d'artisanat indique quels objets sont nécessaires à la production du nouvel article. Appuyez sur{*CONTROLLER_VK_A*} pour confectionner l'objet et le placer dans votre inventaire. + + + {*T3*}COMMENT JOUER : É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. {*T3*}COMMENT JOUER : ENCHANTEMENT{*ETW*}{*B*}{*B*} @@ -292,25 +3629,6 @@ L'enchantement appliqué par défaut est choisi aléatoirement d'après le coût 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*} - - - {*T3*}COMMENT JOUER : ANIMAUX DE LA FERME{*ETW*}{*B*}{*B*} -Si vous souhaitez garder vos animaux au même endroit, construisez une zone clôturée de moins de 20x20 blocs pour y parquer vos animaux. Avec la clôture, vous serez sûr de retrouver vos animaux quand vous viendrez les voir. - - - {*T3*}COMMENT JOUER : ÉLEVER DES ANIMAUX{*ETW*}{*B*}{*B*} -Les animaux de Minecraft peuvent se 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. - - - {*T3*}COMMENT JOUER : PORTAIL DU NETHER{*ETW*}{*B*}{*B*} -Un portail du Nether permet au joueur de circuler entre la Surface et le Nether. Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. Lorsque vous empruntez un portail pour quitter le Nether, vous aurez voyagé sur une distance 3 fois supérieure à celle réellement parcourue.{*B*}{*B*} -Vous devrez disposer d'au moins 10 blocs d'obsidienne pour construire le portail : celui-ci doit être haut de 5 blocs et large de 4, pour une épaisseur d'1 bloc. Une fois le contour achevé, l'espace contenu à l'intérieur doit être enflammé pour activer le portail. Pour ce faire, vous pouvez utiliser un briquet à silex ou une boule de feu.{*B*}{*B*} -Des exemples de construction de portail sont illustrés à droite. {*T3*}COMMENT JOUER : EXCLUSION DE NIVEAUX{*ETW*}{*B*}{*B*} @@ -402,60 +3720,90 @@ Si l'option "Privilèges d'hôte" est activée, le joueur hôte peut modifier ce Page suivante + + {*T3*}COMMENT JOUER : ANIMAUX DE LA FERME{*ETW*}{*B*}{*B*} +Si vous souhaitez garder vos animaux au même endroit, construisez une zone clôturée de moins de 20x20 blocs pour y parquer vos animaux. Avec la clôture, vous serez sûr de retrouver vos animaux quand vous viendrez les voir. + + + {*T3*}COMMENT JOUER : ÉLEVER DES ANIMAUX{*ETW*}{*B*}{*B*} +Les animaux de Minecraft peuvent se 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. + + + {*T3*}COMMENT JOUER : PORTAIL DU NETHER{*ETW*}{*B*}{*B*} +Un portail du Nether permet au joueur de circuler entre la Surface et le Nether. Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. Lorsque vous empruntez un portail pour quitter le Nether, vous aurez voyagé sur une distance 3 fois supérieure à celle réellement parcourue.{*B*}{*B*} +Vous devrez disposer d'au moins 10 blocs d'obsidienne pour construire le portail : celui-ci doit être haut de 5 blocs et large de 4, pour une épaisseur d'1 bloc. Une fois le contour achevé, l'espace contenu à l'intérieur doit être enflammé pour activer le portail. Pour ce faire, vous pouvez utiliser un briquet à silex ou une boule de feu.{*B*}{*B*} +Des exemples de construction de portail sont illustrés à droite. + + + {*T3*}COMMENT JOUER : 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. + + + Vous étiez à la Minecon ? + + + Personne de chez Mojang n'a jamais vu le visage de junkboy. + + + Vous saviez qu'il existait un Wiki Minecraft ? + + + Ne regardez pas les bugs dans les yeux. + + + Les creepers sont nés d'un bug d'encodage. + + + C'est une poule ou un canard ? + + + Le nouveau bureau de Mojang, il déchire ! + + + {*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. + + + {*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. + + + {*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 Minecon 2013 s'est déroulée à Orlando, Floride, États-Unis ! + + + La .party() était réussie ! + + + N'oubliez pas : les rumeurs tiennent plus de l'invention que de la réalité ! + Page précédente - - Principes - - - Interface principale - - - Inventaire - - - Coffres - - - Artisanat - - - Four - - - Distributeur - - - Animaux de la ferme - - - Élever des animaux - - - Alchimie - - - Enchantement - - - Portail du Nether - - - Multijoueur - - - Partage des captures d'écran - - - Exclusion de niveaux - - - Mode Créatif - - - Options de l'hôte et du joueur - Commerce @@ -465,6 +3813,15 @@ Si l'option "Privilèges d'hôte" est activée, le joueur hôte peut modifier ce L'Ender + + Exclusion de niveaux + + + Mode Créatif + + + Options de l'hôte et du joueur + {*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*} @@ -477,68 +3834,14 @@ Ce faisant, le dragon de l'Ender vous attaquera en volant vers vous et en cracha 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. - - - Sprint - - - Nouveautés - - - {*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*} - {*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*} +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*} Inflige plus de dégâts qu'à mains nues. @@ -546,71 +3849,414 @@ Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jet 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. + + Sprint + + + Nouveautés + + + {*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*} + + + Partage des captures d'écran + + + Coffres + + + Artisanat + + + Four + + + Principes + + + Interface principale + + + Inventaire + + + Distributeur + + + Enchantement + + + Portail du Nether + + + Multijoueur + + + Animaux de la ferme + + + Élever des animaux + + + Alchimie + + + deadmau5 aime Minecraft ! + + + Les hommes-cochons ne s'en prendront pas à vous, sauf si vous les attaquez. + + + Dormez dans un lit pour changer votre point d'apparition dans le jeu et accélérer le temps jusqu'à l'aube. + + + Retournez ces boules de feu à l'envoyeur ! + + + Fabriquez des torches pour vous éclairer la nuit. Les monstres se tiendront à l'écart des zones éclairées. + + + Rendez-vous plus rapidement à bon port dans un chariot de mine propulsé sur des rails ! + + + Plantez de jeunes pousses et elles produiront des arbres. + + + Construire un portail vous permettra de voyager jusqu'à une autre dimension : le Nether. + + + Il est rarement judicieux de creuser juste sous vos pieds ou au-dessus de vous. + + + La poudre d'os (obtenue depuis un os de squelette) peut servir d'engrais, et peut faire pousser les cultures instantanément ! + + + Les creepers explosent au contact ! + + + Appuyez sur{*CONTROLLER_VK_B*} pour lâcher l'objet que vous tenez en main ! + + + Utilisez un outil adapté à la tâche ! + + + Si vous ne trouvez pas de charbon pour embraser vos torches, vous pouvez toujours placer du bois dans le four afin d'obtenir du charbon de bois. + + + Manger de la viande de porc cuite régénère plus de santé que la viande de porc crue. + + + Si vous avez réglé la difficulté du jeu sur Pacifique, votre santé se régénérera automatiquement et aucun monstre ne sera de sortie à la nuit tombée ! + + + Donnez un os à un loup pour l'amadouer. Ensuite, donnez-lui l'ordre de s'asseoir ou de vous suivre. + + + Depuis l'inventaire, déplacez le curseur à l'extérieur de la fenêtre et appuyez sur{*CONTROLLER_VK_A*} pour vous séparer d'un objet. + + + Un nouveau contenu téléchargeable est disponible ! Pour y accéder, utilisez le bouton Magasin Minecraft dans le menu principal. + + + 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. + + + Modifie les paramètres de gamma pour augmenter/réduire la luminosité de l'écran. + + + À 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. + + + Utilisez une houe pour préparer des terres arables à la culture. + + + Les araignées ne vous attaqueront pas de jour, sauf pour se défendre. + + + Creuser le sol ou le sable avec une pelle, c'est plus rapide qu'à mains nues ! + + + Prélevez de la viande de porc sur les cochons puis cuisinez-la. Mangez-la pour récupérer de la santé. + + + Prélevez du cuir sur les vaches et utilisez-le pour confectionner des armures. + + + Si vous avez un seau vide, remplissez-le de lait, d'eau ou de lave ! + + + Au contact de l'eau, une source de lave produit de l'obsidienne. + + + Les barrières superposables sont désormais disponibles dans le jeu ! + + + Certains animaux vous suivront si vous tenez du blé dans votre main. + + + Si un animal ne peut se déplacer de plus de 20 blocs dans chaque direction, il ne disparaîtra pas. + + + La santé des loups apprivoisés est illustrée par la position de leur queue. Donnez-leur de la viande pour les soigner. + + + Passez du cactus au four pour obtenir du colorant vert. + + + Reportez-vous à la rubrique Nouveautés des menus Comment jouer pour consulter les dernières notes de mise à jour du jeu. + + + Musique par C418 ! + + + Qui c'est, Notch ? + + + Mojang a reçu plus de récompenses qu'il n'a d'employés ! + + + De vraies célébrités jouent à Minecraft ! + + + Notch a plus d'un million d'abonnés sur Twitter ! + + + Les Suédois ne sont pas tous blonds. Certains sont même roux, comme Jens de Mojang ! + + + Une mise à jour du jeu sera disponible un jour ou l'autre ! + + + Deux coffres placés côte à côte formeront un grand coffre. + + + Si vous bâtissez des structures de laine à l'air libre, méfiez-vous : les éclairs peuvent y mettre le feu. + + + Un seul seau de lave suffit à fondre 100 blocs dans un four. + + + L'instrument joué par un bloc musical dépend du matériau sur lequel il est posé. + + + La lave peut mettre plusieurs minutes à disparaître TOTALEMENT lorsque le bloc source est détruit. + + + La pierre taillée résiste aux boules de feu des Ghasts et convient donc très bien à la protection des portails. + + + Les blocs susceptibles d'émettre de la lumière (torches, glowstone et citrouilles-lanternes, entre autres) peuvent faire fondre la neige et la glace. + + + Les zombies et squelettes peuvent survivre à la lumière du jour s'ils sont dans l'eau. + + + Les poules pondent un oeuf toutes les 5 à 10 minutes. + + + L'obsidienne ne peut être extraite qu'à l'aide d'une pioche en diamant. + + + Les creepers sont la source de poudre à canon la plus facilement exploitable. + + + Si vous attaquez un loup, tous les loups à proximité immédiate deviendront aussitôt agressifs ; une propriété qu'ils partagent avec les cochons zombies. + + + Les loups ne peuvent pas entrer dans le Nether. + + + Les loups n'attaquent pas les creepers. + Nécessaire pour miner les blocs de pierre et le minerai. - - Sert à travailler les blocs de bois plus vite qu'à mains nues. + + Sert d'ingrédient dans la recette du gâteau et pour les potions. - - Sert à faucher les blocs de terre et d'herbe pour les préparer à la culture. + + Si activé, permet de produire une décharge électrique. Reste activé/désactivé jusqu'à nouvelle utilisation. - - Pour activer les portes en bois, vous devez les actionner, les frapper ou utiliser de la redstone. + + 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é. - - Les portes en fer ne peuvent s'ouvrir qu'au moyen de redstone, de boutons ou d'interrupteurs. + + Restitue 2{*ICON_SHANK_01*}. Permet de confectionner une pomme dorée. - - NOT USED + + 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. - - NOT USED + + Restitue 2{*ICON_SHANK_01*}. La manger a une chance de vous empoisonner. - - NOT USED + + Sert dans les circuits de redstone comme répéteur, retardateur et/ou diode. - - NOT USED + + Sert à diriger les chariots de mine. - - Confère au porteur une armure de 1. + + 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. - - Confère au porteur une armure de 3. + + 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. - - Confère au porteur une armure de 2. + + Sert à produire une décharge électrique une fois actionné. Reste activé pendant environ une seconde avant de se désactiver. - - Confère au porteur une armure de 1. + + Sert à entreposer et à distribuer aléatoirement des objets lorsqu'on lui applique une charge de redstone. - - Confère au porteur une armure de 2. + + 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. - - Confère au porteur une armure de 5. + + Restitue 2,5{*ICON_SHANK_01*}. S'obtient en cuisant un poisson cru dans un four. - - Confère au porteur une armure de 4. + + Restitue 1{*ICON_SHANK_01*}. - - Confère au porteur une armure de 1. + + Restitue 1{*ICON_SHANK_01*}. - - Confère au porteur une armure de 2. + + Restitue 3{*ICON_SHANK_01*}. - - Confère au porteur une armure de 6. + + Sert de munitions pour les arcs. - - Confère au porteur une armure de 5. + + Restitue 2,5{*ICON_SHANK_01*}. - - Confère au porteur une armure de 2. + + Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. - - Confère au porteur une armure de 2. + + Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. En manger a une chance de vous empoisonner. + + + Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. + + + Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant de la viande de porc crue dans un four. + + + Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. Sert également à nourrir un ocelot pour l'apprivoiser. + + + Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant du poulet cru dans un four. + + + Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. + + + Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant du bœuf cru dans un four. + + + Sert à véhiculer sur les rails joueurs, animaux et monstres. + + + Sert de colorant pour la confection de laine bleu ciel. + + + Sert de colorant pour la confection de laine bleu cyan. + + + Sert de colorant pour la confection de laine violette. + + + Sert de colorant pour la confection de laine vert clair. + + + Sert de colorant pour la confection de laine grise. + + + 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. + + + Sert de colorant pour la confection de laine magenta. + + + Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace. Peut s'utiliser sous l'eau. + + + Sert à créer des livres et cartes. + + + Sert à créer une bibliothèque ou peut être enchanté. + + + Sert de colorant pour la confection de laine bleue. + + + Permet d'écouter des disques. + + + Utiles pour confectionner des outils, armes et armures très robustes. + + + Sert de colorant pour la confection de laine orange. + + + Prélevée sur les moutons. Se teint avec les colorants. + + + Sert de matériau de construction et se teint avec les colorants. Cette recette n'est pas recommandée, puisque la laine s'obtient facilement sur les moutons. + + + Sert de colorant pour la confection de laine noire. + + + Sert à acheminer des marchandises sur les rails. + + + Se déplace sur les rails et propulse les autres chariots de mine lorsqu'on l'alimente au charbon. + + + Sert à circuler dans l'eau plus rapidement qu'à la nage. + + + Sert de colorant pour la confection de laine verte. + + + Sert de colorant pour la confection de laine rouge. + + + Fait instantanément arriver à maturité les cultures, arbres, herbes hautes, champignons géants et fleurs. Peut aussi servir dans les recettes de colorant. + + + Sert de colorant pour la confection de laine rose. + + + Sert de colorant pour la confection de laine marron ou d'ingrédients pour les cookies, et permet de faire pousser du cacao. + + + Sert de colorant pour la confection de laine argentée. + + + Sert de colorant pour la confection de laine jaune. + + + Permet d'attaquer à distance à l'aide de flèches. Confère au porteur une armure de 5. @@ -621,18 +4267,18 @@ Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jet Confère au porteur une armure de 1. + + Confère au porteur une armure de 5. + + + Confère au porteur une armure de 2. + + + Confère au porteur une armure de 2. + Confère au porteur une armure de 3. - - Confère au porteur une armure de 8. - - - Confère au porteur une armure de 6. - - - Confère au porteur une armure de 3. - Un lingot étincelant qui sert à la confection d'outils. Créé en fondant du minerai dans le four. @@ -642,60 +4288,60 @@ Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jet 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. + + Confère au porteur une armure de 8. + + + Confère au porteur une armure de 6. + + + Confère au porteur une armure de 3. + + + Confère au porteur une armure de 6. + + + Les portes en fer ne peuvent s'ouvrir qu'au moyen de redstone, de boutons ou d'interrupteurs. + + + Confère au porteur une armure de 1. + + + Confère au porteur une armure de 3. + + + Sert à travailler les blocs de bois plus vite qu'à mains nues. + + + Sert à faucher les blocs de terre et d'herbe pour les préparer à la culture. + + + Pour activer les portes en bois, vous devez les actionner, les frapper ou utiliser de la redstone. + + + Confère au porteur une armure de 2. + + + Confère au porteur une armure de 4. + + + Confère au porteur une armure de 1. + + + Confère au porteur une armure de 2. + + + Confère au porteur une armure de 1. + + + Confère au porteur une armure de 2. + + + Confère au porteur une armure de 5. + Sert à la création d'escaliers compacts. - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. - - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre forment un bloc de taille normale. - - - Sert à produire de la lumière. Les torches permettent aussi de fondre la neige et la glace. - - - Sert de matériau de construction, transformable en de nombreux objets. Se taille dans n'importe quel type de bois. - - - Sert de matériau de construction. La gravité n'a pas d'effet sur lui, contrairement au sable normal. - - - Sert de matériau de construction. - - - Sert à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que des poignées d'armes et manches d'outils. - - - Permet d'accélérer le 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. - - - Permet de créer un éventail d'objets plus riche que l'artisanat classique. - - - Permet de fondre le minerai, de créer du charbon et du verre, de cuisiner le poisson et la viande de porc. - - - Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. - - - Sert de rempart impossible à franchir. Compte pour 1,5 bloc de hauteur pour les joueurs, animaux et monstres, mais pour un seul bloc de hauteur pour les autres blocs. - - - Permet de grimper et de descendre. - - - À 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. - - - Affiche les messages que les autres joueurs et vous saisissez. - - - Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace. Peut s'utiliser sous l'eau. - - - Sert à déclencher des explosions. Une fois placé, appliquez une décharge électrique ou utilisez un briquet à silex pour l'activer. - Sert à contenir du ragoût de champignons. Vous conservez le bol une fois le ragoût avalé. @@ -705,18 +4351,18 @@ Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jet Sert à contenir et transporter de l'eau. + + Affiche les messages que les autres joueurs et vous saisissez. + + + Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace. Peut s'utiliser sous l'eau. + + + Sert à déclencher des explosions. Une fois placé, appliquez une décharge électrique ou utilisez un briquet à silex pour l'activer. + Sert à contenir et transporter de la lave. - - Sert à contenir et transporter du lait. - - - Sert à faire du feu et à allumer la mèche du TNT, ouvre un portail qui vient d'être fabriqué. - - - Sert à pêcher le poisson. - Affiche la position du soleil et de la lune. @@ -726,1388 +4372,502 @@ Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jet Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un itinéraire. - - Permet d'attaquer à distance à l'aide de flèches. + + Sert à contenir et transporter du lait. - - Sert de munitions pour les arcs. + + Sert à faire du feu et à allumer la mèche du TNT, ouvre un portail qui vient d'être fabriqué. - - Restitue 2,5{*ICON_SHANK_01*}. + + Sert à pêcher le poisson. - - Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. + + À 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. - - Restitue 1{*ICON_SHANK_01*}. + + Sert de matériau de construction, transformable en de nombreux objets. Se taille dans n'importe quel type de bois. - - Restitue 1{*ICON_SHANK_01*}. + + Sert de matériau de construction. La gravité n'a pas d'effet sur lui, contrairement au sable normal. - - Restitue 3{*ICON_SHANK_01*}. + + Sert de matériau de construction. - - Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. En manger a une chance de vous empoisonner. - - - Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant du poulet cru dans un four. - - - Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. - - - Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant du bœuf cru dans un four. - - - Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. - - - Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant de la viande de porc crue dans un four. - - - Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. Sert également à nourrir un ocelot pour l'apprivoiser. - - - Restitue 2,5{*ICON_SHANK_01*}. S'obtient en cuisant un poisson cru dans un four. - - - Restitue 2{*ICON_SHANK_01*}. Permet de confectionner une pomme dorée. - - - 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. - - - Restitue 2{*ICON_SHANK_01*}. La manger a une chance de vous empoisonner. - - - Sert d'ingrédient dans la recette du gâteau et pour les potions. - - - Si activé, permet de produire une décharge électrique. Reste activé/désactivé jusqu'à nouvelle utilisation. - - - 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é. - - - Sert dans les circuits de redstone comme répéteur, retardateur et/ou diode. - - - Sert à produire une décharge électrique une fois actionné. Reste activé pendant environ une seconde avant de se désactiver. - - - Sert à entreposer et à distribuer aléatoirement des objets lorsqu'on lui applique une charge de redstone. - - - Joue une note une fois actionné. Frappez-le pour changer la hauteur de note. Déposez-le sur des blocs différents pour changer le type d'instrument. - - - Sert à diriger les chariots de mine. - - - Une fois alimenté en énergie, accélère les chariots de mine qui l'empruntent. Si le rail n'est pas alimenté, les chariots interrompent aussitôt leur trajet. - - - Fonctionne comme une plaque de détection (diffuse un signal de redstone si alimenté), mais ne peut être activé que par un chariot de mine. - - - Sert à véhiculer sur les rails joueurs, animaux et monstres. - - - Sert à acheminer des marchandises sur les rails. - - - Se déplace sur les rails et propulse les autres chariots de mine lorsqu'on l'alimente au charbon. - - - Sert à circuler dans l'eau plus rapidement qu'à la nage. - - - Prélevée sur les moutons. Se teint avec les colorants. - - - Sert de matériau de construction et se teint avec les colorants. Cette recette n'est pas recommandée, puisque la laine s'obtient facilement sur les moutons. - - - Sert de colorant pour la confection de laine noire. - - - Sert de colorant pour la confection de laine verte. - - - Sert de colorant pour la confection de laine marron ou d'ingrédients pour les cookies, et permet de faire pousser du cacao. - - - Sert de colorant pour la confection de laine argentée. - - - Sert de colorant pour la confection de laine jaune. - - - Sert de colorant pour la confection de laine rouge. - - - Fait instantanément arriver à maturité les cultures, arbres, herbes hautes, champignons géants et fleurs. Peut aussi servir dans les recettes de colorant. - - - Sert de colorant pour la confection de laine rose. - - - Sert de colorant pour la confection de laine orange. - - - Sert de colorant pour la confection de laine vert clair. - - - Sert de colorant pour la confection de laine grise. - - - 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. - - - Sert de colorant pour la confection de laine bleu ciel. - - - Sert de colorant pour la confection de laine bleu cyan. - - - Sert de colorant pour la confection de laine violette. - - - Sert de colorant pour la confection de laine magenta. - - - Sert de colorant pour la confection de laine bleue. - - - Permet d'écouter des disques. - - - Utiles pour confectionner des outils, armes et armures très robustes. - - - Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace. Peut s'utiliser sous l'eau. - - - Sert à créer des livres et cartes. - - - Sert à créer une bibliothèque ou peut être enchanté. - - - Permet d'obtenir des enchantements plus puissants lorsqu'on en place autour de la table d'enchantement. - - - Sert de décoration. - - - Se mine à l'aide d'une pioche en fer (ou mieux). Transformé en lingots d'or dans le four. - - - Se mine à l'aide d'une pioche en pierre (ou mieux). Transformé en lingots de fer dans le four. - - - Se mine avec une pioche pour prélever du charbon. - - - Se mine avec une pioche en pierre pour prélever du lapis-lazuli. - - - Se mine avec une pioche en fer pour prélever des diamants. - - - Se mine avec une pioche en fer pour prélever de la poudre de redstone. - - - Se mine avec une pioche pour prélever de la pierre taillée. - - - Prélevée à l'aide d'une pelle. Sert de matériau de construction. - - - Une fois plantée, peut prospérer et devenir un arbre. - - - Impossible à briser. - - - Enflamme n'importe quoi à son contact. Peut être prélevée dans un seau. - - - Prélevé à l'aide d'une pelle. Peut être fondu en verre dans le four. Soumis à la gravité s'il ne repose sur aucun autre bloc. - - - Prélevé à l'aide d'une pelle. Donne parfois du silex lorsqu'il est travaillé. Soumis à la gravité s'il ne repose sur aucun autre bloc. - - - Travaillé à la hache. Transformé en planches ou utilisé comme combustible. - - - Créé par la fusion du sable dans un four. Peut servir de matériau de construction, mais sera détruit si vous tentez de le miner. - - - Obtenue en travaillant la pierre à l'aide d'une pioche. Peut servir à la construction d'un four ou à la fabrication d'outils en pierre. - - - Obtenue par la cuisson d'argile dans un four. - - - Peut être transformée en briques à la chaleur d'un four. - - - Une fois brisée, produit des boules d'argile qui peuvent être transformées en briques dans le four. - - - Un moyen peu encombrant d'entreposer des boules de neige. - - - Se creuse à l'aide d'une pelle pour créer des boules de neige. - - - Produit parfois des graines de blé si détruite. - - - Transformable en colorant. - - - Combiné à un bol, sert à la préparation de ragoûts. - - - Ne peut être travaillée qu'à l'aide d'une pioche en diamant. Résulte d'un mélange d'eau et de lave inerte. Sert à la construction des portails. - - - Libère des monstres dans l'environnement. - - - Se place au sol pour créer un câble conducteur d'électricité. Ajouté à une potion, permet d'en augmenter la durée. - - - Une fois arrivées à maturité, les cultures peuvent être récoltées pour produire du blé. - - - Un sol fertile préparé pour la culture des graines. - - - Passé au four, sert à la confection d'un colorant vert. - - - Sert à la confection de sucre. - - - Peut servir de casque ou se combiner avec une torche pour produire une citrouille-lanterne. C'est également l'ingrédient principal de la tarte à la citrouille. - - - Brûle indéfiniment si embrasé. - - - Ralentit le mouvement de toute créature qui circule dessus. - - - Emprunter un portail permet de circuler entre la Surface et le Nether. - - - Alimente le four en combustible. Sert à la confection des torches. - - - Prélevé sur les cadavres d'araignées. Sert à la confection des arcs et des cannes à pêche, et peut-être placé au sol comme fil de détente pour actionner des crochets. - - - Prélevé sur les cadavres de poulets. Sert à la confection des flèches. - - - Prélevé sur les cadavres de creepers. Sert à la confection de TNT et de potions. - - - Plantées dans une terre labourée, produisent des cultures. Assurez-vous que les graines soient assez exposées au soleil ! - - - Obtenu par la récolte des cultures. Sert à la préparation d'aliments. - - - Obtenu en creusant le gravier. Sert à la confection d'un briquet à silex. - - - Utilisée sur un cochon, vous permet de le chevaucher. Vous pouvez ensuite diriger le cochon à l'aide d'une carotte et d'un bâton. - - - Obtenue en creusant la neige. Peut servir de projectile. - - - Prélevé sur les cadavres de vaches. Sert à la confection d'armures ou de livres. - - - Prélevée sur les cadavres de slimes. Sert d'ingrédient pour les potions et permet de confectionner des pistons collants. - - - Produit aléatoirement par les poules. Sert à la préparation d'aliments. - - - Obtenue en minant un bloc de glowstone. Sert à la reconstitution de blocs de glowstone et combiné à une potion, permet d'en augmenter la puissance. - - - Prélevé sur les cadavres de squelettes. Sert à la confection de poudre d'os. Donnez-en à manger à un loup pour le domestiquer. - - - Obtenu sur les creepers tués par un squelette. À lire dans un juke-box. - - - Éteint les flammes et contribue à la prospérité des cultures. À prélever dans un seau. - - - Une fois détruit, produit une pousse d'arbre à replanter pour créer un nouvel arbre. - - - Sert à la construction et à la décoration. Se trouve dans les donjons. - - - Sert à tondre la laine des moutons et à récolter les blocs de feuillage. - - - 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. - - - 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. - - - Faite de blocs de pierre. On en trouve généralement dans les forts. - - - Sert de clôture, comparable aux barrières. - - - Comparable à une porte, mais s'utilise principalement avec une barrière. - - - Se fabrique avec des tranches de pastèque. - - - Des blocs transparents qui peuvent servir d'alternative aux blocs de verre. - - - À planter pour faire pousser des citrouilles. - - - À planter pour faire pousser des pastèques. - - - Produite par les Enderman à leur mort. Lorsqu'elle est lancée, le joueur est téléporté jusqu'à la zone d'impact de la perle du néant et perdra un peu de santé. - - - Un bloc de terre couronnée de gazon. Se prélève à l'aide d'une pelle. Sert de matériau de construction. - - - Sert à la construction et à la décoration. - - - Ralentit vos mouvements lorsque vous passez à travers. Utilisez des cisailles pour la détruire et prélever du fil. - - - Produit un poisson d'argent lorsqu'elle est détruite. Peut également produire un poisson d'argent si à proximité d'un autre poisson d'argent en train d'être attaqué. - - - Lorsqu'il est placé, pousse sans interruption. Se prélève avec des cisailles. Peut-être utilisé comme une échelle. - - - Glissante lorsque vous 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. - - - Peut servir de décoration. - - - 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. - - - Sert en alchimie. Produite par les Ghasts à leur mort. - - - Produite par les Cochons zombies à leur mort. Les Cochons zombies se rencontrent dans le Nether. Permet de confectionner des potions. - - - Sert en alchimie. Pousse dans les forteresses du Nether. Peut aussi être plantée dans du sable des âmes. - - - Peut avoir divers effets selon ce sur quoi elle est utilisée. - - - Peut être remplie d'eau et servir d'ingrédient de base d'une potion distillée dans l'alambic. - - - Aliment vénéneux et ingrédient alchimique. Se trouve sur les cadavres d'araignées ou d'araignées bleues. - - - Sert en alchimie. Intervient principalement dans la création de potions néfastes. - - - Sert en alchimie et intervient dans la fabrication d'objets comme l'oeil d'Ender ou la crème de magma. - - - Sert en alchimie. - - - Sert à la création de potions simples et volatiles. - - - 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. - - - 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. - - - Sert en alchimie. - - - Comparable aux blocs d'herbe, mais très efficace pour faire pousser des champignons. - - - Flotte sur l'eau et permet de marcher dessus. - - - Sert à construire des forteresses du Nether. Invulnérable aux boules de feu des Ghasts. - - - Sert dans les forteresses du Nether. - - - Se trouve dans les forteresses du Nether et produit des verrues du Nether lorsqu'elle est brisée. - - - Permet au joueur, moyennant ses points d'expérience, d'enchanter épées, pioches, haches, pelles, arcs et armures. - - - S'active à l'aide de l'oeil d'Ender et permet au joueur de voyager jusqu'à la dimension de l'Ender. - - - Sert à créer un portail de l'Ender. - - - Un type de bloc rencontré dans l'Ender. Elle est dotée d'une résistance très élevée aux explosions et constitue donc un matériau de construction très utile. - - - Ce bloc est créé lorsque le Dragon de l'Ender est terrassé. - - - Lancée, elle produit des orbes d'expérience qui augmentent vos points d'expérience une fois ramassés. - - - Utile pour enflammer des choses ou pour provoquer des incendies lorsqu'on en place dans un distributeur. - - - Similaires à une vitrine, affichent les objets ou blocs qui y sont placés. - - - Lancez-le pour faire apparaître une créature du type indiqué. - - + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre forment un bloc de taille normale. - - Créés en faisant fondre du Netherrack dans un four. Peuvent être transformés en blocs de briques du Nether. + + Sert à produire de la lumière. Les torches permettent aussi de fondre la neige et la glace. - - Émet de la lumière quand elle est activée. + + Sert à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que des poignées d'armes et manches d'outils. - - Leur récolte permet d'obtenir des fèves de cacao. + + Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. - - Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. + + 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. - - Pieuvre + + Permet de grimper et de descendre. - - Produit une poche d'encre une fois tuée. + + 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. - - Vache + + Permet de créer un éventail d'objets plus riche que l'artisanat classique. - - Produit du cuir une fois tuée. Utilisez un seau pour la traire. - - - Mouton - - - 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. - - - Poulet - - - Produit des plumes une fois tué. Pond aussi des oeufs, à 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 ripostera alors sans hésiter. 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 et des os 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. Il lance des boules de neige sur les ennemis de son 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. Peut être créé à partir de blocs de fer et de citrouilles. - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - Lead Game Programmer Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Épée en bois - - - Épée en pierre - - - Épée en fer - - - Épée en diamant - - - Épée en or - - - Pelle en bois - - - Pelle en pierre - - - Pelle en fer - - - Pelle en diamant - - - Pelle en or - - - Pioche en bois - - - Pioche en pierre - - - Pioche en fer - - - Pioche en diamant - - - Pioche en or - - - Hache en bois - - - Hache en pierre + + Permet de fondre le minerai, de créer du charbon et du verre, de cuisiner le poisson et la viande de porc. Hache en fer - - Hache en diamant + + Lampe de redstone - - Hache en or + + Escalier en bois tropical - - Houe en bois + + Escalier en bouleau - - Houe en pierre + + Commandes actuelles - - Houe en fer + + Crâne - - Houe en diamant + + Cacao - - Houe en or + + Escalier en sapin - - Porte en bois + + Oeuf de Dragon - - Porte en fer + + Pierre blanche - - Casque en mailles + + Cadre de portail de l'Ender - - Plastron en mailles + + Escalier en grès - - Jambières en mailles + + Fougère - - Bottes en mailles + + Arbuste - - Coiffe en cuir + + Config. - - Casque en fer + + Artisanat - - Casque en diamant + + Utiliser - - Casque en or + + Action - - Tunique de cuir + + Se faufiler/Voler Bas - - Plastron en fer + + Se faufiler - - Plastron en diamant + + Lâcher - - Plastron en or + + Changer d'objet - - Pantalon en cuir + + Pause - - Jambières en fer + + Regarder - - Jambières en diamant + + Se déplacer/Courir - - Jambières en or + + Inventaire - - Bottes en cuir + + Sauter/Voler Haut - - Bottes en fer + + Sauter - - Bottes en diamant + + Portail de l'Ender - - Bottes en or + + Queue de citrouille - - Lingot de fer + + Pastèque - - Lingot d'or + + Vitre - - Seau + + Portillon - - Seau d'eau + + Lierre - - Seau de lave + + Queue de pastèque - - Briquet à silex + + Barreaux de fer - - Pomme + + Pierres craquelées - - Arc + + Pierres taillées moussues - - Flèche + + Briques de pierre - - Charbon + + Champignon - - Charbon de bois + + Champignon - - Diamant + + Blocs de pierre taillée - - Bâton + + Escalier en briques - - Bol - - - Ragoût de champignons - - - Fil - - - Plume - - - Poudre à canon - - - Graines de blé - - - Blé - - - Pain - - - Silex - - - Viande de porc crue - - - Viande de porc cuite - - - Peinture - - - Pomme dorée - - - Panneau - - - Chariot de mine - - - Selle - - - Redstone - - - Boule de neige - - - Bateau - - - Cuir - - - Seau de lait - - - Brique - - - Argile - - - Canne à sucre - - - Papier - - - Livre - - - Boule de slime - - - Chariot avec coffre - - - Chariot de mine avec four - - - Oeuf - - - Boussole - - - Canne à pêche - - - Montre - - - Poudre glowstone - - - Poisson cru - - - Poisson cuit - - - Poudre de colorant - - - Poche d'encre - - - Pétale de rose - - - Vert de cactus - - - Fèves de cacao - - - Lapis-lazuli - - - Colorant violet - - - Colorant bleu cyan - - - Colorant gris clair - - - Colorant gris - - - Colorant rose - - - Colorant vert clair - - - Pétale de pissenlit - - - Colorant bleu ciel - - - Colorant magenta - - - Colorant orange - - - Poudre d'os - - - Os - - - Sucre - - - Gâteau - - - Lit - - - Répéteur de redstone - - - Cookie - - - Carte - - - Disque vinyle "13" - - - Disque vinyle "cat" - - - Disque vinyle "blocks" - - - Disque vinyle "chirp" - - - Disque vinyle "far" - - - Disque vinyle "mall" - - - Disque vinyle "mellohi" - - - Disque vinyle "stal" - - - Disque vinyle "strad" - - - Disque vinyle "ward" - - - Disque vinyle "11" - - - Disque vinyle "where are we now" - - - Cisailles - - - Graines de citrouille - - - Graines de pastèque - - - Poulet cru - - - Poulet cuit - - - Boeuf cru - - - Steak - - - Chair putréfiée - - - Ender Pearl - - - Tranche de pastèque - - - Bâton de feu - - - Larme de Ghast - - - Pépite d'or - - + Verrue du Nether - - Potion{*splash*}{*prefix*}{*postfix*} + + Escalier en Nether - - Fiole + + Barrière en Nether - - Fiole d'eau - - - Oeil d'araignée - - - Oeil d'araignée fermenté - - - Poudre de feu - - - Crème de magma - - - Alambic - - + Chaudron - - Oeil d'Ender + + Alambic - - Pastèque scintillante + + Table d'enchantement - - Fiole d'expérience - - - Boule de feu - - - Boule de feu (ch. bois) - - - Boule de feu charbon - - - Cadre - - - Fait apparaître {*CREATURE*} - - + Brique du Nether - - Crâne + + Pierre taillée de poisson d'argent - - Crâne de squelette + + Pierre de poisson d'argent - - Crâne de wither squelette + + Escalier (brique pierre) - - Tête de zombie + + Nénuphar - - Crâne + + Mycélium - - Crâne de %s + + Brique en pierre de poisson d'argent - - Crâne de creeper + + Changer mode caméra - - Pierre + + 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. - - Bloc d'herbe + + À 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. - - Terre + + 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. - - Pierre taillée + + Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} - - Planches en chêne + + 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*} - - Planches en sapin + + 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. - - Planches en bouleau + + Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. - - Planches (bois tropical) + + 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. - - Pousse d'arbre + + Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. - - Pousse de chêne + + Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. - - Pousse d'épicéa + + 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. - - Pousse de bouleau + + 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. - - Pousse d'arbre tropical + + Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. - - Adminium + + 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*} - - Eau + + É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. - - Lave + + Ouvrir le conteneur - - Sable + + 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*} - - Grès + + 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*} - - Gravier + + 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. - - Minerai d'or + + Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. - - Minerai de fer + + 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*} - - Minerai de charbon + + 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. - - Bois + + Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. - - Bois de chêne + + 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*} - - Bois d'épicéa + + 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*} - - Bois de bouleau + + Pointez le réticule sur l'établi et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. - - Bois tropical + + L'établi sélectionné, placez le réticule à l'emplacement voulu et utilisez{*CONTROLLER_ACTION_USE*} pour placer un établi. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Config. 1 + + + Déplacement (en vol) + + + Joueurs/Invitation + + + + + + Config. 3 + + + Config. 2 + + + + + + + + + + + + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour commencer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + + + + + + + + + + + + + + + + + + + + + + + + + + + Bloc de poisson d'argent + + + Dalle de pierre + + + Une façon plus compacte de stocker le fer. + + + Bloc de fer + + + Dalle de chêne + + + Dalle de grès + + + Dalle de pierre + + + Une façon plus compacte de stocker l'or. + + + Fleur + + + Laine blanche + + + Laine orange + + + Bloc d'or + + + Champignon + + + Rose + + + Dalle de pierre taillée + + + Bibliothèque + + + TNT + + + Briques + + + Torche + + + Obsidienne + + + Pierre moussue + + + Dalles du Nether + + + Dalle de chêne + + + Dalle en briques de pierre + + + Dalle en briques + + + Dalle de bois tropical + + + Dalle de bouleau + + + Dalle de sapin + + + Laine magenta + + + Feuilles de bouleau + + + Feuilles d'épicéa + + + Feuilles de chêne + + + Verre + + + Éponge + + + Feuilles tropicales + + + Feuillage Chêne @@ -2118,2851 +4878,950 @@ Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jet Bouleau - - Feuillage + + Bois d'épicéa - - Feuilles de chêne + + Bois de bouleau - - Feuilles d'épicéa - - - Feuilles de bouleau - - - Feuilles tropicales - - - Éponge - - - Verre + + Bois tropical Laine - - Laine noire - - - Laine rouge - - - Laine verte - - - Laine marron - - - Laine bleue - - - Laine violette - - - Laine bleu cyan - - - Laine gris clair + + Laine rose Laine grise - - Laine rose - - - Laine vert clair - - - Laine jaune + + Laine gris clair Laine bleu ciel - - Laine magenta + + Laine jaune - - Laine orange + + Laine vert clair - - Laine blanche + + Laine bleu cyan - - Fleur + + Laine verte - - Rose + + Laine rouge - - Champignon + + Laine noire - - Bloc d'or + + Laine violette - - Une façon plus compacte de stocker l'or. + + Laine bleue - - Bloc de fer - - - Une façon plus compacte de stocker le fer. - - - Dalle de pierre - - - Dalle de pierre - - - Dalle de grès - - - Dalle de chêne - - - Dalle de pierre taillée - - - Dalle en briques - - - Dalle en briques de pierre - - - Dalle de chêne - - - Dalle de sapin - - - Dalle de bouleau - - - Dalle de bois tropical - - - Dalles du Nether - - - Briques - - - TNT - - - Bibliothèque - - - Pierre moussue - - - Obsidienne - - - Torche + + Laine marron Torche (charbon) - - Torche (char. de bois) - - - Feu - - - Générateur de monstres - - - Escalier en chêne - - - Coffre - - - Poudre de redstone - - - Minerai de diamant - - - Bloc de diamant - - - Une façon plus compacte de stocker les diamants. - - - Établi - - - Cultures - - - Terre labourée - - - Four - - - Panneau - - - Porte en bois - - - Échelle - - - Rail - - - Rail de propulsion - - - Rail de détection - - - Escalier en pierre - - - Levier - - - Plaque de détection - - - Porte en fer - - - Minerai de redstone - - - Torche de redstone - - - Touche - - - Neige - - - Glace - - - Cactus - - - Argile - - - Canne à sucre - - - Juke-box - - - Barrière - - - Citrouille - - - Citrouille-lanterne - - - Netherrack + + Glowstone Sable des âmes - - Glowstone - - - Portail - - - Minerai de lapis-lazuli + + Netherrack Bloc de lapis-lazuli + + Minerai de lapis-lazuli + + + Portail + + + Citrouille-lanterne + + + Canne à sucre + + + Argile + + + Cactus + + + Citrouille + + + Barrière + + + Juke-box + Une façon plus compacte de stocker le lapis lazuli. - - Distributeur - - - Bloc musical - - - Gâteau - - - Lit - - - Toile - - - Herbes hautes - - - Arbuste mort - - - Diode - - - Coffre verrouillé - Trappe - - Laine (toutes couleurs) + + Coffre verrouillé - - Piston + + Diode Piston collant - - Bloc de poisson d'argent + + Piston - - Briques de pierre + + Laine (toutes couleurs) - - Pierres taillées moussues + + Arbuste mort - - Pierres craquelées + + Gâteau - - Blocs de pierre taillée + + Bloc musical - - Champignon + + Distributeur - - Champignon + + Herbes hautes - - Barreaux de fer + + Toile - - Vitre + + Lit - - Pastèque + + Glace - - Queue de citrouille + + Établi - - Queue de pastèque + + Une façon plus compacte de stocker les diamants. - - Lierre + + Bloc de diamant - - Portillon + + Four - - Escalier en briques + + Terre labourée - - Escalier (brique pierre) + + Cultures - - Pierre de poisson d'argent + + Minerai de diamant - - Pierre taillée de poisson d'argent + + Générateur de monstres - - Brique en pierre de poisson d'argent + + Feu - - Mycélium + + Torche (char. de bois) - - Nénuphar + + Poudre de redstone - - Brique du Nether + + Coffre - - Barrière en Nether + + Escalier en chêne - - Escalier en Nether + + Panneau - - Verrue du Nether + + Minerai de redstone - - Table d'enchantement + + Porte en fer - - Alambic + + Plaque de détection - - Chaudron + + Neige - - Portail de l'Ender + + Touche - - Cadre de portail de l'Ender + + Torche de redstone - - Pierre blanche + + Levier - - Oeuf de Dragon + + Rail - - Arbuste + + Échelle - - Fougère + + Porte en bois - - Escalier en grès + + Escalier en pierre - - Escalier en sapin + + Rail de détection - - Escalier en bouleau - - - Escalier en bois tropical - - - Lampe de redstone - - - Cacao - - - Crâne - - - Commandes actuelles - - - Config. - - - Se déplacer/Courir - - - Regarder - - - Pause - - - Sauter - - - Sauter/Voler Haut - - - Inventaire - - - Changer d'objet - - - Action - - - Utiliser - - - Artisanat - - - Lâcher - - - Se faufiler - - - Se faufiler/Voler Bas - - - Changer mode caméra - - - Joueurs/Invitation - - - Déplacement (en vol) - - - Config. 1 - - - Config. 2 - - - Config. 3 - - - <![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;]]> - - - <![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*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. - - - {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour commencer le didacticiel.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. - - - Le principe de Minecraft consiste à placer des blocs pour construire tout ce qu'on peut imaginer. La nuit, les monstres sont de sortie : tâchez donc d'aménager un abri avant le coucher du soleil. - - - Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. - - - Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. - - - Pour 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. - - - Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. - - - Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs. - - - Maintenez{*CONTROLLER_ACTION_ACTION*} pour détruire 4 blocs de bois (troncs d'arbre).{*B*}Lorsqu'un bloc est détruit, tenez-vous à proximité de l'objet flottant apparu pour le ramasser : l'objet est alors déposé dans votre inventaire. - - - Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. - - - Votre inventaire se remplira à mesure que vous prélèverez des ressources et confectionnerez des objets.{*B*} - Appuyez sur{*CONTROLLER_ACTION_INVENTORY*} pour ouvrir l'inventaire. - - - À force de vous déplacer, de miner et d'attaquer, la barre de nourriture{*ICON_SHANK_01*} se vide progressivement. Courir et sauter après une course épuisent bien plus rapidement la barre de nourriture que la marche et les sauts classiques. - - - Si vous perdez de la santé, mais que votre jauge de nourriture comporte au moins 9{*ICON_SHANK_01*}, votre santé se reconstituera automatiquement. Manger des aliments remplira votre barre de nourriture. - - - Un aliment à la main, maintenez{*CONTROLLER_ACTION_USE*} pour le manger et remplir votre barre de nourriture. Vous ne pouvez pas manger si votre barre de nourriture est pleine. - - - Votre barre de nourriture est presque vide et vous avez perdu de la santé. Mangez le steak qui apparaît dans votre inventaire pour remplir votre barre de nourriture et vous soigner.{*ICON*}364{*/ICON*} - - - Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} - - - La confection d'un certain nombre d'objets implique plusieurs étapes. Maintenant que vous avez des planches à disposition, l'éventail d'objets à fabriquer s'est enrichi. Créez un établi.{*CraftingTableIcon*} - - - Pour accélérer la collecte de ressources, vous pouvez fabriquer des outils dédiés à cette tâche. Certains outils possèdent un manche taillé dans un bâton. Fabriquez maintenant des bâtons.{*SticksIcon*} - - - Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. - - - Utilisez{*CONTROLLER_ACTION_USE*} pour vous servir d'objets, interagir avec les éléments du décor et placer vos créations. Travaillez les objets déjà placés avec un outil adapté pour les ramasser. - - - L'établi sélectionné, placez le réticule à l'emplacement voulu et utilisez{*CONTROLLER_ACTION_USE*} pour placer un établi. - - - Pointez le réticule sur l'établi et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. - - - La pelle vous permet de creuser plus rapidement les matériaux meubles, comme la terre et la neige. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes. Créez une pelle en bois.{*WoodenShovelIcon*} - - - La hache accélère le travail du bois et des blocs en bois. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes. Créez une hache en bois.{*WoodenHatchetIcon*} - - - La pioche accélère le travail des matériaux solides, comme la pierre et le minerai. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes pour miner les matériaux les plus coriaces. Créez une pioche en bois.{*WoodenPickaxeIcon*} - - - Ouvrir le conteneur - - - Évitez de vous laisser surprendre par la nuit. Vous pouvez confectionner des armes et armures, mais le plus sûr reste de vous aménager un abri. - - - Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. - - - Vous aurez besoin de ressources pour achever la construction du refuge. Vous pouvez utiliser n'importe quel type de bloc pour les murs et le toit, mais vous voudrez sans doute avoir une porte et des fenêtres, ainsi qu'un peu d'éclairage. - - - Utilisez votre pioche pour miner des blocs de pierre. Une fois minés, les blocs de pierre produiront de la pierre taillée. Récupérez 8 blocs de pierre taillée et vous pourrez construire un four. Vous risquez d'avoir à déblayer la terre avant de pouvoir attaquer la pierre. Justement, la pelle est faite pour ça !{*StoneIcon*} + + Rail de propulsion Vous avez désormais une quantité suffisante de pierres taillées pour fabriquer un four. Utilisez votre établi pour le créer. - - Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. + + Canne à pêche - - 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. + + Montre - - 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. + + Poudre glowstone - - 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*} + + Chariot de mine avec four - - Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. + + Oeuf - - 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*} + + Boussole - - Vous avez terminé la première partie du didacticiel. + + Poisson cru - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer le didacticiel.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + Pétale de rose - - Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. + + Vert de cactus - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. + + Fèves de cacao - - 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é. + + Poisson cuit - - 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. + + Poudre de colorant - - Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. + + Poche d'encre - - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_BACK*}. + + Chariot avec coffre - - Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. + + Boule de neige - - L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. + + Bateau - - {*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. + + Cuir - - 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. + + Chariot de mine - - -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. + + Selle - - 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*}. + + Redstone - - 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. + + Seau de lait - - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_BACK*}. + + Papier - - Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. + + Livre - - -Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. + + Boule de slime - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. + + Brique - - {*B*} - Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. + + Argile - - {*B*} - Appuyez sur{*CONTROLLER_VK_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. + + Canne à sucre - - {*B*} - Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. + + Lapis-lazuli - - 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. + + Carte - - 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. + + Disque vinyle "13" - - 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. + + Disque vinyle "cat" - - 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. + + Lit - - La description de l'objet sélectionné est maintenant affichée. Elle vous indique pour quels usages l'objet est conçu. + + Répéteur de redstone - - La liste des ingrédients nécessaires à la fabrication de l'objet sélectionné est maintenant affichée. + + Cookie - - 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*} + + Disque vinyle "blocks" + + + Disque vinyle "mellohi" + + + Disque vinyle "stal" + + + Disque vinyle "strad" + + + Disque vinyle "chirp" + + + Disque vinyle "far" + + + Disque vinyle "mall" + + + Gâteau + + + Colorant gris + + + Colorant rose + + + Colorant vert clair + + + Colorant violet + + + Colorant bleu cyan + + + Colorant gris clair + + + Pétale de pissenlit + + + Poudre d'os + + + Os + + + Sucre + + + Colorant bleu ciel + + + Colorant magenta + + + Colorant orange + + + Panneau + + + Tunique de cuir + + + Plastron en fer + + + Plastron en diamant + + + Casque en fer + + + Casque en diamant + + + Casque en or + + + Plastron en or + + + Jambières en or + + + Bottes en cuir + + + Bottes en fer + + + Pantalon en cuir + + + Jambières en fer + + + Jambières en diamant + + + Coiffe en cuir + + + Houe en pierre + + + Houe en fer + + + Houe en diamant + + + Hache en diamant + + + Hache en or + + + Houe en bois + + + Houe en or + + + Plastron en mailles + + + Jambières en mailles + + + Bottes en mailles + + + Porte en bois + + + Porte en fer + + + Casque en mailles + + + Bottes en diamant + + + Plume + + + Poudre à canon + + + Graines de blé + + + Bol + + + Ragoût de champignons + + + Fil + + + Blé + + + Viande de porc cuite + + + Peinture + + + Pomme dorée + + + Pain + + + Silex + + + Viande de porc crue + + + Bâton + + + Seau + + + Seau d'eau + + + Seau de lave + + + Bottes en or + + + Lingot de fer + + + Lingot d'or + + + Briquet à silex + + + Charbon + + + Charbon de bois + + + Diamant + + + Pomme + + + Arc + + + Flèche + + + Disque vinyle "ward" + + + 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*} + + + 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*} 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. - - Appuyez sur{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour accéder à la catégorie d'objets que vous souhaitez créer. Sélectionnez la catégorie Outils.{*ToolsIcon*} - - - Appuyez sur{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour accéder à la catégorie d'objets que vous souhaitez créer. Sélectionnez la catégorie Structures.{*StructuresIcon*} - - - Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour sélectionner l'objet à créer. Certains objets présentent plusieurs variantes selon le type de matériau utilisé. Sélectionnez la pelle en bois.{*WoodenShovelIcon*} - - - La confection d'un certain nombre d'objets implique plusieurs étapes. Maintenant que vous avez des planches à disposition, l'éventail d'objets à fabriquer s'est enrichi. Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour sélectionner l'objet à créer. Sélectionnez l'établi.{*CraftingTableIcon*} - Vous êtes sur la bonne voie. Grâce aux outils que vous avez fabriqués, vous pourrez prélever diverses ressources plus efficacement.{*B*} Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + La 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*} + + + 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*} + + + 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*} + + + 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 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. + + + Parcourez les onglets de catégorie, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie d'objets que vous souhaitez confectionner puis utilisez{*CONTROLLER_MENU_NAVIGATE*} pour choisir l'article à créer. + + + La liste des ingrédients nécessaires à la fabrication de l'objet sélectionné est maintenant affichée. + + + La description de l'objet sélectionné est maintenant affichée. Elle vous indique pour quels usages l'objet est conçu. + + + Votre inventaire apparaît en bas à droite de l'interface d'artisanat. Cette zone peut également afficher la description de l'objet sélectionné ainsi que les ingrédients nécessaires à sa fabrication. + La fabrication de certains objets nécessite un four plutôt qu'un établi. Fabriquez un four.{*FurnaceIcon*} - - 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. + + Gravier - - 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. + + Minerai d'or + + + Minerai de fer + + + Lave + + + Sable + + + Grès + + + Minerai de charbon {*B*} Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser le four. + + 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. + + + 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. + + + Bois + + + Bois de chêne + Vous devrez alimenter le four en combustible (partie inférieure du four) et déposer l'objet à transformer dans la partie supérieure. Le four s'actionnera alors : l'objet produit apparaîtra dans l'emplacement de droite. - - La plupart des objets en bois peuvent servir de combustible. Au fil de vos aventures, vous découvrirez d'autres variétés de matériaux qui feront d'excellents combustibles. + + {*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. - - Une fois les objets fondus, vous pouvez les déplacer depuis la zone de production jusqu'à votre inventaire. Essayez divers ingrédients et observez les résultats. - - - Si vous utilisez du bois en guise d'ingrédient, vous pouvez produire du charbon de bois. Alimentez le four en combustible et déposez le bois dans l'emplacement dédié. L'opération peut durer quelque temps : profitez de ce délai pour vaquer à d'autres tâches et repassez régulièrement pour vérifier l'état d'avancement de la production. - - - Le charbon de bois peut servir de combustible et se combiner à un bâton pour créer une torche. - - - Placer du sable à l'emplacement dévolu aux ingrédients vous permet de fabriquer du verre. Créez des blocs de verre qui serviront de fenêtres dans votre abri. - - - Vous êtes dans l'interface d'alchimie. Cette interface vous permet de créer des potions aux effets variés. - - + {*B*} Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'alambic. + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'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. + + Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. - - La création d'une potion commence toujours avec une fiole d'eau. Pour créer la plupart des potions, il s'agit d'abord de confectionner une potion étrange à l'aide d'une verrue du Nether. Ensuite, il s'y ajoute au moins un autre ingrédient pour créer la potion finale. - - - Une fois la potion créée, vous pouvez modifier ses effets. Ajoutez de la poudre de redstone pour allonger la durée d'effet ou de la poudre de glowstone pour en renforcer la puissance. - - - Ajouter un 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. - - - Dans cette zone se trouvent un alambic, un chaudron et un coffre rempli d'articles d'alchimie. - - + {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'alchimie et les potions.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si l'alchimie et les potions n'ont déjà plus de secrets pour vous. + Appuyez sur{*CONTROLLER_VK_A*} pour continuer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. - - Pour distiller une potion, il faut d'abord créer une fiole d'eau. Prenez une fiole dans le coffre. + + Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. - - 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. + + Déplacez l'objet annexé au pointeur jusqu'à un autre emplacement de l'inventaire et déposez-le avec{*CONTROLLER_VK_A*}. + Si plusieurs objets sont annexés au pointeur, utilisez{*CONTROLLER_VK_A*} pour tous les déposer, ou{*CONTROLLER_VK_X*} pour n'en déposer qu'un seul. - - Si un chaudron se vide, vous pouvez le remplir à l'aide d'un seau d'eau. + + 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é. - - 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. + + Vous avez terminé la première partie du didacticiel. - - Une potion à la main, maintenez{*CONTROLLER_ACTION_USE*} pour l'utiliser. Dans le cas d'une potion normale, il suffit de la boire pour bénéficier de ses effets. Quant aux potions volatiles, lancez-les pour appliquer leurs effets aux créatures proches de la zone d'impact. - Mélangez de la poudre à canon aux potions normales pour créer des potions volatiles. + + Utilisez 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. - - Utilisez votre potion de résistance au feu sur vous-même. + + 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. - - Maintenant que vous résistez au feu et à la lave, peut-être pourrez-vous rejoindre des lieux jusque-là inaccessibles. + + Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. - - Vous êtes dans l'interface d'enchantement qui vous permet d'appliquer des enchantements aux armes et armures, ainsi qu'à certains outils. + + 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*} - - {*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. + + Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. - - 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. + + 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*} - - Lorsqu'un objet est disposé dans l'emplacement d'enchantement, les boutons sur la droite afficheront un éventail d'enchantements aléatoires. + + 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*}. - - Le chiffre qui figure sur le bouton indique le coût d'enchantement de l'objet, exprimé en niveaux d'expérience. Si votre niveau est insuffisant, le bouton sera désactivé. - - - Sélectionnez un enchantement et appuyez sur{*CONTROLLER_VK_A*} pour enchanter l'objet. Le coût de l'enchantement sera déduit de votre niveau d'expérience. - - - Les enchantements sont tous aléatoires, mais les meilleurs d'entre eux ne seront disponibles qu'à haut niveau d'expérience et nécessiteront de très nombreuses bibliothèques disposées autour de la table d'enchantement pour en augmenter la puissance. - - - Dans cette zone, vous trouverez une table d'enchantement ainsi que plusieurs objets qui vous aideront à vous familiariser avec l'enchantement. - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enchantement.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur l'enchantement. - - - L'utilisation d'une table d'enchantement vous permet d'appliquer aux objets certains effets spéciaux, comme renforcer la résistance aux dégâts ou augmenter le nombre de ressources produites lorsque vous minez un bloc. - - - Placer des bibliothèques autour de la table d'enchantement augmente sa puissance et permet d'accéder aux niveaux d'enchantement supérieurs. - - - L'enchantement d'objets coûte des niveaux d'expérience qu'on obtient au moyen d'orbes d'expérience. Pour obtenir ces orbes, tuez des monstres et animaux, prélevez du minerai, élevez des animaux, pêchez ou fondez/cuisinez certains objets dans un four. - - - Vous pouvez aussi engranger de l'expérience à l'aide d'une fiole d'expérience. Lorsque vous la lancez, elle crée un orbe d'expérience à l'endroit où elle tombe, que vous n'avez plus qu'à ramasser. - - - Dans les coffres de cette zone, vous trouverez certains objets enchantés, des fioles d'expérience ainsi que certains objets qui restent à enchanter sur la table d'enchantement. - - - Vous êtes à bord d'un chariot de mine. Pour descendre, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chariots de mine.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si les chariots de mine n'ont déjà plus de secrets pour vous. - - - Le chariot de mine circule sur des rails. Vous pouvez fabriquer des chariots motorisés et des chariots de transport. - {*RailIcon*} - - - Vous pouvez aussi aménager des rails de propulsion : alimentés par les torches et circuits de redstone, ils augmentent la vitesse du chariot. Ces rails peuvent être associés à des interrupteurs, leviers et plaques de détection pour mettre en oeuvre des systèmes complexes. - {*PoweredRailIcon*} - - - Vous naviguez à bord d'un bateau. Pour descendre, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les bateaux.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les bateaux. - - - Le bateau vous permet de circuler plus rapidement sur l'eau. Vous pouvez le diriger à l'aide de{*CONTROLLER_ACTION_MOVE*} et{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - Vous maniez une canne à pêche. Appuyez{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*FishingRodIcon*} - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la pêche.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur la pêche. - - - Appuyez sur{*CONTROLLER_ACTION_USE*} pour lancer la ligne et commencer à pêcher. Appuyez à nouveau sur{*CONTROLLER_ACTION_USE*} pour relever la ligne. - {*FishingRodIcon*} - - - Si vous attendez que le flotteur plonge sous l'eau avant de relever la ligne, vous pourrez attraper un poisson. Mangé cru ou cuit au four, le poisson restitue de la santé. - {*FishIcon*} - - - Comme de nombreux outils, la canne à pêche a un nombre d'utilisations limité, mais elle n'a pas pour seule vocation d'attraper du poisson. Testez par vous-même et observez quels autres objets ou créatures elle est capable d'actionner ou de capturer... - {*FishingRodIcon*} - - - C'est un lit. La nuit, pointez le curseur sur le lit et appuyez sur{*CONTROLLER_ACTION_USE*} pour dormir jusqu'au matin.{*ICON*}355{*/ICON*} - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les lits.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les lits. - - - Placez votre lit dans un lieu sûr et bien éclairé pour éviter que les monstres ne vous tirent du sommeil au beau milieu de la nuit. Si vous avez déjà utilisé un lit, vous réapparaîtrez à son emplacement si vous mourez. - {*ICON*}355{*/ICON*} - - - Si votre partie compte d'autres joueurs, tous devront être au lit au même moment avant de pouvoir dormir. - {*ICON*}355{*/ICON*} - - - Dans cette zone, vous trouverez des circuits de redstone avec piston, ainsi qu'un coffre qui renferme les objets nécessaires pour développer ces circuits. - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les circuits de redstone et les pistons.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les circuits de redstone et les pistons. - - - Les leviers, boutons, plaques de détection et torches de redstone permettent d'alimenter les circuits. Pour ce faire, reliez-les directement à l'objet que vous souhaitez activer, ou bien connectez-les à l'aide de poudre de redstone. - - - La position et l'orientation d'une source d'alimentation peuvent modifier l'effet qu'elle exerce sur les blocs voisins. Par exemple, une torche de redstone placée sur le côté d'un bloc peut être désactivée si le bloc en question est raccordé à une autre source d'alimentation. - - - Pour obtenir de la poudre de redstone, creusez du minerai de redstone avec une pioche en fer, en diamant ou en or. Elle permet de conduire le courant sur une longueur maximale de 15 blocs et sur une hauteur d'1 bloc. - {*ICON*}331{*/ICON*} - - - Les répéteurs de redstone permettent de prolonger la distance de conduction du courant ou de retarder les signaux de redstone. - {*ICON*}356{*/ICON*} - - - Une fois alimenté, le piston s'allonge et pousse jusqu'à 12 blocs. Lorsqu'il se rétracte, le piston collant tire avec lui un bloc (tous types de blocs, ou presque). - {*ICON*}33{*/ICON*} - - - Le coffre de cette zone renferme les composants nécessaires à la fabrication de circuits avec pistons. Essayez d'utiliser ou de développer les circuits de cette zone, ou bien d'assembler votre propre circuit. Vous trouverez d'autres exemples de ces circuits en dehors de la zone didacticielle. - - - Un portail vers le Nether se trouve dans cette zone ! - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les portails et le Nether.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les portails et le Nether. - - - Pour créer un portail, placez des blocs d'obsidienne pour former un cadre large de quatre blocs et haut de cinq. Les blocs d'angle n'ont qu'une fonction esthétique. - - - Pour activer un portail du Nether, embrasez les blocs contenus dans le cadre à l'aide d'un briquet à silex. Les portails se désactivent si leur cadre est brisé, si une explosion se produit à proximité ou si un liquide les franchit. - - - Pour emprunter un portail du Nether, tenez-vous à l'intérieur du cadre. L'écran deviendra violet et un son sera déclenché. Au bout de quelques secondes, vous serez propulsé dans une autre dimension. - - - Le Nether est un lieu de tous les dangers, inondé de lave, mais c'est le seul endroit où prélever du Netherrack, un matériau qui brûle indéfiniment une fois qu'il est enflammé, et de la glowstone, qui produit de la lumière. - - - Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. - - - Vous êtes désormais en mode Créatif. - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le mode Créatif.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur ce mode. - - - En mode Créatif, vous disposez d'un nombre infini d'objets et de blocs, vous pouvez détruire des blocs d'un seul clic sans utiliser d'outil, vous êtes invulnérable et vous pouvez voler. - - - Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'inventaire du mode Créatif. - - - Rejoignez l'autre extrémité de ce trou pour continuer. - - - Vous êtes arrivé à la fin du didacticiel du mode Créatif. - - - Une ferme a été aménagée dans cette zone. La culture vous permet de créer une source renouvelable de nourriture et d'autres objets. - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la culture.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. - - - Le blé, les citrouilles et les pastèques sont créés à partir de graines. Exploitez des herbes hautes ou moissonnez du blé pour recueillir des graines de blé. Les graines de citrouille et de pastèque s'obtiennent respectivement sur les citrouilles et les pastèques. - - - Avant de planter les graines, les blocs de terre doivent être transformés en terre labourée à l'aide d'une houe. Une source d'eau voisine permettra d'irriguer la terre labourée. Les cultures pousseront d'autant plus vite si elles sont abondamment irriguées et exposées à la lumière. - - - Le blé passe par plusieurs stades de croissance. Il est prêt 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*} - - - Les cactus doivent être plantés dans le sable et pousseront jusqu'à atteindre trois blocs de hauteur. Tout comme pour le sucre de canne, détruire le bloc inférieur vous permettra de récolter les blocs qui lui sont superposés.{*ICON*}81{*/ICON*} - - - Les champignons doivent être plantés dans des zones faiblement éclairées et se propageront aux blocs adjacents peu exposés à la lumière.{*ICON*}39{*/ICON*} - - - Vous pouvez utiliser de la poudre d'os pour accélérer l'arrivée à maturité de vos cultures ou pour transformer vos champignons en champignons géants.{*ICON*}351:15{*/ICON*} - - - Le didacticiel consacré aux cultures est maintenant terminé. - - - Des animaux ont été placés en enclos dans cette zone. Vous pouvez élever des animaux pour en faire apparaître des versions miniatures. - - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les animaux et l'élevage.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si 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". - - - 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. - - - 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*} - - + - 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. - +Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. - - Le didacticiel consacré aux animaux et à l'élevage est maintenant terminé. + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. - - Cette zone comporte des citrouilles et des blocs pour créer un golem de neige et un golem de fer. + + 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*}. - + {*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. + Appuyez sur{*CONTROLLER_VK_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. - - Les golems sont créés en plaçant une citrouille sur une pile de blocs. - - - Les golems de neige sont créés en empilant de blocs de neige puis une citrouille. Les golems de neige lancent des boules de neige à vos ennemis. - - - Les golems de fer sont créés à partir de quatre blocs de fer selon un certain modèle, avec une citrouille au-dessus du bloc central. Les golems de fer attaquent vos ennemis. - - - Les golems de fer apparaissent naturellement pour protéger les villages. Ils vous attaqueront si vous attaquez les villageois. - - - Vous devez poursuivre jusqu'à la fin de ce didacticiel avant de quitter cette zone. - - - Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Par exemple, utilisez plutôt une pelle pour creuser les matériaux meubles comme la terre et le sable. - - - Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une hache pour couper les troncs d'arbre. - - - Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une pioche pour creuser le minerai et la pierre. Vous devrez sûrement confectionner une pioche dans des matériaux de meilleure qualité pour exploiter certains blocs. - - - Certains outils sont plus efficaces que d'autres pour attaquer des ennemis. Pour attaquer, songez à vous équiper d'une épée. - - - Maintenez {*CONTROLLER_ACTION_ACTION*}pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs. - - - L'outil que vous maniez est endommagé. Chaque fois que vous utilisez un outil, son état se dégrade jusqu'à 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. - - - Le coffre sur la rive contient un bateau. Pour l'utiliser, pointez le curseur sur l'eau et appuyez sur{*CONTROLLER_ACTION_USE*}. Pour embarquer, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}. - - - Vous trouverez une canne à pêche dans le coffre situé près de l'étang. Prenez-la et sélectionnez-la pour la tenir en main. - - - Ce mécanisme à piston, plus complexe, crée un pont capable de s'auto-réparer ! Appuyez sur le bouton pour l'activer puis tâchez de comprendre comment les composants interagissent. - - - Si vous déplacez le pointeur hors des limites de l'interface alors qu'un objet lui est annexé, vous pouvez jeter cet objet. - - - Vous ne disposez pas des ingrédients nécessaires pour confectionner cet objet. Le champ situé en bas à gauche de l'écran répertorie les ingrédients requis pour cette tâche d'artisanat. - - - Félicitations, vous êtes arrivé à la fin de ce didacticiel. Désormais, le temps s'écoule normalement dans le jeu et la nuit ne va pas tarder à tomber avec son cortège de monstres ! Terminez votre abri ! - - - {*EXIT_PICTURE*} Dès que vous serez prêt à explorer plus avant, un escalier près du refuge de mineur donne sur un petit château. - - - Rappel : - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - De nouvelles fonctionnalités ont été ajoutées à la dernière version du jeu, dont de nouvelles zones dans le monde didacticiel. - - - {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour parcourir normalement le didacticiel.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} pour passer le didacticiel principal. - - - Ici, vous trouverez des zones déjà configurées qui vous en apprendront davantage sur la pêche, les bateaux, les pistons et la redstone. - - - À l'extérieur de cette zone, vous trouverez des exemples de bâtiments, de terres labourées, de chariots de mine et de rails, des tables d'enchantement, des alambics, des exemples de commerce, des enclumes... et bien plus encore ! - - - Votre barre de nourriture est à un niveau où votre santé ne se régénère plus. - - + {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la barre de nourriture et les aliments.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur la barre de nourriture et les aliments. + Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. - - Sélectionner + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. - - Utiliser + + 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. - - Retour + + {*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. - - Quitter + + L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. - - Annuler + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. - - Annuler connexion + + 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*}. - - Actualiser jeux + + +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. - - Party Games + + 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. - - Tous les jeux + + Eau - - Changer catégorie + + Fiole - - Inventaire + + Fiole d'eau - - Description + + Oeil d'araignée - - Ingrédients + + Pépite d'or - - Artisanat + + Verrue du Nether - - Créer + + Potion{*splash*}{*prefix*}{*postfix*} - - Prendre/Placer + + Oeil d'araignée fermenté - - Prendre + + Chaudron - - Prendre tout + + Oeil d'Ender - - Prendre la moitié + + Pastèque scintillante - - Placer + + Poudre de feu - - Placer tout + + Crème de magma - - Placer un - - - Lâcher - - - Jeter tout - - - Jeter un - - - Permuter - - - Dépl. rapide - - - Vider la barre de sélection rapide - - - Plus d'info - - - Partager sur Facebook - - - Changer de filtre - - - Envoyer requête d'ami - - - Page Bas - - - Page Haut - - - Suivant - - - Précédent - - - Exclure joueur - - - Teindre - - - Miner - - - Nourrir - - - Apprivoiser - - - Soigner - - - Assis - - - Suis-moi - - - Éjecter - - - Vider - - - Selle - - - Placer - - - Frapper - - - Traire - - - Prélever - - - Manger - - - Dormir - - - Se réveiller - - - Jouer - - - Monter - - - Naviguer - - - Faire pousser - - - Nager (haut) - - - Ouvrir - - - Changer tonalité - - - Exploser - - - Lire - - - Suspendre - - - Lancer - - - Planter - - - Faucher - - - Récolter - - - Continuer - - - Déverrouiller le jeu complet - - - Supp. sauvegarde - - - Supprimer - - - Options - - - Inviter des amis - - - Accepter - - - Tondre - - - Exclure le niveau - - - Sélectionner skin - - - Allumer - - - Naviguer - - - Installer la version complète - - - Installer la version d'évaluation - - - Installer - - - Réinstaller - - - Options - - - Exécuter ordre - - - Créatif - - - Déplacer ingrédient - - - Déplacer combustible - - - Outil Déplacement - - - Déplacer l'armure - - - Déplacer l'arme - - - Équiper - - - Bander - - - Lâcher - - - Privilèges - - - Parer - - - Page Haut - - - Page Bas - - - Mode Romance - - - Boire - - - Faire pivoter - - - Masquer - - - Vider tous les emplacements - - - OK - - - Annuler - - - Magasin Minecraft - - - Voulez-vous vraiment quitter la partie en cours et rejoindre la nouvelle ? Toute progression non sauvegardée sera perdue. - - - Quitter le jeu - - - Sauvegarder la partie - - - Quitter sans sauvegarder - - - Voulez-vous vraiment supprimer toute sauvegarde préalable pour ce monde et la remplacer par la version actuelle de ce monde ? - - - Voulez-vous vraiment quitter sans sauvegarder ? Vous perdrez toute progression dans ce monde ! - - - Commencer la partie - - - Sauv. endommagée - - - Cette sauvegarde semble corrompue ou endommagée. La supprimer ? - - - Voulez-vous vraiment retourner au menu principal et déconnecter tous les joueurs de la partie ? Toute progression non sauvegardée sera perdue. - - - Quitter et sauvegarder - - - Quitter sans sauvegarder - - - Voulez-vous vraiment retourner au menu principal ? Toute progression non sauvegardée sera perdue. - - - Voulez-vous vraiment retourner au menu principal ? Votre progression sera perdue ! - - - Créer un monde - - - Lancer le didacticiel - - - Didacticiel - - - Nommer votre monde - - - Saisir le nom de votre monde - - - Saisir une graine pour la génération de votre monde - - - Charger monde sauvegardé - - - START pour rejoindre - - - Quitter la partie - - - Une erreur s'est produite. Retour au menu principal. - - - Échec de la connexion - - - Connexion perdue - - - La connexion au serveur a été interrompue. Retour au menu principal. - - - Déconnexion par le serveur - - - Vous avez été exclu de la partie - - - Vous avez été exclu de la partie. Motif : vol. - - - Expiration du délai de connexion - - - Le serveur est au complet. - - - L'hôte a quitté la partie. - - - Vous ne pouvez pas rejoindre cette partie, car vous n'êtes l'ami d'aucun des joueurs présents. - - - Vous ne pouvez pas rejoindre cette partie car l'hôte vous en a déjà exclu. - - - Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version antérieure du jeu. - - - Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version supérieure du jeu. - - - Nouveau monde - - - Récompense déverrouillée ! - - - Hourra, vous avez reçu une image de joueur représentant Steve de Minecraft ! - - - Hourra, vous avez reçu une image de joueur représentant un creeper ! - - - 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 - - - Filtre : - - - Amis - - - Mon score - - - Général - - - Entrées : - - - Rang - - - Sauvegarde du niveau en préparation - - - Préparation des tronçons... - - - Finalisation... - - - Aménagement du terrain - - - Brève simulation du monde - - - Initialisation du serveur - - - Génération de la zone d'apparition - - - Chargement de la zone d'apparition - - - Entrée dans le Nether - - - Sortie du Nether - - - Réapparition - - - Génération du niveau - - - Chargement du niveau - - - Sauvegarde des joueurs - - - Connexion à l'hôte - - - Téléchargement du terrain - - - Passage en mode hors ligne - - - Veuillez patienter pendant que l'hôte sauvegarde la partie - - - Entrée dans l'ENDER - - - Sortie de l'ENDER - - - Ce lit est occupé - - - Vous ne pouvez dormir que la nuit - - - %s dort dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. - - - Le lit de votre abri est absent ou inaccessible - - - Vous ne pouvez pas vous reposer : des monstres rôdent dans les parages - - - Vous dormez dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. - - - Outils et armes - - - Armes - - - Nourriture - - - Structures - - - Armures - - - Mécanismes - - - Transports - - - Décorations - - - Construction de blocs - - - Redstone et transport - - - Divers - - - Alchimie - - - Outils, armes et armures - - - Matériaux - - - Déconnexion - - - Difficulté - - - Musique - - - Son - - - Gamma - - - Sensibilité jeu - - - Sensibilité interface - - - Pacifique - - - Facile - - - Normal - - - Difficile - - - Dans ce mode, la santé du joueur se régénère au fil du temps et aucun ennemi ne rôde dans les parages. - - - Dans ce mode, des ennemis apparaissent dans l'environnement mais infligent moins de dégâts qu'en mode Normal. - - - Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts normaux. - - - Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts considérables. Méfiez-vous des creepers : même si vous prenez vos distances, ils ne renonceront pas à vous attaquer ! - - - Expiration de la version d'évaluation - - - Partie au complet - - - Impossible de rejoindre la partie : aucune place vacante - - - Saisir un message sur le panneau - - - Saisir une ligne de texte à inscrire sur votre panneau - - - Saisir un titre - - - Saisir le titre de votre message - - - Saisir un sous-titre - - - Saisir le sous-titre de votre message - - - Saisir une description - - - Saisir la description de votre message - - - Inventaire - - - Ingrédients - - + Alambic - - Coffre + + Larme de Ghast - - Enchantement + + Graines de citrouille - - Four + + Graines de pastèque - - Ingrédient + + Poulet cru - - Combustible + + Disque vinyle "11" - - Distributeur + + Disque vinyle "where are we now" - - Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. + + Cisailles - - %s a rejoint la partie. + + Poulet cuit - - %s a quitté la partie. + + Ender Pearl - - %s s'est fait exclure de la partie. + + Tranche de pastèque - - Voulez-vous vraiment supprimer cette sauvegarde ? + + Bâton de feu - - Attente d'accord + + Boeuf cru - - Censuré + + Steak - - En cours de lecture : + + Chair putréfiée - - Réinitialiser paramètres + + Fiole d'expérience - - Voulez-vous vraiment rétablir les paramètres par défaut ? + + Planches en chêne - - Échec du chargement + + Planches en sapin - - Jeu de %s + + Planches en bouleau - - Partie d'un hôte inconnu + + Bloc d'herbe - - Invité déconnecté + + Terre - - Un joueur invité s'est déconnecté : tous les joueurs invités ont été exclus de la partie. + + Pierre taillée - - Se connecter + + Planches (bois tropical) - - Vous n'êtes pas connecté. Pour jouer, vous devez d'abord vous connecter. Vous connecter ? + + Pousse de bouleau - - Multijoueur non autorisé + + Pousse d'arbre tropical - - Impossible de créer la partie + + Adminium - - Sélection auto + + Pousse d'arbre - - Non pack : skins stand. + + Pousse de chêne - - Skins préférées + + Pousse d'épicéa - - Niveau exclu + + Pierre - - 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. + + Cadre - - Exclure ce niveau ? + + Fait apparaître {*CREATURE*} - - Voulez-vous vraiment ajouter ce niveau à votre liste de niveaux exclus ? -Si vous sélectionnez OK, vous quitterez cette partie. + + Brique du Nether - - Retirer de la liste d'exclusion + + Boule de feu - - Sauvegarde auto + + Boule de feu (ch. bois) - - Sauvegarde auto : NON + + Boule de feu charbon - - min + + Crâne - - Placement impossible à cet endroit ! + + Crâne - - 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. + + Crâne de %s - - Opacité interface + + Crâne de creeper - - Préparation de sauvegarde auto du niveau + + Crâne de squelette - - Taille interface + + Crâne de wither squelette - - Taille interface (écran part.) + + Tête de zombie - - Graine - - - Déverrouiller pack de skins - - - Pour utiliser la skin que vous avez sélectionnée, vous devez d'abord déverrouiller le pack correspondant. -Déverrouiller ce pack de skins ? - - - Débloquer le pack de textures - - - Pour utiliser ce pack de textures dans votre monde, vous devez le débloquer. -Le débloquer maintenant ? - - - Pack de textures d'essai - - - Vous utilisez une version d'essai du pack de textures. Vous ne pourrez pas sauvegarder ce monde si vous ne déverrouillez pas la version complète. -Déverrouiller la version complète du pack de textures ? - - - Pack de textures introuvable - - - Déverrouiller la version complète - - - Télécharger la version d'essai - - - Télécharger la version complète - - - Ce monde utilise un pack mash-up ou de textures que vous ne possédez pas. -Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? - - - Obtenir la version d'essai - - - Obtenir la version complète - - - Exclure joueur - - - Voulez-vous vraiment exclure ce joueur de la partie ? Il ne pourra plus rejoindre la partie jusqu'au redémarrage du monde. - - - Packs d'images de joueur - - - Thèmes - - - Packs de skins - - - Autoriser les amis d'amis - - - Vous ne pouvez pas rejoindre cette partie : elle est réservée aux seuls amis de l'hôte. - - - Impossible de rejoindre la partie - - - Sélectionnée - - - Skin sélectionnée : - - - Contenu téléchargeable corrompu - - - Ce contenu téléchargeable est endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. - - - Votre contenu téléchargeable est partiellement endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. - - - Votre mode de jeu a été modifié - - - Renommer votre monde - - - Saisir le nouveau nom de votre monde - - - Mode de jeu : Survie - - - Mode de jeu : Créatif - - - Survie - - - Créatif - - - Créé en mode Survie - - - Créé en mode Créatif - - - Afficher les nuages - - - Que voulez-vous faire de cette sauvegarde ? - - - Renommer sauvegarde - - - Sauvegarde auto. dans %d... - - - Oui - - - Non - - - Normal - - - Superplat - - - Lorsque cette option est activée, la partie est un jeu en ligne. - - - 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. - - - Lorsque cette option est désactivée, les joueurs qui rejoignent la partie ne peuvent ni construire ni miner sans autorisation. - - - Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. - - - Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. - - - Si vous l'activez, le Nether sera régénéré. Très utile si vous avez une ancienne sauvegarde où les forteresses du Nether ne sont pas présentes. - - - Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde. - - - Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether. - - - Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur. - - - Packs de skins - - - Thèmes - - - Images du joueur - - - Objets pour avatar - - - Packs de textures - - - Packs mash-up - - - {*PLAYER*} a brûlé - - - {*PLAYER*} a joué avec les allumettes - - - {*PLAYER*} a piqué une tête dans la lave - - - {*PLAYER*} a suffoqué dans un mur - - - {*PLAYER*} a péri par noyade - - - {*PLAYER*} a crevé de faim - - - {*PLAYER*} a reçu une piqûre mortelle - - - {*PLAYER*} a percuté le sol - - - {*PLAYER*} a chuté du bout du monde - - - {*PLAYER*} a péri - - - {*PLAYER*} a explosé - - - {*PLAYER*} a trépassé par magie - - - {*PLAYER*} a été tué(e) par le souffle du Dragon de l'Ender. - - - {*PLAYER*} s'est fait tuer par {*SOURCE*} - - - {*PLAYER*} s'est fait tuer par {*SOURCE*} - - - {*PLAYER*} s'est fait tirer dessus par {*SOURCE*} - - - {*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} - - - {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} - - - {*PLAYER*} s'est fait tuer par {*SOURCE*} - - - Brouillard d'adminium - - - Afficher interface - - - Afficher main - - - Messages mortuaires - - - Personnage animé - - - Animation skin perso - - - Vous ne pouvez plus miner ou utiliser d'objet - - - Vous pouvez maintenant miner et utiliser des objets - - - Vous ne pouvez plus placer de blocs - - - Vous pouvez maintenant placer des blocs - - - Vous pouvez maintenant utiliser portes et leviers - - - Vous ne pouvez plus utiliser portes et leviers - - - Vous pouvez maintenant utiliser des conteneurs (coffres, par exemple) - - - Vous ne pouvez plus utiliser de conteneurs (coffres, par exemple) - - - Vous ne pouvez plus attaquer des monstres - - - Vous pouvez maintenant attaquer des monstres - - - Vous ne pouvez plus attaquer des joueurs - - - Vous pouvez maintenant attaquer des joueurs - - - Vous ne pouvez plus attaquer les animaux - - - Vous pouvez maintenant attaquer les animaux - - - Vous êtes désormais modérateur - - - Vous n'êtes plus modérateur - - - Vous pouvez maintenant voler - - - Vous ne pouvez plus voler - - - Vous ne vous fatiguerez plus - - - Vous pouvez maintenant vous fatiguer - - - Vous êtes maintenant invisible - - - Vous n'êtes plus invisible - - - Vous êtes maintenant invulnérable - - - Vous n'êtes plus invulnérable - - - %d MSP - - - Dragon de l'Ender - - - %s est entré(e) dans l'Ender - - - %s a quitté l'Ender - - - {*C3*}Je vois le joueur dont tu parles.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*} ?{*EF*}{*B*}{*B*} -{*C3*}Oui. Fais attention. Son niveau est plus élevé maintenant. Il peut lire nos pensées.{*EF*}{*B*}{*B*} -{*C2*}Ça ne fait rien. Il pense qu'on fait partie du jeu.{*EF*}{*B*}{*B*} -{*C3*}Je l'aime bien, ce joueur. Il a bien joué. Il n'a jamais baissé les bras.{*EF*}{*B*}{*B*} -{*C2*}Il lit nos pensées comme des mots sur un écran.{*EF*}{*B*}{*B*} -{*C3*}C'est sa façon d'imaginer bien des choses quand il est plongé dans le rêve d'un jeu.{*EF*}{*B*}{*B*} -{*C2*}Les mots font une interface remarquable. Très flexible. Et bien moins terrifiante que d'observer la réalité qui se trouve derrière l'écran.{*EF*}{*B*}{*B*} -{*C3*}Ils entendaient des voix, avant que les joueurs ne sachent lire. C'était l'époque où ceux qui ne jouaient pas appelaient les joueurs sorcières et sorciers. Et eux, rêvaient de voler dans les airs, sur des bâtons envoûtés par des démons. {*EF*}{*B*}{*B*} -{*C2*}De quoi rêvait ce joueur ?{*EF*}{*B*}{*B*} -{*C3*}De la lumière du soleil et des arbres. Du feu et de l'eau. Il l'a rêvé et l'a créé. Puis il a rêvé de destruction. Il a rêvé de chasser et d'être chassé. Il a rêvé d'un 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*} - - - {*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*} - - - {*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*} - - - Réinitialiser le Nether - - - Voulez-vous vraiment réinitialiser le Nether de cette sauvegarde à ses paramètres par défaut ? Vous perdrez tout ce que vous avez construit dans le Nether ! - - - Réinitialiser le Nether - - - Ne pas réinitialiser le Nether - - - Pas de tonte de champimeuh pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches et chats. - - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches et chats. - - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de champimeuh. - - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de loups dans un monde. - - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de poulets dans un monde. - - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de pieuvres dans un monde. - - - Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal d'ennemis dans un monde a été atteint. - - - Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal de villageois dans un monde a été atteint. - - - Le nombre maximal de tableaux/cadres dans un monde a été atteint. - - - Vous ne pouvez pas faire apparaître d'ennemis en mode Pacifique. - - - 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. - - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de loups en cours d'élevage a été atteint. - - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de poulets en cours d'élevage a été atteint. - - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de champimeuh en cours d'élevage a été atteint. - - - Le nombre maximal de bateaux dans un monde a été atteint. - - - Le nombre maximal de crânes dans un monde a été atteint. - - - Inverser - - - Gaucher - - - Vous êtes mort ! - - - Réapparaître - - - Contenu téléchargeable - - - Changer de skin - - - Comment jouer - - - Commandes - - - Paramètres - - - Générique - - - Réinstaller le contenu - - - Debug Settings - - - Propagation du feu - - - Explosion de TNT - - - Joueur contre joueur - - - Joueurs de confiance - - - Privilèges d'hôte - - - Génération de structures - - - Monde superplat - - - Coffre bonus - - - Options du monde - - - Construction et minage possibles - - - Utilisation portes et leviers possible - - - Ouverture de conteneurs possible - - - Attaque des joueurs possible - - - Attaque des animaux possible - - - Modérateur - - - Exclure joueur - - - Vol possible - - - Fatigue désactivée - - - Invisible - - - Options de l'hôte - - - Joueurs/Invitation - - - Jeu en ligne - - - Sur invitation - - - Plus d'options - - - Charger - - - Nouveau monde - - - Nom du monde - - - Graine pour le générateur de monde - - - Champ vide pour une graine aléatoire - - - Joueurs - - - Rejoindre la partie - - - Commencer la partie - - - Aucune partie trouvée - - - Jouer - - - Classements - - - Aide et options - - - Jeu complet - - - Reprendre le jeu - - - Sauvegarder la partie - - - Difficulté : - - - Type de partie : - - - Structures : - - - Type de niveau : - - - Joueur contre joueur : - - - Joueurs de confiance : - - - TNT : - - - Propagation du feu : - - - Réinstaller le thème - - - Réinstaller l'image du joueur 1 - - - Réinstaller l'image du joueur 2 - - - Réinstaller l'article pour avatar 1 - - - Réinstaller l'article pour avatar 2 - - - Réinstaller l'article pour avatar 3 - - - Options - - - Audio - - - Contrôle - - - Vidéo - - - Interface utilisateur - - - Paramètres par défaut - - - Tremblements caméra - - - Conseils - - - Infobulles en jeu - - - Écran partagé (2 joueurs) - - - Terminé - - - Modifier le message : - - - Renseigner la légende de votre capture d'écran - - - Sous-titre - - - Capture d'écran du jeu - - - Modifier le message : - - - Les textures, icônes et interface utilisateur classiques de Minecraft ! - - - Afficher tous les mondes mash-up - - - Pas d'effet - - - Rapidité - - - Lenteur - - - Hâte - - - Fatigue de mineur - - - Force - - - Faiblesse - - - Santé - - - Dégâts - - - Saut - - - Nausée - - - Régénération - - - Résistance - - - Résistance au feu - - - Respiration aquatique - - - Invisibilité - - - Cécité - - - Vision nocturne - - - Faim + + 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 lassitude + + + de hâte + + + de faiblesse + + + de force + + + Résistance au feu + + + Saturation + de résistance - - de résistance au feu + + de saut - - de respiration aquatique + + Wither - - d'invisibilité + + Santé - - de cécité - - - de vision nocturne - - - de faim - - - de poison + + Absorption @@ -5003,9 +5871,78 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? III + + d'invisibilité + IV + + de respiration aquatique + + + de résistance au feu + + + de vision nocturne + + + de poison + + + de faim + + + d'absorption + + + de saturation + + + de santé + + + de cécité + + + de putréfaction + + + naïve + + + mince + + + diffuse + + + claire + + + laiteuse + + + étrange + + + beurrée + + + lisse + + + maladroite + + + plate + + + volumineuse + + + insipide + vol. @@ -5015,50 +5952,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? triviale - - insipide + + fringante - - claire + + cordiale - - laiteuse - - - diffuse - - - naïve - - - mince - - - étrange - - - plate - - - volumineuse - - - maladroite - - - beurrée - - - lisse - - - suave - - - débonnaire - - - épaisse + + de charme élégante @@ -5066,149 +5967,152 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? fantasque - - de charme - - - fringante - - - raffinée - - - cordiale - mousseuse - - puissante - - - viciée - - - inodore - rang rude + + inodore + + + puissante + + + viciée + + + suave + + + raffinée + + + épaisse + + + débonnaire + + + Rend progressivement de la santé aux joueurs, animaux et monstres affectés. + + + Réduit instantanément la santé des joueurs, animaux et monstres affectés. + + + Rend les joueurs, animaux et monstres affectés résistants au feu, à la lave et aux attaques à distance des Blazes. + + + N'a pas d'effet. Combinée à d'autres ingrédients, peut servir à distiller des potions dans un alambic. + â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. + + + Augmente 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. + + + Sert de base à toutes les potions. À utiliser dans un alambic pour distiller des potions. + brute puante - - Sert de base à toutes les potions. À utiliser dans un alambic pour distiller des potions. - - - N'a pas d'effet. Combinée à d'autres ingrédients, peut servir à distiller des potions dans un alambic. - - - Augmente la vitesse de déplacement des joueurs, animaux et monstres affectés. Augmente la vitesse de course, la longueur des sauts et le champ de vision des joueurs. - - - Réduit la vitesse de déplacement des joueurs, animaux et monstres affectés. Réduit la vitesse de 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. - - - Rend progressivement de la santé aux joueurs, animaux et monstres affectés. - - - Rend les joueurs, animaux et monstres affectés résistants au feu, à la lave et aux attaques à distance des Blazes. - - - Réduit progressivement la santé des joueurs, animaux et monstres affectés. + + 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 - - - Efficacité + + Santé max Délicatesse - - Solidité + + Efficacité - - Butin + + Aisance aquatique Fortune - - Puissance + + Butin - - Flamme + + Solidité - - Repoussoir + + Protection contre le feu - - Infinité + + Protection - - I + + Aura de Feu - - II + + Chute amortie - - III + + Respiration + + + Protection contre les projectiles + + + 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,44 +6156,59 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Une façon plus compacte de stocker les émeraudes. - - Un mur fait en pierre. + + 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. - - Permet de réparer les armes, les outils et les armures. + + IX - - Produit du quartz du Nether lorsqu'on le fond dans un four. + + VIII - - Un objet de décoration. + + Peut être miné avec une pioche en fer ou supérieure pour obtenir des émeraudes. - - 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. + + 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. + Restitue 0,5{*ICON_SHANK_01*} ou peut être cuite dans un four. Peut être plantée dans une terre labourée. - - Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant une patate dans un four. + + Produit du quartz du Nether lorsqu'on le fond dans un four. + + + Permet de réparer les armes, les outils et les armures. + + + Permet de faire du commerce avec les villageois. + + + Un objet de décoration. + + + Restitue 4{*ICON_SHANK_01*}. - 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. + Restitue 1{*ICON_SHANK_01*}. La manger pourrait vous empoisonner. Permet de diriger un cochon équipé d'une selle lorsque vous le chevauchez. - - Restitue 4{*ICON_SHANK_01*}. + + Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant une patate dans un four. + + + Restitue 3{*ICON_SHANK_01*}. Se fabrique avec une carotte et des pépites d'or. S'utilise avec une enclume pour enchanter des armes, des outils et des armures. @@ -5291,6 +6216,15 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? 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 + + Tarte à la citrouille - - Patate - - - 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,72 +6363,75 @@ 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 - - Coût de l'enchantement : %d - Trop cher ! - - Renommer + + Coût de l'enchantement : %d Vous avez : - - Requis pour l'échange + + Renommer {*VILLAGER_TYPE*} propose : %s - - Réparer + + Requis pour l'échange Échanger - - Teindre collier + + Réparer 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 + + + Pour travailler un objet, placez-le dans le premier emplacement sur la gauche. + {*B*} @@ -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. + + Vous pouvez également placer un autre objet du même type dans le deuxième emplacement pour le combiner au premier. 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. + + 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. Pour enchanter des objets à l'aide de l'enclume, placez un livre enchanté dans le deuxième emplacement. - - 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. - 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,36 +1,124 @@  - + + Se connecter à "PSN" ? + + + 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. + + + + + Touche SELECT + + + 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. + + + Système PlayStation®Vita + + + 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. + + + Réseau Ad Hoc + + + Changer mode de réseau + + + Choisir mode de réseau + + + ID en ligne écran partagé + + + Trophé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. + + + 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. + + + ID en ligne : + + + 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. + + + Patch 1.04 (mise à jour 14) + + + ID en ligne en jeu + + + Regardez ce que j'ai fait dans Minecraft: PlayStation®Vita Edition ! + + + Échec du téléchargement. Réessayez ultérieurement. + + + Impossible de se connecter au jeu à cause d'une restriction de type NAT. Veuillez vérifier vos paramètres de réseau. + + + Échec de l'envoi. Réessayez ultérieurement. + + + Téléchargement terminé ! + + + 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. + + + + Sauvegarde incomplète + + + 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. + + + Envoi annulé + + + Vous avez annulé l'envoi de la sauvegarde vers la zone de transfert. + + + Envoyer sauvegarde pour système PS3™/PS4™ + + + Envoi de données : %d + + + "PSN" + + + Sauvegarde système PS3™ + + + Téléchargement de données : %d + + + Sauvegarde + + + Envoi terminé ! + + + Voulez-vous vraiment envoyer cette sauvegarde et écraser toute sauvegarde déjà présente dans la zone de transfert ? + + + Conversion des données + + NOT USED - - Vous pouvez utiliser l'écran tactile du système PlayStation®Vita pour naviguer dans les menus ! - - - minecraftforum consacre toute une section à PlayStation®Vita Edition. - - - Suivez @4J Studios et @Kappische sur Twitter pour rester au courant des dernières actus du jeu ! - - - Ne regardez pas un Enderman dans les yeux ! - - - Il paraîtrait que 4J Studios aurait supprimé Herobrine de la version pour système PlayStation®Vita, mais nous ne sommes pas certains. - - - Minecraft: PlayStation®Vita Edition a battu (presque) tous les records ! - - - {*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. - - - {*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. + + NOT USED {*T3*}COMMENT JOUER : MODE CRÉATIF{*ETW*}{*B*}{*B*} @@ -43,32 +131,79 @@ Pour voler en mode Créatif, appuyez deux fois rapidement sur{*CONTROLLER_ACTION 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. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Inviter amis - 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 ? 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 ? - - Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des trophées et des classements seront désactivées. + + "NOT USED" - - 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 ? + + Inviter amis + + + minecraftforum consacre toute une section à PlayStation®Vita Edition. + + + Suivez @4J Studios et @Kappische sur Twitter pour rester au courant des dernières actus du jeu ! + + + NOT USED + + + Vous pouvez utiliser l'écran tactile du système PlayStation®Vita pour naviguer dans les menus ! + + + Ne regardez pas un Enderman dans les yeux ! + + + {*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. + + + {*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. + + + Il paraîtrait que 4J Studios aurait supprimé Herobrine de la version pour système PlayStation®Vita, mais nous ne sommes pas certains. + + + Minecraft: PlayStation®Vita Edition a battu (presque) tous les records ! + + + 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 ? + + + Le chargement de Minecraft: PlayStation®Vita Edition a échoué : impossible de continuer. + + + Alchimie + + + Vous vous êtes déconnecté de "PSN" : retour à l'écran titre + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. La connexion à "PSN" a été interrompue. Retour au menu principal. @@ -76,11 +211,23 @@ En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTI La connexion à "PSN" a été interrompue. + + Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des trophées et des classements seront désactivées. + + + 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 ? + 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 ? + + Les joueurs invités ne peuvent pas déverrouiller le jeu complet. Veuillez vous connecter à un compte Sony Entertainment Network. + + + ID en ligne + 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". @@ -90,153 +237,7 @@ Voulez-vous déverrouiller le jeu complet ? 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 ? - - Les joueurs invités ne peuvent pas déverrouiller le jeu complet. Veuillez vous connecter à un compte Sony Entertainment Network. - - - ID en ligne - - - Alchimie - - - Vous vous êtes déconnecté de "PSN" : retour à l'écran titre - - - 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 ? - - - Le chargement de Minecraft: PlayStation®Vita Edition a échoué : impossible de continuer. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - ID en ligne écran partagé - - - Trophées - - - ID en ligne : - - - ID en ligne en jeu - - - Regardez ce que j'ai fait dans Minecraft: PlayStation®Vita Edition ! - - - 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. - - - Patch 1.04 (mise à jour 14) - - - Touche SELECT - - - 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. - - - Se connecter à "PSN" ? - - - 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. - - - - - Système PlayStation®Vita - - - Changer mode de réseau - - - Choisir mode de réseau - - - 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. - - - Réseau Ad Hoc - - - "PSN" - - - Sauvegarde système PlayStation®3 - - - - Envoyer sauvegarde pour système PlayStation®3/PlayStation®4 - - - Envoi annulé - - - Vous avez annulé l'envoi de la sauvegarde vers la zone de transfert. - - - Envoi de données : %d - - - Téléchargement de données : %d - - - Voulez-vous vraiment envoyer cette sauvegarde et écraser toute sauvegarde déjà présente dans la zone de transfert ? - - - Conversion des données - - - Sauvegarde - - - Envoi terminé ! - - - Échec de l'envoi. Réessayez ultérieurement. - - - Téléchargement terminé ! - - - Échec du téléchargement. Réessayez ultérieurement. - - - Impossible de se connecter au jeu à cause d'une restriction de type NAT. Veuillez vérifier vos paramètres de réseau. - - - - 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. - - - - Sauvegarde incomplète - - - 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. + + 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" - - - La partita è terminata perché sei uscito da "PSN" - - - Non hai effettuato l'accesso al momento. - - - Alcune funzionalità di questo gioco richiedono di aver effettuato l'accesso a "PSN", ma tu sei offline. - - - Rete Ad Hoc fuori linea. - - - 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 - - - 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. + + Salvataggio delle impostazioni sull'account Sony Entertainment Network non riuscito. Problema account Sony Entertainment Network - - Salvataggio delle impostazioni sull'account Sony Entertainment Network non riuscito. + + Si è verificato un problema durante l'accesso al tuo account Sony Entertainment Network. Per il momento non è stato possibile assegnarti il trofeo. 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? + + 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. + + + Rete Ad Hoc fuori linea. + + + Problema con trofeo + + + La partita è terminata perché sei uscito da "PSN" + + + Sei tornato alla schermata iniziale perché sei uscito da "PSN" + + + La memoria di sistema non dispone di spazio libero sufficiente per creare un salvataggio. + + + 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,252 +1,3631 @@  - - 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. - - - {*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. + + OK + + + Annulla + + + Negozio di Minecraft + + + Ruota + + + Nascondi + + + Libera tutti gli slot + + + Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. + + + Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? + + + Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! + + + Avvia gioco + + + Esci dal gioco + + + Salva gioco + + + Esci senza salvare + + + Premi START per accedere + + + Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! + + + Evviva, hai ottenuto un'immagine del giocatore con un creeper! + + + Sblocca gioco completo + + + Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. + + + Nuovo mondo + + + Premio sbloccato! + + + Stai giocando con la versione di prova, ma serve la versione completa per salvare i progressi. +Vuoi sbloccare il gioco completo ora? + + + Amici + + + Punt. personale + + + Generale + + + Attendi + + + Nessun risultato + + + Filtro: + + + Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. + + + Connessione persa + + + Connessione al server persa. Tornerai al menu principale. + + + Disconnesso dal server + + + Uscita dal gioco + + + Si è verificato un errore. Tornerai al menu principale. + + + Connessione non riuscita + + + Sei stato espulso dalla partita + + + L'host è uscito dal gioco. + + + Non puoi accedere a questa partita perché non hai amici tra i partecipanti. + + + Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. + + + Sei stato espulso dalla partita per volo. + + + Timeout del tentativo di connessione + + + Server pieno + + + 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! + + + Temi + + + Pacchetti Skin + + + Accetta amici di amici + + + Espelli giocatore + + + Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. + + + Pacchetti Immagini del giocatore + + + Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. + + + Contenuto scaricabile danneggiato + + + Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. + + + Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. + + + Impossibile accedere alla partita + + + Selezionato + + + Skin selezionata: + + + Ottieni la versione completa + + + Sblocca pacchetto texture + + + Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. +Vuoi sbloccarlo ora? + + + Versione di prova pacchetto texture + + + Seme + + + Sblocca pacchetto Skin + + + Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. +Vuoi sbloccare il pacchetto Skin ora? + + + 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? + + + Scarica versione completa + + + Questo mondo usa un pacchetto texture o mash-up che non hai! +Vuoi installare uno dei due pacchetti ora? + + + Ottieni la versione di prova + + + Nessun pacchetto texture + + + Sblocca versione completa + + + Scarica versione di prova + + + La modalità di gioco è cambiata + + + Se attivato, i giocatori potranno unirsi solo su invito. + + + Se attivato, gli amici delle persone nell'elenco di amici potranno unirsi alla partita. + + + Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. + + + Normale + + + Superpiatto + + + Se attivato, il gioco sarà un gioco online. + + + Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. + + + Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. + + + Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. + + + Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. + + + Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. + + + Se l'opzione è abilitata, il TNT esplode quando viene attivato. + + + Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. + + + No + + + Modalità: Creativa + + + Sopravvivenza + + + Creativa + + + Rinomina il mondo + + + Inserisci il nuovo nome del tuo mondo + + + Modalità: Sopravvivenza + + + In modalità Sopravvivenza + + + Rinomina salvataggio + + + Autosalvataggio tra %d... + + + + + + In modalità Creativa + + + Renderizza nuvole + + + Cosa vuoi fare con questo salvataggio? + + + Dimen. interfaccia (schermo div.) + + + Ingrediente + + + Combustibile + + + Dispenser + + + Cassa + + + Incantesimo + + + Fornace + + + Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. + + + Vuoi davvero eliminare questo salvataggio? + + + Da approvare + + + Censurato + + + %s si unisce alla partita. + + + %s ha abbandonato la partita. + + + %s è stato espulso dal gioco. + + + Banco di distillazione + + + Inserisci testo cartello + + + Inserisci il testo per il cartello + + + Inserisci titolo + + + Timeout prova + + + Partita al completo + + + Impossibile accedere: nessuno spazio rimasto + + + Inserisci un titolo per il tuo messaggio + + + Inserisci una descrizione per il tuo messaggio + + + Inventario + + + Ingredienti + + + Inserisci didascalia + + + Inserisci una didascalia per il tuo messaggio + + + Inserisci descrizione + + + In ascolto: + + + Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? +Selezionando OK, uscirai da questa partita. + + + Rimuovi da elenco esclusi + + + Autosalvataggio + + + Livello escluso + + + Il gioco a cui stai cercando di accedere è nell'elenco dei livelli esclusi. +Se scegli di entrarvi comunque, il livello verrà rimosso dall'elenco dei livelli esclusi. + + + Escludere questo livello? + + + Intervallo autosalvataggio: NO + + + Opacità interfaccia + + + Preparazione salvataggio livello + + + Dimensioni dell'interfaccia + + + Min + + + Impossibile collocare qui! + + + Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. + + + Skin preferite + + + Partita di %s + + + Partita con host sconosciuto + + + Ospite disconnesso + + + Resetta impostazioni + + + Vuoi davvero ripristinare le impostazioni predefinite? + + + Errore caricamento + + + Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. + + + Creazione di partita non riuscita + + + Selezionato automaticamente + + + No pacchetto: skin predef. + + + Accedi + + + Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? + + + Multiplayer non consentito + + + Bevi + + + In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + + Grano, Zucche e 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. + + + Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. + + + Raggiungi l'altra estremità di questo fosso per continuare. + + + Hai completato il tutorial della modalità Creativa. + + + 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. + + + I Cactus si piantano nella sabbia e crescono fino a raggiungere un'altezza di tre blocchi. Come per la Canna da zucchero, distruggere il blocco inferiore ti permetterà di raccogliere anche i blocchi che lo sovrastano.{*ICON*}81{*/ICON*} + + + I Funghi vanno piantati in un'area scarsamente illuminata. Crescendo, si allargano verso i blocchi vicini, purché siano anch'essi in penombra.{*ICON*}39{*/ICON*} + + + La Farina d'ossa può essere usata per portare a maturità i raccolti o per trasformare i Funghi in Funghi giganti.{*ICON*}351:15{*/ICON*} + + + Il Grano attraversa vari stadi prima di giungere a maturazione. È pronto ad essere raccolto quando ha assunto una tinta più scura.{*ICON*}59:7{*/ICON*} + + + Zucche e 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. + + + 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*} + + + 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. + + + Nel forziere in quest'area ci sono dei componenti per creare dei circuiti con i pistoni. Prova a usare o completare i circuiti in quest'area, oppure creane uno personalizzato. Troverai altri esempi al di fuori dell'area del tutorial. + + + In quest'area c'è un Portale per il Sottomondo! + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui Portali e sul Sottomondo.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano i Portali e il Sottomondo. + + + + 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*} + + + + + I ripetitori a pietrarossa si usano per alimentare a distanza o per inserire un ritardo in un circuito. + {*ICON*}356{*/ICON*} + + + + + Quando è alimentato, un pistone si estende, spingendo fino a 12 blocchi. Quando si ritira, un pistone appiccicoso può tirare un blocco di quasi tutti i tipi. + {*ICON*}33{*/ICON*} + + + + I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. + + + Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. + + + Ora sei in modalità Creativa. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla modalità Creativa.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la modalità Creativa. + + + Per attivare un Sottoportale, dai fuoco ai blocchi di ossidiana dentro la struttura, usando acciarino e pietra focaia. I Portali possono essere disattivati se la struttura si rompe, se c'è un'esplosione nelle vicinanze o se del liquido vi scorre dentro. + + + Per usare un Sottoportale, mettiti in piedi all'interno. Lo schermo diventerà viola e sentirai un suono. Dopo qualche secondo sarai trasportato in un'altra dimensione. + + + Il Sottomondo può essere pericoloso e pieno di lava, ma può essere utile per raccogliere Sottogriglia, che una volta accesa brucia all'infinito, e Pietra brillante, che produce luce. + + + Hai completato il tutorial sulla coltivazione. + + + Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. + + + Attrezzi diversi sono indicati per materiali diversi. Usa la piccozza per scavare pietra e minerali. Per ottenere risorse da alcuni blocchi, potrebbe rendersi necessario costruire piccozze con materiali migliori. + + + Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. + + + I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. + + + Non puoi abbandonare l'area finché non avrai completato il tutorial. + + + Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. + + + 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... + + + Nella cassa accanto al fiume c'è una barca. Per usarla, punta il cursore verso l'acqua e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mentre punti verso la barca per salirci. + + + Nella cassa accanto al laghetto c'è una canna da pesca. Prendi la canna da pesca dalla cassa e selezionala come oggetto in mano per usarla. + + + Questo pistone con un meccanismo più avanzato crea un ponte auto-riparante! Premi il pulsante per attivarlo, poi scopri in che modo i componenti interagiscono tra loro per saperne di più. + + + L'attrezzo che stai usando si è danneggiato. Ogni volta che usi un attrezzo, esso si danneggia e, alla fine, si rompe. La barra colorata sotto l'oggetto nell'inventario mostra lo stato corrente. + + + Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. + + + In quest'area c'è un carrello da miniera sui binari. Per salirci, punta il cursore verso i binari e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sul pulsante per far muovere il carrello. + + + 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. + + + 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. + + + Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto. + + + Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. + + + In quest'area troverai alcuni animali rinchiusi in un recinto. Se li fai riprodurre, gli animali metteranno al mondo delle versioni in miniatura di se stessi. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla riproduzione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + + Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. + + + 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*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. + + + I golem si creano sistemando una zucca in cima a una pila di blocchi. + + + I golem di neve si creano con due blocchi di neve, uno sull'altro, con in cima una zucca. I golem di neve scagliano palle di neve contro i nemici. + + + + I 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. + + + + Hai completato il tutorial sulla riproduzione. + + + In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. + + + 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. + + + Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. + + + Usa il Banco di distillazione per creare una Pozione di Resistenza al fuoco. Ti serviranno una Bottiglia d'acqua, una Verruca del Sottomondo e Crema di magma. + + + + Prendi una pozione e tieni premuto{*CONTROLLER_ACTION_USE*} per usarla. Le pozioni normali vengono ingerite e producono i propri effetti sul giocatore stesso; le pozioni Area, invece, vengono lanciate e il loro effetto si applica alle creature che si trovano nella zona dell'impatto. + È possibile creare delle pozioni bomba aggiungendo polvere da sparo a una pozione normale. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla distillazione di pozioni.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. + + + Puoi riempire una Bottiglia di vetro attingendo acqua da un Calderone che ne contenga o da un blocco d'acqua. Riempi la tua bottiglia posizionando il cursore su una fonte d'acqua e premendo{*CONTROLLER_ACTION_USE*}. + + + Usa la Pozione di Resistenza al fuoco su te stesso. + + + Per applicare un incantesimo a un oggetto, posizionalo nello slot di incantamento. È possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. + + + La cifra sul pulsante indica il costo in punti Esperienza dell'incantesimo. Se non hai un livello di Esperienza sufficiente, il pulsante non sarà selezionabile. + + + Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. + + + Questa è l'interfaccia degli incantesimi. Puoi usarla per incantare armi, armature e alcuni attrezzi. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia per gli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. + + + L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. + + + Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. + + + Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. + + + Puoi usare molti oggetti di legno come combustibile, ma ciascuno brucia per un tempo diverso. Puoi anche scoprire altri oggetti nel mondo da usare come combustibile. + + + Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. + + + Usando il legno come ingrediente, puoi produrre l'antracite. Inserisci del combustibile nella fornace e del legno nello slot ingrediente. La fornace può richiedere tempo per creare l'antracite, quindi sentiti libero di fare altro e di tornare in seguito a controllare l'avanzamento. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. + + + L'Occhio di ragno fermentato inquina la pozione e può farle acquisire effetti diametralmente opposti, mentre la Polvere da sparo la trasforma in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nella zona colpita. + + + Crea una Pozione di Resistenza al fuoco aggiungendo prima una Verruca del Sottomondo a una Bottiglia d'acqua e completando poi la pozione con della Crema di magma. + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. + + + Per distillare una pozione, posiziona un ingrediente nello slot superiore e una pozione o una Bottiglia d'acqua negli slot inferiori. Puoi preparare fino a tre pozioni contemporaneamente. Una volta inserita una combinazione di ingredienti corretta, il processo di distillazione si avvierà e, dopo un breve periodo di tempo, potrai ritirare la tua pozione. + + + Il punto di partenza di tutte le pozioni è una Bottiglia d'acqua. Quasi tutte le pozioni vengono preparate utilizzando prima una Verruca del Sottomondo per creare una Maldestra pozione e aggiungendo poi almeno un altro ingrediente per ottenere il prodotto finale. + + + È possibile modificare gli effetti di una pozione aggiungendo altri ingredienti. La Polvere di pietra rossa, ad esempio, rende più duraturi gli effetti della pozione, mentre la Polvere di pietra brillante li rende più potenti. + + + Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. + + + Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. + {*FishingRodIcon*} + + + Se aspetti che il galleggiante affondi sotto la superficie dell'acqua prima di tirare, potresti prendere un pesce. Il pesce si può mangiare crudo o cucinato nella fornace per reintegrare la salute. + {*FishIcon*} + + + Come nel caso di molti altri attrezzi, la canna da pesca ha un numero di utilizzi prestabilito, non limitato alla pesca. Sperimenta e scopri cos'altro puoi prendere o attivare... + {*FishingRodIcon*} + + + La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. + + + Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} + + + In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui circuiti con pietre rosse e pistoni.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano. + + + Leve, pulsanti, piastre a pressione e torce a pietre rosse alimentano i circuiti collegandoli direttamente all'oggetto da attivare o connettendoli con la polvere di pietra rossa. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. + + + Il letto dovrebbe trovarsi in un punto sicuro e ben illuminato, in modo che i mostri non ti sveglino nel cuore della notte. Una volta usato un letto, se dovessi morire, tornerai in quel punto. + {*ICON*}355{*/ICON*} + + + Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. + {*ICON*}355{*/ICON*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. + + + Utilizzando un Tavolo per incantesimi è possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. + + + Gli incantesimi richiedono un certo livello di Esperienza; puoi far salire di livello la tua Esperienza raccogliendo le sfere di Esperienza che vengono abbandonate da mostri e animali uccisi, estraendo metalli, facendo riprodurre animali, pescando e fondendo/cuocendo alcuni oggetti in una fornace. + + + Gli incantesimi sono casuali, ma alcuni dei più potenti sono disponibili solo quando hai un livello elevato di Esperienza e intorno al Tavolo per incantesimi ci sono molti scaffali che ne aumentano la potenza. + + + In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + 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. + + + Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. + {*RailIcon*} + + + Puoi anche creare binari potenziati, che traggono energia dai circuiti e dalle torce di pietre rosse per far accelerare il carrello. Potrai quindi collegarli a interruttori, leve e piastre a pressione per realizzare sistemi complessi. + {*PoweredRailIcon*} + + + Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + Le casse che troverai in quest'area contengono oggetti già incantati, Bottiglie magiche e alcuni oggetti da incantare per acquisire dimestichezza con il Tavolo per incantesimi. + + + Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul carrello da miniera.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il carrello da miniera. + + + Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. + + + Leggi + + + Appendi + + + Lancia + + + Apri + + + Cambia tonalità + + + Fai esplodere + + + Pianta + + + Sblocca gioco completo + + + Elimina salvataggio + + + Elimina + + + Ara + + + Mieti + + + Continua + + + Nuota su + + + Colpisci + + + Mungi + + + Raccogli + + + Svuota + + + Sella + + + Colloca + + + Mangia + + + Cavalca + + + Naviga + + + Coltiva + + + Dormi + + + Svegliati + + + Suona + + + Opzioni + + + Sposta armatura + + + Sposta arma + + + Equipaggia + + + Sposta ingrediente + + + Sposta combustibile + + + Sposta attrezzo + + + Tendi + + + Pagina su + + + Pagina giù + + + Modalità Amore + + + Rilascia + + + Privilegi + + + Parata + + + Creativa + + + Escludi livello + + + Seleziona skin + + + Accendi + + + Invita amici + + + Accetta + + + Tosa + + + Naviga + + + Reinstalla + + + Opzioni dati + + + Esegui comando + + + Installa versione completa + + + Installa versione di prova + + + Installa + + + Espelli + + + Aggiorna elenco partite + + + Giochi Party + + + Tutti i giochi + + + Esci + + + Annulla + + + Annulla accesso + + + Cambia gruppo + + + Crafting + + + Crea + + + Prendi/Colloca + + + Mostra inventario + + + Mostra descrizione + + + Mostra ingredienti + + + Indietro + + + Promemoria: + + + + + + Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. + + + Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. + + + Congratulazioni, hai completato il tutorial. Il tempo nel gioco scorre normalmente, e tra poco sarà notte e i mostri usciranno allo scoperto! Completa il rifugio! + + + {*EXIT_PICTURE*} Quando sarai pronto a proseguire l'esplorazione, vicino al rifugio del minatore troverai una scala che conduce a un piccolo castello. + + + {*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barra del cibo e sull'alimentazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. + + + Seleziona + + + Usa + + + In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. + + + Fuori da quest'area, troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi e pozioni da distillare! + + + La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. + + + Prendi + + + Avanti + + + Indietro + + + Espelli giocatore + + + Invia richiesta amico + + + Pagina giù + + + Pagina su + + + Tingi + + + Cura + + + Siediti + + + Seguimi + + + Scava + + + Nutri + + + Addomestica + + + Cambia filtro + + + Colloca tutti + + + Colloca uno + + + Posa + + + Prendi tutto + + + Prendi metà + + + Colloca + + + Posa tutti + + + Elimina scelta rapida + + + Cos'è? + + + Condividi su Facebook + + + Posa uno + + + Scambia + + + Spost. veloce + + + Pacchetti di skin + + + Lastra di vetro dipinto rossa + + + Lastra di vetro dipinto verde + + + Lastra di vetro dipinto marrone + + + Vetro dipinto bianco + + + Lastra di vetro dipinto + + + Lastra di vetro dipinto nera + + + Lastra di vetro dipinto blu + + + Lastra di vetro dipinto grigia + + + Lastra di vetro dipinto rosa + + + Lastra di vetro dipinto verde chiaro + + + Lastra di vetro dipinto viola + + + Lastra di vetro dipinto azzurra + + + Lastra di vetro dipinto grigia chiara + + + Vetro dipinto arancione + + + Vetro dipinto blu + + + Vetro dipinto viola + + + Vetro dipinto azzurro + + + Vetro dipinto rosso + + + Vetro dipinto verde + + + Vetro dipinto marrone + + + Vetro dipinto grigio chiaro + + + Vetro dipinto giallo + + + Vetro dipinto blu chiaro + + + Vetro dipinto magenta + + + Vetro dipinto grigio + + + Vetro dipinto rosa + + + Vetro dipinto verde chiaro + + + Lastra di vetro dipinto gialla + + + Grigio chiaro + + + Grigio + + + Rosa + + + Blu + + + Viola + + + Azzurro + + + Verde chiaro + + + Arancione + + + Bianco + + + Personalizzato + + + Giallo + + + Blu chiaro + + + Magenta + + + Marrone + + + Lastra di vetro dipinto bianca + + + Palla piccola + + + Palla grande + + + Lastra di vetro dipinto blu chiaro + + + Lastra di vetro dipinto magenta + + + Lastra di vetro dipinto arancione + + + Stella + + + Nero + + + Rosso + + + Verde + + + Creeper + + + Fiammata + + + Forma sconosciuta + + + Vetro dipinto nero + + + Armatura di ferro da cavallo + + + Armatura d'oro da cavallo + + + Armatura di diamante da cavallo + + + Comparatore di pietra rossa + + + Carrello da miniera con TNT + + + Carrello da miniera con hopper + + + Piombo + + + Raggio + + + Cassa intrappolata + + + Piastra a pressione pesata (leggera) + + + Targhetta del nome + + + Assi di legno (ogni tipo) + + + Blocco di comando + + + Stella per fuochi artificiali + + + Questi animali possono essere addomesticati e in seguito montati. Possono essere dotati di una cassa. + + + Mulo + + + Nato dall'accoppiamento di un cavallo e un asino. Questi animali possono essere addomesticati e in seguito montati, indossare armature e trasportare casse. + + + Cavallo + + + Questi animali possono essere addomesticati e in seguito montati. + + + Asino + + + Cavallo zombie + + + Mappa vuota + + + Stella del Sottomondo + + + Razzo per fuochi artificiali + + + Cavallo scheletro + + + Avvizzito + + + Vengono creati usando teschi avvizziti e sabbie mobili. Quando esplodono lanciano teschi. + + + Piastra a pressione pesata (pesante) + + + Argilla dipinta grigia chiara + + + Argilla dipinta grigia + + + Argilla dipinta rosa + + + Argilla dipinta blu + + + Argilla dipinta viola + + + Argilla dipinta azzurra + + + Argilla dipinta verde chiara + + + Argilla dipinta arancione + + + Argilla dipinta bianca + + + Vetro dipinto + + + Argilla dipinta gialla + + + Argilla dipinta blu chiara + + + Argilla dipinta magenta + + + Argilla dipinta marrone + + + Hopper + + + Binario attivatore + + + Dropper + + + Comparatore di pietra rossa + + + Sensore luce solare + + + Blocco di pietra rossa + + + Argilla dipinta + + + Argilla dipinta nera + + + Argilla dipinta rossa + + + Argilla dipinta verde + + + Balla di fieno + + + Argilla indurita + + + Blocco di carbone + + + Dissolvenza + + + 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. + + + Quando è attivato, i giocatori conservano il loro inventario quando muoiono. + + + Quando è disattivato, i nemici non si rigenerano naturalmente. + + + Modalità: Avventura + + + Avventura + + + Inserisci un seme per generare di nuovo lo stesso terreno. Lascia vuoto per generare un mondo casuale. + + + Quando è attivato, mostri e animali non rilasciano oggetti (ad esempio, i creeper non rilasciano polvere da sparo). + + + {*PLAYER*} è caduto da una scala + + + {*PLAYER*} è caduto da un vitigno + + + {*PLAYER*} è caduto fuori dall'acqua + + + Quando è disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (ad esempio, i blocchi di pietra non rilasciano ciottoli). + + + Quando è disattivato, i giocatori non rigenerano naturalmente la salute. + + + Quando è disattivato, l'ora del giorno non cambia. + + + Carrello da miniera + + + Guinzaglio + + + Rilascia + + + Attacca + + + Smonta + + + Cassa attaccata + + + Lancia + + + Nome + + + Raggio + + + Potenza primaria + + + Potenza secondaria + + + Cavallo + + + Dropper + + + Hopper + + + {*PLAYER*} è caduto da un luogo alto + + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di pipistrelli nel mondo. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di cavalli. + + + Opzioni di gioco + + + {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è stato pestato a morte da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è stato ucciso da {*SOURCE*} con {*ITEM*} + + + Scorrettezza nemici + + + Posa tessere + + + Rigenerazione naturale + + + Ciclo solare + + + Mantieni inventario + + + Rigenerazione nemici + + + Bottino nemici + + + {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è caduto troppo lontano ed è stato finito da {*SOURCE*} + + + {*PLAYER*} è caduto troppo lontano ed è stato finito da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è entrato nel fuoco combattendo {*SOURCE*} + + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} + + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} + + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} è stato cotto a puntino mentre combatteva {*SOURCE*} + + + {*PLAYER*} è stato fatto esplodere da {*SOURCE*} + + + {*PLAYER*} si è avvizzito + + + {*PLAYER*} è stato ucciso da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} ha tentato di nuotare nella lava per sfuggire a{*SOURCE*} + + + {*PLAYER*} è affogato mentre tentava di sfuggire a {*SOURCE*} + + + {*PLAYER*} si è scontrato con un cactus mentre tentava di sfuggire a {*SOURCE*} + + + Monta + + + + 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. + + + + + Gli asini e i muli addomesticati possono essere dotati di sacche attaccando una cassa. Tali sacche possono essere usati mentre si cavalca o chinandosi. + + + + + 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. + + + + + 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. + + + + + Una volta addomesticati, appariranno dei cuori intorno ad essi e non tenteranno più di disarcionare il cavaliere. + + + + + Prova a cavalcare un cavallo. Usa {*CONTROLLER_ACTION_USE*} senza oggetti né attrezzi in mano per montare. + + + + + 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. + + + + + Un raggio con una piramide di almeno 4 livelli offre una opzione supplementare: potere secondario di Rigenerazione o potenziamento del potere primario. + + + + + 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. + + + + In cima a questa piramide c'è un Raggio non attivo. + + + + Questa è l'interfaccia del Raggio, che puoi usare per scegliere i poteri forniti dal Raggio stesso. + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'interfaccia del Raggio. + + + + + 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. + + + + + 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. + + + + + Questa è l'interfaccia inventario del cavallo. + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario del cavallo. + + + + + L'inventario del cavallo ti permette di trasferire o equipaggiare oggetti sul tuo cavallo, asino o mulo. + + + + Scintillio + + + Scia + + + Durata in volo: + + + + Sella il cavallo mettendo una sella nell'apposito slot. Ai cavalli puoi mettere un'armatura mettendola nello slot dell'armatura. + + + + 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 soprattutto nelle pianure. I muli possono essere allevati accoppiando cavalli e asini, ma sono sterili. + + + + + Puoi anche trasferire oggetti tra il tuo inventario e le sacche degli asini e dei muli in questo menu. + + + + Hai trovato un cavallo. + + + Hai trovato un asino. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui Raggi. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui Raggi. + + + + + Le Stelle di Fuochi artificiali si creano mettendo Polvere da sparo e Tintura nella griglia di creazione. + + + + + La tintura determina il colore dell'esplosione della Stella per fuochi artificiali. + + + + + La forma della stella si imposta aggiungendo una Scarica di fuoco, una Pepita d'oro, una piuma o una testa. + + + + + Puoi anche mettere diverse Stelle per Fuochi artificiali nella griglia di creazione, per aggiungerli al nuovo Fuoco artificiale. + + + + + Riempiendo più slot nella griglia di creazione con Polvere da sparo aumenterai l'altezza alla quale le Stelle esploderanno. + + + + + Ora puoi prendere il Fuoco artificiale dallo slot di uscita, quando desideri crearlo. + + + + + Si può aggiungere una scia di scintille usando Diamante e Polvere di pietre brillanti. + + + + + 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 + + + + 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. + + + + + Prova a creare un Fuoco artificiale al tavolo di creazione usando una serie di ingredienti nelle casse. + + + + + Dopo aver creato una Stella per fuochi artificiali, puoi impostare il colore della dissolvenza della Stella con la tintura. + + + + + Nelle ceste ci sono diversi oggetti usati nella creazione di FUOCHI ARTIFICIALI! + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui fuochi artificiali. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui fuochi artificiali. + + + + + Per creare un Fuoco artificiale metti Polvere da sparo e Carta nella griglia di creazione 3x3 in alto nel tuo inventario. + + + + Questa stanza contiene hopper + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sugli hopper. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sugli hopper. + + + + + Gli hopper servono per mettere o togliere oggetti dai contenitori, e per raccogliere automaticamente oggetti lanciati dentro di essi. + + + + + 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. + + + + + 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. + + + + + Prova a usare il Raggio per impostare i poteri, puoi usare i lingotti di ferro forniti come pagamento. + + + + + Funzionano con banchi di distillazione, casse, dispenser, dropper, carrelli da miniera con casse, carrelli da miniera con hopper e con altri hopper. + + + + + In questa stanza ci sono diverse soluzioni di hopper con cui sperimentare. + + + + + Questa è l'interfaccia dei Fuochi artificiali, che puoi usare per creare Fuochi artificiali e Stelle di Fuochi artificiali. + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'interfaccia dei Fuochi artificiali. + + + + + 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. + + + + + Ma se un hopper è alimentato da pietra rossa, diventerà inattivo e smetterà di risucchiare e inserire gemme. + + + + + 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à. + + + + Questi nemici si trovano nelle paludi e ti attaccano lanciando pozioni. Quando muoiono rilasciano pozioni. + + + Hai raggiunto il limite per i Telai di dipinti/oggetti di un mondo. + + + Non puoi generare nemici in modalità Relax. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. + + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. + + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. + + + Hai raggiunto il numero massimo di teste di Mob in un mondo. + + + Inverti + + + Mancino + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. + + + È stato raggiunto il numero massimo di navi per mondo. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di galline. + + + {*C2*}Ora respira profondamente. Respira ancora. Senti l'aria nei polmoni. I tuoi arti stanno tornando. Sì, muovi le dita... Hai di nuovo un corpo, nell'aria, soggetto alla forza di gravità. Rigenerati nel lungo sogno. Eccoti. Il tuo corpo tocca ancora una volta l'universo, in tutti i suoi punti, come se foste cose separate. Come se noi fossimo entità separate.{*EF*}{*B*}{*B*} +{*C3*}Chi siamo? Un tempo eravamo chiamati gli spiriti della montagna. Padre Sole, Madre Luna. Spiriti ancestrali... Spiriti animali... Jinn, fantasmi. Poi l'uomo verde. E ancora dei, demoni, angeli... Spiriti, alieni, extraterrestri... Infine leptoni, quark... Le parole cambiano. Noi non cambiamo.{*EF*}{*B*}{*B*} +{*C2*}Noi siamo l'universo. Siamo tutto ciò che credi non sia te. Ora ci stai guardando, attraverso la tua pelle e i tuoi occhi. Perché l'universo sfiora la tua pelle e ti inonda di luce? Per guardarti, giocatore. Per conoscersi e per farsi conoscere. Voglio raccontarti una storia.{*EF*}{*B*}{*B*} +{*C2*}Un tempo c'era un giocatore...{*EF*}{*B*}{*B*} +{*C3*}Quel giocatore eri tu, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore pensava di essere una creatura umana sulla sottile crosta di un globo rotante fatto di roccia fusa. Il globo di roccia fusa girava intorno a una sfera di gas fiammeggianti che era trecentotrentamila volte più grande di esso. La sfera era talmente distante dal globo che la luce impiegava otto minuti per viaggiare dall'una all'altro. La luce era informazione che veniva da una stella, e poteva bruciarti la pelle da una distanza di centocinquanta milioni di chilometri.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere un minatore sulla superficie di un mondo piatto e infinito. Il sole era un quadrato bianco. I giorni erano brevi. C'era sempre molto da fare, e la morte non era altro che un inconveniente temporaneo.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore credeva di essere parte di una storia.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere altre cose in luoghi diversi. Alcuni di quei sogni erano sgradevoli, altri meravigliosi. Capitava anche che il giocatore si svegliasse da un sogno e si ritrovasse in un altro, per poi destarsi anche da quello e scoprirsi in un terzo sogno.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore sognava di guardare delle parole su uno schermo.{*EF*}{*B*}{*B*} +{*C2*}Torniamo indietro.{*EF*}{*B*}{*B*} +{*C2*}Gli atomi del giocatore erano sparsi nell'erba, nei fiumi, nell'aria, nel suolo. Una donna raccolse gli atomi; li bevve, li mangiò, li respirò. La donna ricostruì il giocatore nel proprio corpo.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore si svegliò dal caldo, buio mondo del corpo di sua madre e si ritrovò nel lungo sogno.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore era una nuova storia, mai narrata prima, scritta con lettere di DNA. E il giocatore era un nuovo programma, mai eseguito prima, generato da un codice sorgente vecchio di miliardi di anni. E il giocatore era un nuovo essere umano, che non aveva mai vissuto prima, fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore. La storia. Il programma. L'essere umano. Sei fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C2*}Torniamo ancora più indietro.{*EF*}{*B*}{*B*} +{*C2*}I sette miliardi di miliardi di miliardi di atomi che compongono il corpo del giocatore furono creati molto tempo prima di questo gioco, nel cuore di una stella. Quindi, anche il giocatore è informazione che proviene da una stella. Il giocatore si muove in una storia, che è una foresta di informazioni seminata da un uomo di nome Julian su un mondo piatto e infinito creato da un altro uomo chiamato Markus, che esiste nel piccolo mondo personale creato dal giocatore, che vive in un universo creato da...{*EF*}{*B*}{*B*} +{*C3*}Silenzio... A volte il giocatore creava il suo piccolo mondo personale, e lo faceva caldo, tenero, semplice. Altre volte lo faceva duro, freddo e complesso. A volte creava un modello dell'universo che aveva in mente, punti di energia che si muovono attraverso ampi spazi vuoti. A volte chiamava questi punti "elettroni" e "protoni".{*EF*}{*B*}{*B*} + + + {*C2*}A volte li chiamava "pianeti" e "stelle".{*EF*}{*B*}{*B*} +{*C2*}A volte credeva di esistere in un universo fatto di energia composta da serie di on e di off, di zero e di uno, di linee di codice. A volte credeva di giocare a un gioco. A volte credeva di leggere parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore che legge le parole...{*EF*}{*B*}{*B*} +{*C2*}Silenzio... A volte il giocatore leggeva linee di codice su uno schermo, le scomponeva in parole e da esse ricavava un significato, che diventava sensazioni, emozioni, teorie e idee. Il giocatore iniziò a respirare più velocemente, più profondamente... Si era reso conto di essere vivo. Era vivo. Le migliaia di morti attraverso le quali era passato non erano reali. Il giocatore era vivo{*EF*}{*B*}{*B*} +{*C3*}Tu... Tu... sei... vivo.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato mediante i raggi di sole che filtravano tra le foglie ondeggianti sugli alberi d'estate...{*EF*}{*B*}{*B*} +{*C3*}E a volte il giocatore pensava che l'universo gli avesse parlato tramite la luce che cadeva dal limpido cielo delle notti invernali, quando un puntino luminoso nell'angolo del suo occhio poteva essere una stella milioni di volte più grande del sole, che trasformava i suoi pianeti in plasma incandescente per essere visibile per un solo istante al giocatore, che tornava a casa, dall'altro lato dell'universo, e sentiva il profumo dei cibi sulla porta a lui familiare, poco prima di rimettersi a sognare.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato con serie di zero e di uno, attraverso l'elettricità del mondo, con le parole che comparivano su uno schermo alla fine di un sogno.{*EF*}{*B*}{*B*} +{*C3*}L'universo gli diceva "ti amo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "hai giocato bene"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tutto ciò di cui hai bisogno è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "sei più forte di quanto tu creda"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "sei la luce del giorno"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu sei la notte"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "l'oscurità che combatti è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "la luce che cerchi è dentro di te"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "non sei solo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu non sei separato da tutte le altre cose"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tu sei l'universo che assapora sé stesso, che parla a sé stesso, che legge il proprio codice"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "ti amo perché tu sei amore"...{*EF*}{*B*}{*B*} +{*C3*}E il gioco terminò, e il giocatore si svegliò dal sogno. Il giocatore iniziò un nuovo sogno, migliore del precedente. Il giocatore era l'universo. Il giocatore era amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore.{*EF*}{*B*}{*B*} +{*C2*}Svegliati.{*EF*} + + + Resetta Sottomondo + + + %s si trova ora nel Limite + + + %s ha lasciato il Limite + + + {*C3*}Ho capito a quale giocatore ti riferisci.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sì. Fai attenzione. Ha raggiunto un livello superiore. Può leggere le nostre menti.{*EF*}{*B*}{*B*} +{*C2*}Non importa. Crede che siamo parte del gioco.{*EF*}{*B*}{*B*} +{*C3*}Mi piace, questo giocatore. Ha giocato bene. Non si è arreso.{*EF*}{*B*}{*B*} +{*C2*}Sta leggendo i nostri pensieri come se fossero parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}È così che riesce a immaginare molte cose, quando è immerso nel sogno di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Le parole sono un'interfaccia meravigliosa, estremamente flessibile e molto meno spaventosa del guardare la realtà oltre lo schermo.{*EF*}{*B*}{*B*} +{*C3*}Prima erano soliti ascoltare voci. Prima i giocatori erano in grado di leggere. Un tempo, chi non giocava chiamava i giocatori "streghe" e "stregoni", e i giocatori sognavano di volare su bastoni alimentati dall'energia dei demoni.{*EF*}{*B*}{*B*} +{*C2*}Cosa sognava questo giocatore?{*EF*}{*B*}{*B*} +{*C3*}Sognava la luce del sole, gli alberi... Sognava l'acqua e il fuoco... Sognava di creare, e sognava di distruggere... Sognava di cacciare e di essere preda... Sognava un riparo.{*EF*}{*B*}{*B*} +{*C2*}Ah, l'interfaccia originale... È vecchia di un milione di anni, ma ancora funziona. Ma quale vera struttura ha creato questo giocatore, nella realtà oltre lo schermo?{*EF*}{*B*}{*B*} +{*C3*}Ha funzionato, con oltre un milione di altri individui, per scolpire un vero mondo in una piega di {*EF*}{*NOISE*}{*C3*}, e ha creato {*EF*}{*NOISE*}{*C3*} per {*EF*}{*NOISE*}{*C3*}, in {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Non può leggere quel pensiero.{*EF*}{*B*}{*B*} +{*C3*}No. Non ha ancora raggiunto il livello più alto. Deve arrivarci nel lungo sogno della vita, non nella brevità di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Sa che lo amiamo? Che l'universo è buono?{*EF*}{*B*}{*B*} +{*C3*}A volte, attraverso il rumore dei suoi pensieri, egli ascolta l'universo, sì.{*EF*}{*B*}{*B*} +{*C2*}Capita, però, che nel lungo sogno sia triste. Crea mondi senza estate, trema sotto un sole nero, e crede che la sua triste creazione sia la realtà.{*EF*}{*B*}{*B*} +{*C3*}Se lo guarissimo dal dolore lo distruggeremmo. Il dolore è parte del suo compito personale. Noi non possiamo interferire.{*EF*}{*B*}{*B*} +{*C2*}A volte, quando sognano profondamente, vorrei dire loro che in realtà stanno costruendo dei veri mondi. Vorrei svelare l'importanza che essi hanno per l'universo. E quando non hanno effettuato un vero collegamento per molto tempo, vorrei aiutarli a pronunciare la parola che temono.{*EF*}{*B*}{*B*} +{*C3*}Legge i nostri pensieri.{*EF*}{*B*}{*B*} +{*C2*}Non me ne importa. Certe volte vorrei dire loro che questo mondo che ritengono reale è solo {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}. Mi piacerebbe dire loro che sono {*EF*}{*NOISE*}{*C2*} nel {*EF*}{*NOISE*}{*C2*}. Vedono una parte minuscola della realtà, nel loro lungo sogno...{*EF*}{*B*}{*B*} +{*C3*}Eppure, essi continuano a giocare.{*EF*}{*B*}{*B*} +{*C2*}Sarebbe così facile dire tutto...{*EF*}{*B*}{*B*} +{*C3*}La rivelazione sarebbe troppo forte per questo sogno. Dire come vivere impedirebbe loro di vivere.{*EF*}{*B*}{*B*} +{*C2*}Non dirò al giocatore come vivere.{*EF*}{*B*}{*B*} +{*C3*}Il giocatore si sta inquietando.{*EF*}{*B*}{*B*} +{*C2*}Narrerò una storia al giocatore.{*EF*}{*B*}{*B*} +{*C3*}Ma non racconterò la verità.{*EF*}{*B*}{*B*} +{*C2*}No. Sarà una storia che conterrà la verità in modo sicuro, protetta da una gabbia di parole. Non dirò la cruda verità che può bruciare a qualsiasi distanza.{*EF*}{*B*}{*B*} +{*C3*}Dagli di nuovo un corpo.{*EF*}{*B*}{*B*} +{*C2*}Sì. Giocatore...{*EF*}{*B*}{*B*} +{*C3*}Usa il suo nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Giocatore.{*EF*}{*B*}{*B*} +{*C3*}Bene.{*EF*}{*B*}{*B*} + + + Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! + + + 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. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di lupi. + + + Resetta il Sottomondo + + + Non resettare il Sottomondo + + + Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. + + + Sei morto! + + + Opzioni mondo + + + Può costruire e scavare + + + Può usare porte e interruttori + + + Genera strutture + + + Mondo superpiatto + + + Cassa bonus + + + Può aprire contenitori + + + Espelli giocatore + + + Può volare + + + Disabilita stanchezza + + + Può attaccare i giocatori + + + Può attaccare gli animali + + + Moderatore + + + Privilegi dell'host + + + Come giocare + + + Comandi + + + Impostazioni + + + Rigenerati + + + Offerte contenuto scaricabile + + + Cambia skin + + + Riconoscimenti + + + Esplosione TNT + + + Giocatore vs Giocatore + + + Autorizza giocatori + + + Reinstalla contenuto + + + Impostazioni debug + + + Diffusione incendio + + + Drago di Ender + + + Un Drago di Ender ha ucciso {*PLAYER*} con il suo alito + + + {*PLAYER*} è stato ucciso da {*SOURCE*} + + + {*PLAYER*} è stato ucciso da {*SOURCE*} + + + {*PLAYER*} è morto + + + {*PLAYER*} è saltato in aria + + + {*PLAYER*} è stato ucciso dalla magia + + + {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} + + + Nebbia substrato roccioso + + + Mostra interfaccia + + + Mostra mano + + + {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} + + + {*PLAYER*} è stato pestato a morte da {*SOURCE*} + + + {*PLAYER*} è stato ucciso da {*SOURCE*} con la magia + + + {*PLAYER*} è caduto fuori dal mondo + + + Pacchetti Texture + + + Pacchetti Mash-Up + + + {*PLAYER*} ha preso fuoco + + + Temi + + + Immagini del giocatore + + + Oggetti avatar + + + {*PLAYER*} è bruciato vivo + + + {*PLAYER*} è morto di fame + + + {*PLAYER*} è morto in seguito a una puntura + + + {*PLAYER*} si è schiantato al suolo + + + {*PLAYER*} ha cercato di nuotare nella lava + + + {*PLAYER*} è soffocato dentro un muro + + + {*PLAYER*} è affogato + + + Messaggi di morte + + + Non sei più un moderatore + + + Ora puoi volare + + + Non puoi più volare + + + Non puoi più attaccare gli animali + + + Ora puoi attaccare gli animali + + + Ora sei un moderatore + + + Non sentirai più la stanchezza + + + Ora sei invulnerabile + + + Non sei più invulnerabile + + + %d MSP + + + Ora sentirai la stanchezza + + + Ora sei invisibile + + + Non sei più invisibile + + + Ora puoi attaccare i giocatori + + + Ora puoi scavare e usare oggetti + + + Non puoi più posizionare blocchi + + + Ora puoi posizionare blocchi + + + Personaggio animato + + + Animaz. skin personalizzata  + + + Non puoi più scavare né usare oggetti + + + Ora puoi usare porte e interruttori + + + Non puoi più attaccare i nemici + + + Ora puoi attaccare i nemici + + + Non puoi più attaccare i giocatori + + + Non puoi più usare porte e interruttori + + + Ora puoi usare contenitori (es. casse) + + + Non puoi più usare contenitori (es. casse) + + + Invisibile + + + 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*} + + + + {*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. + + + + {*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. + + + + Quando viene usato, diventa una mappa della parte di mondo in cui ti trovi, che viene scoperta mano a mano che esplori. + + + Rilasciato da Avvizzito, usato per creare Raggi. + + + Hopper + + + {*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*} + + + + Dropper + + + NON USATA + + + Guarigione istantanea + + + Danno istantaneo + + + Salto potenziato + + + Fatica del minatore + + + Forza + + + Debolezza + + + Nausea + + + NON USATA + + + NON USATA + + + NON USATA + + + Rigenerazione + + + Resistenza + + + Ricerca di un Seme per il Generatore di mondi. + + + 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. + + + Un tipo di binario che può attivare o disattivare carrelli da miniera con hopper e innescare carrelli da miniera con TNT. + + + Si usa per conservare e distribuire oggetti, o mettere oggetti in un altro contenitore, quando riceve una carica di pietra rossa. + + + Blocchi colorati realizzati tingendo argilla indurita. + + + Fornisce una carica di pietra rossa. La carica sarà maggiore se ci sono più oggetti sul piatto. Richiede più peso di una piastra leggera. + + + Usato come fonte di energia per la pietra rossa. Può essere ritrasformato in pietra rossa. + + + Serve a catturare oggetti o a trasferirli da e verso i contenitori. + + + Cibo per cavalli, asini e muli che cura fino a 10 cuori. Accelera la crescita dei puledri. + + + Pipistrello + + + Queste creature volanti si trovano nelle caverne e in altri grandi spazi chiusi. + + + Strega + + + Risultato della cottura dell'argilla in una fornace. + + + Creata a partire da vetro e vernice. + + + Creata a partire da vetro dipinto + + + Fornisce una carica di pietra rossa. La carica sarà maggiore se ci sono più oggetti sul piatto. + + + È un blocco che emette un segnale di pietra rossa basato sulla luce del sole (o sulla mancanza della stessa). + + + È un tipo speciale di carrello da miniera che funziona come un hopper. Raccoglie oggetti dai binari e dai contenitori soprastanti. + + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 5 Armatura. + + + Usati per determinare il colore, l'effetto e la forma di un fuoco artificiale. + + + Usato nei circuiti di pietra rossa per mantenere, comparare o sottrarre forza al segnale, o misurare gli stati di certi blocchi. + + + È un tipo di carrello da miniera che agisce come un blocco di TNT semovente. + + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 7 Armatura. + + + Serve per eseguire comandi. + + + Proietta un raggio di luce nel cielo e può causare effetti di stato 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 inoltre crea una pietra rossa quando viene aperta. + + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 11 Armatura. + + + Usato per legare nemici al giocatore o pali di recinzione. + + + Serve a dare nomi ai nemici. + + + Fretta + + + Sblocca gioco completo + + + Riprendi gioco + + + Salva gioco + + + Gioca + + + Classifiche + + + Guida e opzioni + + + Difficoltà: + + + PvP: + + + Autorizza giocatori: + + + TNT: + + + Tipo di gioco: + + + Strutture: + + + Tipo di livello: + + + Nessuna partita trovata + + + Solo invito + + + Altre opzioni + + + Carica + + + Opzioni host + + + Giocatori/Invito + + + Partita online + + + Nuovo mondo + + + Giocatori + + + Unisciti alla partita + + + Avvia gioco + + + Nome mondo + + + Seme per generatore mondo + + + Lascia vuoto per seme casuale + + + Diffusione incendio: + + + Modifica messaggio cartello: + + + Inserisci i dettagli del tuo screenshot + + + Didascalia + + + Aiuti contestuali del gioco + + + 2 gioc. schermo diviso verticale + + + Fatto + + + Screenshot del gioco + + + Nessun effetto + + + Velocità + + + Lentezza + + + Modifica messaggio cartello: + + + Texture, icone e interfaccia classiche di Minecraft! + + + 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 + + + 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. + + + 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*} @@ -283,6 +3662,23 @@ Gli ingredienti utilizzabili nelle pozioni sono:{*B*}{*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*} @@ -293,25 +3689,6 @@ L'incantesimo verrà selezionato casualmente tra tutti gli incantesimi di costo 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: 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: ESCLUSIONE DI LIVELLI{*ETW*}{*B*}{*B*} @@ -340,7 +3717,25 @@ 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*} -{*T1*}Opzioni di generazione del mondo{*ETW*}{*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*} @@ -404,60 +3799,91 @@ Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo a 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! + + + {*T3*}COME GIOCARE: BASI{*ETW*}{*B*}{*B*} +In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. Di notte i mostri vagano in libertà, quindi costruisci un riparo per tempo.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} per guardarti intorno.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} per muoverti.{*B*}{*B*} +Premi{*CONTROLLER_ACTION_JUMP*} per saltare.{*B*}{*B*} +Sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione per scattare. Finché tieni premuto {*CONTROLLER_ACTION_MOVE*}, il personaggio continuerà a scattare, a meno che il tempo per lo scatto non si esaurisca o nella barra del cibo restino meno di{*ICON_SHANK_03*}.{*B*}{*B*} +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare i blocchi.{*B*}{*B*} +Se tieni un oggetto in mano, usa{*CONTROLLER_ACTION_USE*} per utilizzarlo, oppure premi{*CONTROLLER_ACTION_DROP*} per posarlo. + + + {*T3*}COME GIOCARE: INTERFACCIA{*ETW*}{*B*}{*B*} +L'interfaccia mostra informazioni sul tuo stato: salute, ossigeno rimasto (quando sei sott'acqua), livello di fame (devi mangiare per reintegrare la barra) e armatura (se la indossi).{*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. + + + {*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. + + + La Minecon 2013 si è svolta a Orlando, Florida, USA! + + + .party() è stato fantastico! + + + Invece di dare credito ai pettegolezzi, dai sempre per scontato che siano falsi! + Pagina precedente - - Basi - - - Interfaccia - - - Inventario - - - Casse - - - Crafting - - - Fornace - - - Dispenser - - - Allevare gli animali - - - Riproduzione animali - - - Distillazione - - - Incantesimi - - - Sottoportale - - - Multiplayer - - - Condivisione di screenshot - - - Esclusione di livelli - - - Modalità Creativa - - - Opzioni dell'host e del giocatore - Commercio @@ -467,6 +3893,15 @@ Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo a Limite + + Esclusione di livelli + + + Modalità Creativa + + + Opzioni dell'host e del giocatore + {*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*} @@ -479,70 +3914,14 @@ Nel frattempo il Drago di Ender ti attaccherà in volo e ti lancerà palle di ac 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. - - - Scatto - - - Novità - - - {*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*} - {*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*} +{*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*} Infligge un danno maggiore della mano. @@ -550,241 +3929,247 @@ Ci sono tante nuove funzionalità per te e i tuoi amici, ecco un assaggio. Dai u Serve per scavare terra, erba, sabbia, ghiaia e neve più in fretta che a mano. Le pale servono per scavare palle di neve. + + Scatto + + + Novità + + + {*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*} + + + + + Condivisione di screenshot + + + Casse + + + Crafting + + + Fornace + + + Basi + + + Interfaccia + + + Inventario + + + Dispenser + + + Incantesimi + + + Sottoportale + + + Multiplayer + + + Allevare gli animali + + + Riproduzione animali + + + Distillazione + + + A deadmau5 piace Minecraft! + + + Gli uomini-maiale non attaccano, a meno che non vengano attaccati per primi. + + + Puoi modificare il punto di generazione del gioco e saltare all'alba dormendo in un letto. + + + Rispondi all'attacco del ghast con queste palle di fuoco! + + + Costruisci delle torce per fare luce durante la notte. I mostri staranno alla larga dalle aree illuminate. + + + Arriva prima a destinazione con un carrello da miniera e un binario! + + + Pianta degli arbusti e cresceranno fino a diventare alberi. + + + Costruendo un portale potrai accedere a un'altra dimensione, il Sottomondo. + + + Scavare in linea retta verso l'alto o verso il basso non è una grande idea. + + + La farina d'ossa (creata da un osso di scheletro) può essere utilizzata come fertilizzante e tutto crescerà in un istante! + + + I creeper esplodono man mano che ti si avvicinano! + + + Premi{*CONTROLLER_VK_B*} per far cadere l'oggetto che stai tenendo in mano! + + + Usa l'attrezzo giusto per il lavoro giusto! + + + Se non trovi il carbone per le torce, puoi sempre crearne un po' utilizzando gli alberi e la fornace. + + + Le costolette di maiale arrostite reintegrano più salute di quelle crude. + + + Impostando la difficoltà del gioco su Relax, la salute verrà reintegrata automaticamente e di notte non usciranno mostri! + + + Dai un osso a un lupo per ammansirlo. Potrai chiedergli di sedersi o di seguirti. + + + Per mettere degli oggetti nel menu Inventario, sposta il cursore dal menu e premi{*CONTROLLER_VK_A*} + + + Sono disponibili nuovi contenuti scaricabili! Per accedervi, seleziona il pulsante Negozio di Minecraft nel menu principale. + + + Puoi cambiare l'aspetto del tuo personaggio con il pacchetto Skin disponibile nel Negozio di Minecraft. Seleziona "Negozio di Minecraft" nel menu principale per sapere che cosa è disponibile. + + + Modifica le impostazioni gamma per aumentare o diminuire la luminosità del gioco. + + + 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. + + + Usa una zappa per preparare un appezzamento di terreno pronto per la coltura. + + + I ragni non attaccano durante il giorno, a meno che non vengano attaccati per primi. + + + Se per scavare nella terra o nella sabbia usi una vanga invece delle mani farai più in fretta! + + + Ottieni costolette di maiale dai maiali, cucinale e mangiale per reintegrare la salute. + + + Ottieni della pelle dalle mucche e usala per costruire un'armatura. + + + Se hai un secchio vuoto, puoi riempirlo di latte di mucca, acqua o lava! + + + L'ossidiana si crea quando l'acqua entra in contatto con un blocco di lava. + + + Il gioco ora contiene recinzioni impilabili! + + + Alcuni animali ti seguiranno se hai del grano in mano. + + + Se un animale non può spostarsi per più di 20 blocchi in qualsiasi direzione non sparirà. + + + Lo stato di salute dei lupi addomesticati è riconoscibile dalla posizione della coda. Dagli della carne per curarli. + + + Cuoci un cactus in una fornace per ottenere tintura verde. + + + Per le ultime informazioni sugli aggiornamenti del gioco, leggi la sezione Novità nei menu Come giocare. + + + Musica di C418! + + + Chi è Notch? + + + La Mojang ha più premi che dipendenti! + + + Alcune celebrità giocano a Minecraft! + + + Oltre un milione di persone segue Notch su Twitter! + + + Non tutti gli svedesi sono biondi. Alcuni, come Jens della Mojang, hanno addirittura i capelli rossi! + + + Presto sarà disponibile un aggiornamento per questo gioco! + + + Colloca due casse vicine per creare una cassa grande. + + + Fai attenzione quando costruisci strutture di lana all'aria aperta: i fulmini dei temporali possono incendiarle. + + + Usa un secchio di lava in una fornace per fondere 100 blocchi. + + + Lo strumento suonato dal blocco nota dipende dal materiale sottostante. + + + Una volta rimosso il blocco di lava, servono alcuni minuti prima che quest'ultima scompaia COMPLETAMENTE. + + + Il pietrisco non subisce danni dalle palle di fuoco dei ghast, quindi è utile per proteggere i portali. + + + I blocchi utilizzabili come fonti di luce sciolgono neve e ghiaccio. Tra questi vi sono torce, pietre brillanti e zucche di Halloween. + + + Zombie e scheletri possono sopravvivere alla luce del giorno, se si trovano nell'acqua. + + + Le galline depongono uova a intervalli di 5-10 minuti. + + + L'ossidiana si scava solo con una piccozza di diamante. + + + I creeper sono la fonte di polvere da sparo più facile da ottenere. + + + Se attacchi un lupo, gli altri membri del branco si rivolteranno e ti assaliranno. Questo vale anche per gli uomini-maiali zombie. + + + I lupi non possono accedere al Sottomondo. + + + I lupi non attaccano i creeper. + Serve per scavare blocchi di pietra e minerali. - - Si usa per abbattere blocchi di legno più in fretta che a mano. - - - Si usa per arare blocchi di terra ed erba e prepararli per il raccolto. - - - Le porte di legno si attivano usandole, colpendole o con una pietra rossa. - - - Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. - - - NON USATA - - - NON USATA - - - NON USATA - - - NON USATA - - - Dà all'utilizzatore Armatura 1 se indossato. - - - Dà all'utilizzatore Armatura 3 se indossato. - - - Dà all'utilizzatore Armatura 2 se indossato. - - - Dà all'utilizzatore Armatura 1 se indossato. - - - Dà all'utilizzatore Armatura 2 se indossato. - - - Dà all'utilizzatore Armatura 5 se indossato. - - - Dà all'utilizzatore Armatura 4 se indossato. - - - Dà all'utilizzatore Armatura 1 se indossato. - - - Dà all'utilizzatore Armatura 2 se indossato. - - - Dà all'utilizzatore Armatura 6 se indossato. - - - Dà all'utilizzatore Armatura 5 se indossato. - - - Dà all'utilizzatore Armatura 2 se indossato. - - - Dà all'utilizzatore Armatura 2 se indossato. - - - Dà all'utilizzatore Armatura 5 se indossato. - - - Dà all'utilizzatore Armatura 3 se indossato. - - - Dà all'utilizzatore Armatura 1 se indossato. - - - Dà all'utilizzatore Armatura 3 se indossato. - - - Dà all'utilizzatore Armatura 8 se indossato. - - - Dà all'utilizzatore Armatura 6 se indossato. - - - Dà all'utilizzatore Armatura 3 se indossato. - - - Lingotto lucente utilizzabile per creare oggetti di questo materiale. Si crea fondendo minerali nella fornace. - - - Consente di trasformare lingotti, gemme o tinture in blocchi collocabili. Si può usare come blocco da costruzione costoso o come magazzino compatto per minerali. - - - Quando un giocatore, un animale o un mostro ci passa sopra, prende la scossa. La piastra a pressione di legno si attiva anche facendoci cadere sopra qualcosa. - - - Si usa per le scale compatte. - - - Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. - - - Usato per fare scale lunghe. Due lastre piazzate una sull'altra creano un normale blocco a doppia lastra. - - - La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. - - - Si usano come materiali da costruzione e per creare diversi oggetti. Si possono creare da qualsiasi forma di legno. - - - Si usa come materiale da costruzione. Non subisce la gravità come la sabbia normale. - - - Si usa come materiale da costruzione. - - - Si usa per creare torce, frecce, cartelli, scale a pioli, recinzioni e come maniglia per attrezzi e armi. - - - Si usa per far avanzare il tempo dalla notte al mattino, se tutti i giocatori nel mondo sono a letto. Cambia il punto di generazione del giocatore. -I colori sono sempre gli stessi, qualunque sia la lana usata. - - - Consente di creare una selezione di oggetti più vasta rispetto alla normale schermata crafting. - - - Consente di fondere minerali, creare antracite e vetro e cuocere pesce e costolette di maiale. - - - Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. - - - Si usa come barriera impenetrabile. Vale come 1,5 blocchi di altezza per giocatori, animali e mostri, ma come 1 solo blocco di altezza per gli altri blocchi. - - - Si usa per salire in verticale. - - - Si attiva usandola, colpendola o con una pietra rossa. Funziona come una porta normale, ma è un blocco di 1x1 appiattito sul terreno. - - - Mostra il testo scritto da te o da altri giocatori. - - - Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. - - - Si usa per provocare esplosioni. Una volta collocato, si attiva accendendolo con un oggetto acciarino e pietra focaia, o con una scarica elettrica. - - - Serve per conservare la zuppa di funghi. Una volta mangiata, la ciotola rimane. - - - Si usa per contenere e trasportare acqua, lava e latte. - - - Si usa per contenere e trasportare acqua. - - - Si usa per contenere e trasportare lava. - - - Si usa per contenere e trasportare latte. - - - Si usa per creare il fuoco, accendere TNT e aprire un portale dopo averlo costruito. - - - Si usa per pescare. - - - Mostra la posizione del sole e della luna. - - - Indica il punto iniziale. - - - Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. - - - Consente attacchi a distanza con le frecce. - - - Si usa come munizione per l'arco. - - - Reintegra 2.5{*ICON_SHANK_01*}. - - - Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. - - - Reintegra 1{*ICON_SHANK_01*}. - - - Reintegra 1{*ICON_SHANK_01*}. - - - Reintegra 3{*ICON_SHANK_01*}. - - - Reintegra 1{*ICON_SHANK_01*}, ma può farti star male. Cucinare in una fornace. - - - Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando pollo crudo in una fornace. - - - Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. - - - Reintegra 4{*ICON_SHANK_01*}. Si ottiene cucinando carne cruda in una fornace. - - - Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. - - - Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. - - - Reintegra 1{*ICON_SHANK_01*} o cuocere in una fornace. Può essere dato a un ocelot per ammansirlo. - - - Reintegra 2.5{*ICON_SHANK_01*}. Si crea cucinando pesce crudo in una fornace. - - - Reintegra 2{*ICON_SHANK_01*} e si può usare per creare una mela d'oro. - - - Reintegra 2{*ICON_SHANK_01*} e rigenera la salute per 4 secondi. Si crea con una mela e pepite d'oro. - - - Reintegra 2{*ICON_SHANK_01*}, ma può farti star male. - Si usa nel ricettario di torte, come ingrediente per fare pozioni. @@ -795,18 +4180,18 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. 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. + + Reintegra 2{*ICON_SHANK_01*} e si può usare per creare una mela d'oro. + + + Reintegra 2{*ICON_SHANK_01*} e rigenera la salute per 4 secondi. Si crea con una mela e pepite d'oro. + + + Reintegra 2{*ICON_SHANK_01*}, ma può farti star male. + Si usa nei circuiti a pietre rosse come ripetitore, ritardante e/o diodo. - - Premilo per generare una scarica elettrica. Rimane attivo per circa un secondo prima di spegnersi di nuovo. - - - Si usa per conservare e distribuire oggetti in ordine casuale quando riceve una carica di pietra rossa. - - - Quando si attiva, suona una nota. Colpiscilo per cambiare tonalità. Mettilo sopra blocchi diversi per cambiare il tipo di strumento. - Si usano per guidare i carrelli da miniera. @@ -816,50 +4201,68 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Funzionano come la piastra a pressione (inviano un segnale pietra rossa mentre sono in funzione) ma sono attivabili solo dal carrello da miniera. + + Premilo per generare una scarica elettrica. Rimane attivo per circa un secondo prima di spegnersi di nuovo. + + + Si usa per conservare e distribuire oggetti in ordine casuale quando riceve una carica di pietra rossa. + + + Quando si attiva, suona una nota. Colpiscilo per cambiare tonalità. Mettilo sopra blocchi diversi per cambiare il tipo di strumento. + + + Reintegra 2.5{*ICON_SHANK_01*}. Si crea cucinando pesce crudo in una fornace. + + + Reintegra 1{*ICON_SHANK_01*}. + + + Reintegra 1{*ICON_SHANK_01*}. + + + Reintegra 3{*ICON_SHANK_01*}. + + + Si usa come munizione per l'arco. + + + Reintegra 2.5{*ICON_SHANK_01*}. + + + Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. + + + Reintegra 1{*ICON_SHANK_01*}, ma può farti star male. Cucinare in una fornace. + + + Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. + + + Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. + + + Reintegra 1{*ICON_SHANK_01*} o cuocere in una fornace. Può essere dato a un ocelot per ammansirlo. + + + Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando pollo crudo in una fornace. + + + Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. + + + Reintegra 4{*ICON_SHANK_01*}. Si ottiene cucinando carne cruda in una fornace. + Trasporta te, un animale o un mostro sui binari. - - Si usa per trasportare merci sui binari. + + Si usa come tintura per creare lana azzurra. - - Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. + + Si usa come tintura per creare lana turchese. - - Si usa per spostarsi sull'acqua più velocemente che a nuoto. - - - Si ottiene dalle pecore e si può colorare con le tinture. - - - Si usa come materiale da costruzione e si può colorare con le tinture. Ricetta sconsigliata, in quanto la lana è facilmente ottenibile dalle pecore. - - - Si usa come tintura per creare lana nera. - - - Si usa come tintura per creare lana verde. - - - Si usano come tintura per creare lana marrone, come ingrediente nei biscotti, o per coltivare cacao. - - - Si usa come tintura per creare lana argento. - - - Si usa come tintura per creare lana gialla. - - - Si usa come tintura per creare lana rossa. - - - Si usa per far crescere immediatamente colture, alberi, erba alta, funghi giganti e fiori e si impiega nelle ricette delle tinture. - - - Si usa come tintura per creare lana rosa. - - - Si usa come tintura per creare lana arancione. + + Si usa come tintura per creare lana viola. Si usa come tintura per creare lana verde lime. @@ -871,27 +4274,9 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Usata come tintura per la lana grigio chiaro. (Nota: si può anche preparare con tintura grigia e farina d'ossa, avendone quattro per sacca di inchiostro, invece di tre.) - - Si usa come tintura per creare lana azzurra. - - - Si usa come tintura per creare lana turchese. - - - Si usa come tintura per creare lana viola. - Si usa come tintura per creare lana magenta. - - Si usa come tintura per creare lana blu. - - - Suona dischi. - - - Utilizzabile per creare attrezzi, armi o armature molto robusti. - Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. @@ -901,1220 +4286,672 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Si usa per creare una libreria o viene incantato per fare Libri incantati. - - Permette la creazione di incantesimi più potenti quando viene piazzato intorno al Tavolo per incantesimi. + + Si usa come tintura per creare lana blu. - - Si usa come decorazione. + + Suona dischi. - - Si scava con una piccozza di ferro o migliore, poi si fonde nella fornace per produrre lingotti d'oro. + + Utilizzabile per creare attrezzi, armi o armature molto robusti. - - Si scava con una piccozza di pietra o migliore, poi si fonde nella fornace per produrre lingotti di ferro. + + Si usa come tintura per creare lana arancione. - - Si scava con una piccozza per ottenere carbone. + + Si ottiene dalle pecore e si può colorare con le tinture. - - Si scava con una piccozza di pietra o migliore per ottenere lapislazzuli. + + Si usa come materiale da costruzione e si può colorare con le tinture. Ricetta sconsigliata, in quanto la lana è facilmente ottenibile dalle pecore. - - Si scava con una piccozza di ferro o migliore per ottenere diamanti. + + Si usa come tintura per creare lana nera. - - Si scava con una piccozza di ferro o migliore per ottenere polvere di pietra rossa. + + Si usa per trasportare merci sui binari. - - Si scava con una piccozza per ottenere ciottoli. + + Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. - - Si ottiene con la pala. Si può usare per la costruzione. + + Si usa per spostarsi sull'acqua più velocemente che a nuoto. - - Si può piantare per far crescere un albero. + + Si usa come tintura per creare lana verde. - - Non si rompe. + + Si usa come tintura per creare lana rossa. - - Dà fuoco a qualsiasi cosa tocca. Si può raccogliere in un secchio. + + Si usa per far crescere immediatamente colture, alberi, erba alta, funghi giganti e fiori e si impiega nelle ricette delle tinture. - - Si ottiene con la pala. Si fonde in vetro usando la fornace. Subisce la gravità se sotto non ci sono altri blocchi. + + Si usa come tintura per creare lana rosa. - - Si ottiene con la pala. A volte produce la selce. Subisce la gravità se sotto non ci sono altri blocchi. + + Si usano come tintura per creare lana marrone, come ingrediente nei biscotti, o per coltivare cacao. - - Si abbatte con l'ascia e si può tagliare in assi o usare come combustibile. + + Si usa come tintura per creare lana argento. - - Si crea nella fornace fondendo la sabbia. Si può usare per la costruzione, ma si rompe se cerchi di prenderlo. + + Si usa come tintura per creare lana gialla. - - Si estrae dalla pietra usando la piccozza. Si può usare per costruire una fornace o attrezzi di pietra. + + Consente attacchi a distanza con le frecce. - - Risultato della cottura dell'argilla in una fornace. + + Dà all'utilizzatore Armatura 5 se indossato. - - Si inserisce nella fornace per creare mattoni. + + Dà all'utilizzatore Armatura 3 se indossato. - - Quando viene rotta, rilascia delle sfere di argilla che possono essere cotte in una fornace per creare dei mattoni. + + Dà all'utilizzatore Armatura 1 se indossato. - - Per conservare le palle di neve in poco spazio. + + Dà all'utilizzatore Armatura 5 se indossato. - - Si può scavare con una pala per creare palle di neve. + + Dà all'utilizzatore Armatura 2 se indossato. - - Può produrre semi di grano quando viene tagliato/a. + + Dà all'utilizzatore Armatura 2 se indossato. - - Si usa per creare tinture. + + Dà all'utilizzatore Armatura 3 se indossato. - - Si usa con la ciotola per fare la zuppa. + + Lingotto lucente utilizzabile per creare oggetti di questo materiale. Si crea fondendo minerali nella fornace. - - Si scava solo con una piccozza di diamante. Nasce dall'incontro tra acqua e lava e si usa per creare portali. + + Consente di trasformare lingotti, gemme o tinture in blocchi collocabili. Si può usare come blocco da costruzione costoso o come magazzino compatto per minerali. - - Genera mostri nel mondo. + + Quando un giocatore, un animale o un mostro ci passa sopra, prende la scossa. La piastra a pressione di legno si attiva anche facendoci cadere sopra qualcosa. - - Si posa a terra per condurre elettricità. Quando viene incluso in una pozione aumenta la durata dell'effetto. + + Dà all'utilizzatore Armatura 8 se indossato. - - Le colture si possono mietere per ottenere grano. + + Dà all'utilizzatore Armatura 6 se indossato. - - Terreno pronto per piantare semi. + + Dà all'utilizzatore Armatura 3 se indossato. - - Si può cuocere in fornace per produrre tintura verde. + + Dà all'utilizzatore Armatura 6 se indossato. - - Si può usare per produrre zucchero. + + Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. - - Si può indossare come elmo o unire a una torcia per creare una zucca di Halloween. Inoltre è l'ingrediente principale della torta di zucca. + + Dà all'utilizzatore Armatura 1 se indossato. - - Una volta accesa, brucia per sempre. + + Dà all'utilizzatore Armatura 3 se indossato. - - Rallenta il movimento di qualsiasi cosa ci passi sopra. + + Si usa per abbattere blocchi di legno più in fretta che a mano. - - Entra nel portale per spostarti tra il Sopramondo e il Sottomondo. + + Si usa per arare blocchi di terra ed erba e prepararli per il raccolto. - - Si usa come combustibile per la fornace o per creare una torcia. + + Le porte di legno si attivano usandole, colpendole o con una pietra rossa. - - 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. + + Dà all'utilizzatore Armatura 2 se indossato. - - Si ottiene uccidendo una gallina e si usa per creare una freccia. + + Dà all'utilizzatore Armatura 4 se indossato. - - Si ottiene uccidendo un creeper e si usa per creare del TNT o come ingrediente per le pozioni. + + Dà all'utilizzatore Armatura 1 se indossato. - - Si possono piantare e coltivare su una zolla. Assicurati che vi sia luce a sufficienza per far crescere i semi! + + Dà all'utilizzatore Armatura 2 se indossato. - - Si ottiene dalle colture e si può usare per creare cibo. + + Dà all'utilizzatore Armatura 1 se indossato. - - Si ottiene scavando nella ghiaia e si può usare per creare acciarino e pietra focaia. + + Dà all'utilizzatore Armatura 2 se indossato. - - Si usa su un maiale per poterlo cavalcare. Il maiale può poi essere controllato usando una carota su un bastone. + + Dà all'utilizzatore Armatura 5 se indossato. - - Si ottiene scavando nella neve e si può lanciare. + + Si usa per le scale compatte. - - Si ottiene uccidendo una mucca e si usa per creare un'armatura o per fare libri. + + Serve per conservare la zuppa di funghi. Una volta mangiata, la ciotola rimane. - - Si ottiene uccidendo uno slime e si usa come ingrediente per pozioni o per fare pistoni appiccicosi. + + Si usa per contenere e trasportare acqua, lava e latte. - - Viene deposto casualmente dalle galline e si può usare per creare cibi. + + Si usa per contenere e trasportare acqua. - - 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. + + Mostra il testo scritto da te o da altri giocatori. - - Si ottiene uccidendo uno scheletro. Si usa per produrre farina d'ossa. Può essere dato in pasto a un lupo per ammansirlo. + + Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. - - Si ottiene facendo uccidere un creeper da uno scheletro. Si può suonare in un jukebox. + + Si usa per provocare esplosioni. Una volta collocato, si attiva accendendolo con un oggetto acciarino e pietra focaia, o con una scarica elettrica. - - Spegne il fuoco e favorisce la crescita delle colture. Si può raccogliere in un secchio. + + Si usa per contenere e trasportare lava. - - Quando si rompono, a volte fanno cadere un arbusto che può essere trapiantato per far crescere un albero. + + Mostra la posizione del sole e della luna. - - Si trova nei sotterranei. Si può usare per costruire e decorare. + + Indica il punto iniziale. - - Si usa per ottenere lana dalle pecore e ottenere blocchi foglia. + + Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. - - 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. + + Si usa per contenere e trasportare latte. - - 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. + + Si usa per creare il fuoco, accendere TNT e aprire un portale dopo averlo costruito. - - Creato utilizzando blocchi di pietra. Si trova comunemente nelle fortezze. + + Si usa per pescare. - - Si usa come barriera, analogamente alle recinzioni. + + Si attiva usandola, colpendola o con una pietra rossa. Funziona come una porta normale, ma è un blocco di 1x1 appiattito sul terreno. - - Simile a una porta, ma usato principalmente nelle recinzioni. + + Si usano come materiali da costruzione e per creare diversi oggetti. Si possono creare da qualsiasi forma di legno. - - Può essere creata usando Fette di anguria. + + Si usa come materiale da costruzione. Non subisce la gravità come la sabbia normale. - - Blocchi trasparenti che possono essere usati come alternativa ai blocchi di vetro. + + Si usa come materiale da costruzione. - - Si possono piantare per far crescere delle zucche. - - - 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. - - - Si può usare per costruire e decorare. - - - Attraversarla rallenta i movimenti. Può essere distrutta con le forbici per raccogliere corda. - - - Genera un Pesciolino d'argento quando viene distrutto. Può anche generare un Pesciolino d'argento se nelle vicinanze c'è un altro Pesciolino d'argento sotto attacco. - - - Una volta posizionato, cresce nel corso del tempo. Si può raccogliere usando le forbici. Ci si può salire come su una scala. - - - Superficie scivolosa. Si trasforma in acqua se si trova sopra un altro blocco quando questo viene distrutto. Si scioglie se è 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. - - - 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. - - - Può avere effetti diversi a seconda dell'oggetto su cui viene usata. - - - Può essere riempita d'acqua e usata come ingrediente di base per preparare pozioni nel Banco di distillazione. - - - Cibo velenoso e ingrediente per pozioni tossiche. Viene deposto dai Ragni o Ragni delle grotte uccisi dal giocatore. - - - Si usa come ingrediente di pozioni, soprattutto nelle pozioni con effetti negativi. - - - Si usa come ingrediente di pozioni o insieme ad altri oggetti per creare l'Occhio di Ender o la Crema di magma. - - - Si usa come ingrediente di pozioni. - - - Si usa per produrre pozioni e pozioni bomba. - - - Può essere riempito d'acqua con la pioggia o usando un secchio e quindi utilizzato per riempire Bottiglie di vetro. - - - Quando viene lanciato, l'Occhio di Ender mostra la posizione di un Portale del Limite. Dodici Occhi inseriti nel Telaio di un portale del Limite attivano il Portale stesso. - - - Si usa come ingrediente di pozioni. - - - Simili ai blocchi Erba, questi blocchi sono ideali come terreno di coltura per i funghi. - - - Galleggia e può essere usata per guadare un corso d'acqua. - - - Si usa per costruire Fortezze del Sottomondo. È immune alle palle di fuoco lanciate dai Ghast. - - - Si usa nelle Fortezze del Sottomondo. - - - Si trova nelle Fortezze del Sottomondo. Quando viene distrutto, rilascia una Verruca del Sottomondo. - - - Permette al giocatore di incantare spade, piccozze, asce, pale, archi e armature usando i punti Esperienza guadagnati. - - - Si attiva usando dodici Occhi di Ender e permette di raggiungere la dimensione Limite. - - - Si usa per costruire un Portale del Limite. - - - Un tipo di blocco che si trova nel Limite. Estremamente resistente alle esplosioni, è molto utile per costruire. - - - Questo blocco si crea dopo aver sconfitto il Drago nel Limite. - - - Quando viene lanciata, lascia cadere delle sfere Esperienza; raccogliendole, il giocatore può aumentare i propri punti Esperienza. - - - Utile per appiccare il fuoco alle cose, o per scatenare incendi quando viene lanciata da un dispenser. - - - Simile a un espositore, mostra l'oggetto o il blocco messo al suo interno. - - - Quando è lanciato può generare una creatura del tipo indicato. - - + Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. - - Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + + Usato per fare scale lunghe. Due lastre piazzate una sull'altra creano un normale blocco a doppia lastra. - - Creato dalla fusione della Sottogriglia nella fornace. Può generare blocchi di mattoni del Sottomondo. + + La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. - - Se alimentate, emettono una luce. + + Si usa per creare torce, frecce, cartelli, scale a pioli, recinzioni e come maniglia per attrezzi e armi. - - Può essere coltivato per raccogliere Semi di cacao. + + Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. - - Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. + + 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. - - Calamaro + + Si usa per salire in verticale. - - Rilascia sacche di inchiostro quando viene ucciso. + + 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. - - Mucca + + Consente di creare una selezione di oggetti più vasta rispetto alla normale schermata crafting. - - 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 scocca contro delle frecce. Rilascia delle frecce quando viene ucciso. - - - Ragno - - - Ti attacca quando ti avvicini. Può arrampicarsi sui muri. Rilascia un pungiglione quando viene ucciso. - - - Zombie - - - Ti attacca quando ti avvicini. - - - Uomo-maiale zombie - - - Inizialmente docile, ma se ne colpisci uno verrai attaccato da un gruppo. - - - Ghast - - - Ti lancia sfere di fuoco che esplodono al contatto. - - - Slime - - - Se danneggiato, si divide in slime più piccoli. - - - Enderman - - - Ti attacca se lo guardi. Può anche spostare blocchi. - - - Pesciolino d'argento - - - Quando viene attaccato, attira tutti i Pesciolini d'argento nascosti nei dintorni. Si nasconde nei blocchi di pietra. - - - Ragno delle grotte - - - Il suo morso è velenoso. - - - Muccafungo - - - Si usa con una Ciotola per preparare la Zuppa di funghi. Deposita funghi e diventa una mucca normale quando viene tosata. - - - Golem di neve - - - Il Golem di neve può essere creato assemblando blocchi di neve e una zucca. Lancia palle di neve contro i nemici del suo creatore. - - - Drago di Ender - - - Grosso drago nero che si trova nel Limite. - - - Vampe - - - Nemici che si trovano nel Sottomondo, soprattutto all'interno delle Fortezze. Quando vengono uccisi, depositano Bacchette di Vampe. - - - Cubo di magma - - - Si trovano nel Sottomondo. Simili a Slime, si dividono in esemplari più piccoli quando vengono uccisi. - - - Abitante del villaggio - - - Ocelot - - - Possono essere trovati nelle giungle. Sono addomesticabili se sfamati con pesce crudo, ma aspetta che sia lui ad avvicinarsi a te, perché un movimento brusco lo metterebbe in fuga. - - - Golem di ferro - - - Appare nei villaggi per proteggerli, può essere creato usando blocchi di ferro e zucche. - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - Capo programmatore Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Spada di legno - - - Spada di pietra - - - Spada di ferro - - - Spada di diamante - - - Spada d'oro - - - Pala di legno - - - Pala di pietra - - - Pala di ferro - - - Pala di diamante - - - Pala d'oro - - - Piccozza di legno - - - Piccozza di pietra - - - Piccozza di ferro - - - Piccozza di diamante - - - Piccozza d'oro - - - Ascia di legno - - - Ascia di pietra + + Consente di fondere minerali, creare antracite e vetro e cuocere pesce e costolette di maiale. Ascia di ferro - - Ascia di diamante + + Lampada di pietra rossa - - Ascia d'oro + + Scala di legno (giungla) - - Zappa di legno + + Scale di legno di betulla - - Zappa di pietra + + Comandi attuali - - Zappa di ferro - - - Zappa di diamante - - - Zappa d'oro - - - Porta di legno - - - Porta di ferro - - - Elmo di maglia metallica - - - Corazza di maglia - - - Gambali di maglia metallica - - - Stivali di maglia metallica - - - Cappello di pelle - - - Elmo di ferro - - - Elmo di diamante - - - Elmo d'oro - - - Tunica di pelle - - - Corsaletto di ferro - - - Corsal. di diamante - - - Corsaletto d'oro - - - Pantaloni di pelle - - - Gambali di ferro - - - Gambali di diamante - - - Gambali d'oro - - - Stivali di cuoio - - - Stivali di ferro - - - Stivali di diamante - - - Stivali d'oro - - - Lingotto di ferro - - - Lingotto d'oro - - - Secchio - - - Secchio d'acqua - - - Secchio di lava - - - Pietra foc. e acciarino - - - Mela - - - Arco - - - Freccia - - - Carbone - - - Antracite - - - Diamante - - - Bastone - - - Ciotola - - - Zuppa di funghi - - - Corda - - - Piuma - - - Polvere da sparo - - - Semi di grano - - - Grano - - - Pane - - - Pietra focaia - - - Costoletta di maiale cruda - - - Costoletta di maiale cotta - - - Dipinto - - - Mela d'oro - - - Cartello - - - Carrello da miniera - - - Sella - - - Pietra rossa - - - Palla di neve - - - Barca - - - Pelle - - - Secchio di latte - - - Mattone - - - Argilla - - - Canna da zucchero - - - Carta - - - Libro - - - Palla di slime - - - Carrello con cassa - - - Carrello con fornace - - - Uovo - - - Bussola - - - Canna da pesca - - - Orologio - - - Polvere di pietra brillante - - - Pesce crudo - - - Pesce cotto - - - Tintura in polvere - - - Sacca d'inchiostro - - - Rosso rosa - - - Verde cactus - - - Semi di cacao - - - Lapislazzulo - - - Tintura viola - - - Tintura turchese - - - Tintura grigiastra - - - Tintura grigia - - - Tintura rosa - - - Tintura verde lime - - - Giallo mimosa - - - Tintura azzurra - - - Tintura magenta - - - Tintura arancione - - - Farina d'ossa - - - Osso - - - Zucchero - - - Torta - - - Letto - - - Ripetitore pietra rossa - - - Biscotto - - - Mappa - - - Disco - "13" - - - Disco - "gatto" - - - Disco - "blocchi" - - - Disco - "cip" - - - Disco - "lontano" - - - Disco - "centro commerciale" - - - Disco - "mellohi" - - - Disco - "stal" - - - Disco - "strad" - - - Disco - "reparto" - - - Disco - "11" - - - Disco - "dove siamo adesso" - - - Tosatrice - - - Semi di zucca - - - Semi di anguria - - - Pollo crudo - - - Pollo cotto - - - Manzo crudo - - - Bistecca - - - Carne guasta - - - Perla di Ender - - - Fetta di anguria - - - Bacchetta di Vampe - - - Lacrima di Ghast - - - Pepita d'oro - - - Verruca del Sottomondo - - - Pozione{*splash*}{*prefix*}{*postfix*} - - - Bottiglia di vetro - - - Bottiglia d'acqua - - - Occhio di ragno - - - Occhio ragno fermen. - - - Polvere di Vampe - - - Crema di magma - - - Banco di distillazione - - - Calderone - - - Occhio di Ender - - - Anguria scintillante - - - Bottiglia magica - - - Scarica di fuoco - - - Scaric. fuoco brace - - - Scaric. fuoco carbone - - - Cornice oggetto - - - Genera {*CREATURE*} - - - Mattone del Sottomondo - - + Teschio - - Teschio di scheletro + + Cacao - - Teschio di scheletro avvizzito + + Scale di legno di abete - - Testa di zombie + + Uovo di drago - - Testa + + Pietra del Limite - - Testa di %s + + Telaio per Portale del Limite - - Testa di Creeper + + Scala di arenaria - - Pietra + + Felce - - Blocco d'erba - - - Terra - - - Ciottolo - - - Assi di legno di quercia - - - Assi di legno di abete - - - Assi di legno di betulla - - - Assi di legno (giungla) - - + Arbusto - - Arbusto di quercia + + Layout - - Arbusto di abete + + Crafting - - Arbusto di betulla + + Usa - - Arbusto della giungla + + Azione - - Substrato roccioso + + Muoviti furtivamente/Vola giù - - Acqua + + Furtività - - Lava + + Posa - - Sabbia + + Scorri oggetti in mano - - Arenaria + + Pausa - - Ghiaia + + Guarda - - Minerale d'oro + + Muoviti/Scatta - - Minerale di ferro + + Inventario - - Minerale di carbone + + Salta/Vola su - - Legno + + Salta - - Legno di quercia + + Portale del Limite - - Legno di abete + + Picciolo di zucca - - Legno di betulla + + Anguria - - Legno della giungla + + Lastra di vetro + + + Cancello per recinzioni + + + Rampicanti + + + Picciolo di melone + + + Barre di ferro + + + Mattoni di pietra lesionati + + + Mattoni di pietra muschiosi + + + Mattoni di pietra + + + Fungo + + + Fungo + + + Mattoni di pietra cesellati + + + Scale di mattoni + + + Verruca del Sottomondo + + + Scale di mattoni Sottomondo + + + Recinz. mattoni Sottomondo + + + Calderone + + + Banco di distillazione + + + Tavolo per incantesimi + + + Mattone del Sottomondo + + + Ciottolo Pesciolino d'argento + + + Pietra Pesciolino d'argento + + + Scale di mattoni di pietra + + + Ninfea + + + Micelio + + + Mattone di pietra Pesciolino d'argento + + + Cambia modalità telecamera + + + 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. + + + 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. + + + Man mano che raccogli e crei oggetti, l'inventario si riempie.{*B*} + Premi{*CONTROLLER_ACTION_INVENTORY*} per aprire l'inventario. + + + Il legno ottenuto si può tagliare in assi. Apri l'interfaccia Crafting per crearle.{*PlanksIcon*} + + + 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*} + + + 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. + + + Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting. + + + 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. + + + Usa{*CONTROLLER_ACTION_MOVE*} per muoverti. + + + Usa{*CONTROLLER_ACTION_LOOK*} per guardare su, giù e intorno. + + + 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. + + + 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... + + + Premi{*CONTROLLER_ACTION_JUMP*} per saltare. + + + Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Crea un tavolo da lavoro.{*CraftingTableIcon*} + + + La notte arriva in fretta ed è pericoloso restare all'aperto impreparati. Puoi creare armi e armature, ma conviene avere un riparo sicuro. + + + Apri il contenitore + + + 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*} + + + 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*} + + + 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. + + + Nelle vicinanze c'è un rifugio di minatori abbandonato che puoi completare entro sera. + + + 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*} + + + Usa{*CONTROLLER_ACTION_USE*} per utilizzare gli oggetti, interagire e collocarli. Gli oggetti collocati possono essere raccolti scavando con l'attrezzo appropriato. + + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. + + + Per velocizzare la raccolta di blocchi, puoi costruire attrezzi appositi. Alcuni attrezzi hanno un manico creato con dei bastoni. Crea dei bastoni.{*SticksIcon*} + + + 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*} + + + Sposta il puntatore sul tavolo da lavoro e premi{*CONTROLLER_ACTION_USE*} per aprirlo. + + + Una volta selezionato il tavolo da lavoro, sposta il puntatore nel punto desiderato e usa{*CONTROLLER_ACTION_USE*} per collocarlo. + + + In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. +Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. + + + + + + + + + + + + + + + + + + + + + + + + Layout 1 + + + Movimento (durante il volo) + + + Giocatori/Invito + + + + + + Layout 3 + + + Layout 2 + + + + + + + + + + + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per avviare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + + + + + + + + + + + + + + + + + + + + + + + + + + + Blocco Pesciolino d'argento + + + Lastra di pietra + + + Un modo per immagazzinare ferro in modo compatto. + + + Blocco di ferro + + + Lastra di legno + + + Lastra di arenaria + + + Lastra di pietra + + + Un modo per immagazzinare oro in modo compatto. + + + Fiore + + + Lana bianca + + + Lana arancione + + + Blocco d'oro + + + Fungo + + + Rosa + + + Lastra acciottolata + + + Libreria + + + TNT + + + Mattoni + + + Torcia + + + Ossidiana + + + Pietra muschiosa + + + Lastra mattoni Sottomondo + + + Lastra di legno di quercia + + + Lastra di mattoni di pietra + + + Lastra di mattoni + + + Lastra di legno (giungla) + + + Lastra di legno di betulla + + + Lastra di legno di abete + + + Lana magenta + + + Foglie di betulla + + + Foglie d'abete + + + Foglie di quercia + + + Vetro + + + Spugna + + + Foglie della giungla + + + Foglie Quercia @@ -2125,721 +4962,745 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Betulla - - Foglie + + Legno di abete - - Foglie di quercia + + Legno di betulla - - Foglie d'abete - - - Foglie di betulla - - - Foglie della giungla - - - Spugna - - - Vetro + + Legno della giungla Lana - - Lana nera - - - Lana rossa - - - Lana verde - - - Lana marrone - - - Lana blu - - - Lana viola - - - Lana turchese - - - Lana grigio chiaro + + Lana rosa Lana grigia - - Lana rosa - - - Lana verde lime - - - Lana gialla + + Lana grigio chiaro Lana azzurra - - Lana magenta + + Lana gialla - - Lana arancione + + Lana verde lime - - Lana bianca + + Lana turchese - - Fiore + + Lana verde - - Rosa + + Lana rossa - - Fungo + + Lana nera - - Blocco d'oro + + Lana viola - - Un modo per immagazzinare oro in modo compatto. + + Lana blu - - Blocco di ferro - - - Un modo per immagazzinare ferro in modo compatto. - - - Lastra di pietra - - - Lastra di pietra - - - Lastra di arenaria - - - Lastra di legno - - - Lastra acciottolata - - - Lastra di mattoni - - - Lastra di mattoni di pietra - - - Lastra di legno di quercia - - - Lastra di legno di abete - - - Lastra di legno di betulla - - - Lastra di legno (giungla) - - - Lastra mattoni Sottomondo - - - Mattoni - - - TNT - - - Libreria - - - Pietra muschiosa - - - Ossidiana - - - Torcia + + Lana marrone Torcia (carbone) - - Torcia (antracite) - - - Fuoco - - - Generatore di mostri - - - Scala di legno di quercia - - - Cassa - - - Polvere di pietra rossa - - - Minerale di diamante - - - Blocco di diamante - - - Un modo per immagazzinare diamanti in modo compatto. - - - Tavolo da lavoro - - - Coltura - - - Zolla - - - Fornace - - - Cartello - - - Porta di legno - - - Scala a pioli - - - Binari - - - Binari potenziati - - - Binari rilevatori - - - Scala di pietra - - - Leva - - - Piastra a pressione - - - Porta di ferro - - - Minerale pietra rossa - - - Torcia pietra rossa - - - Tasti - - - Neve - - - Ghiaccio - - - Cactus - - - Argilla - - - Canna da zucchero - - - Jukebox - - - Recinzione - - - Zucca - - - Zucca di Halloween - - - Sottogriglia + + Pietra brillante Sabbie mobili - - Pietra brillante - - - Portale - - - Minerale di lapislazzulo + + Sottogriglia Blocco lapislazzulo + + Minerale di lapislazzulo + + + Portale + + + Zucca di Halloween + + + Canna da zucchero + + + Argilla + + + Cactus + + + Zucca + + + Recinzione + + + Jukebox + Un modo per immagazzinare lapislazzuli in modo compatto. - - Dispenser - - - Blocco nota - - - Torta - - - Letto - - - Ragnatela - - - Erba alta - - - Cespuglio secco - - - Diodo - - - Cassa chiusa - Botola - - Lana (qualsiasi colore) + + Cassa chiusa - - Pistone + + Diodo Pistone appiccicoso - - Blocco Pesciolino d'argento + + Pistone - - Mattoni di pietra + + Lana (qualsiasi colore) - - Mattoni di pietra muschiosi + + Cespuglio secco - - Mattoni di pietra lesionati + + Torta - - Mattoni di pietra cesellati + + Blocco nota - - Fungo + + Dispenser - - Fungo + + Erba alta - - Barre di ferro + + Ragnatela - - Lastra di vetro + + Letto - - Anguria + + Ghiaccio - - Picciolo di zucca + + Tavolo da lavoro - - Picciolo di melone + + Un modo per immagazzinare diamanti in modo compatto. - - Rampicanti + + Blocco di diamante - - Cancello per recinzioni + + Fornace - - Scale di mattoni + + Zolla - - Scale di mattoni di pietra + + Coltura - - Pietra Pesciolino d'argento + + Minerale di diamante - - Ciottolo Pesciolino d'argento + + Generatore di mostri - - Mattone di pietra Pesciolino d'argento + + Fuoco - - Micelio + + Torcia (antracite) - - Ninfea + + Polvere di pietra rossa - - Mattone del Sottomondo + + Cassa - - Recinz. mattoni Sottomondo + + Scala di legno di quercia - - Scale di mattoni Sottomondo + + Cartello - - Verruca del Sottomondo + + Minerale pietra rossa - - Tavolo per incantesimi + + Porta di ferro - - Banco di distillazione + + Piastra a pressione - - Calderone + + Neve - - Portale del Limite + + Tasti - - Telaio per Portale del Limite + + Torcia pietra rossa - - Pietra del Limite + + Leva - - Uovo di drago + + Binari - - Arbusto + + Scala a pioli - - Felce + + Porta di legno - - Scala di arenaria + + Scala di pietra - - Scale di legno di abete + + Binari rilevatori - - Scale di legno di betulla - - - Scala di legno (giungla) - - - Lampada di pietra rossa - - - Cacao - - - Teschio - - - Comandi attuali - - - Layout - - - Muoviti/Scatta - - - Guarda - - - Pausa - - - Salta - - - Salta/Vola su - - - Inventario - - - Scorri oggetti in mano - - - Azione - - - Usa - - - Crafting - - - Posa - - - Furtività - - - Muoviti furtivamente/Vola giù - - - Cambia modalità telecamera - - - Giocatori/Invito - - - Movimento (durante il volo) - - - Layout 1 - - - Layout 2 - - - Layout 3 - - - <![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;]]> - - - <![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*}Premi{*CONTROLLER_VK_A*} per continuare. - - - {*B*}Premi{*CONTROLLER_VK_A*} per avviare il tutorial.{*B*} - Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. - - - In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. -Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - - - Usa{*CONTROLLER_ACTION_LOOK*} per guardare su, giù e intorno. - - - Usa{*CONTROLLER_ACTION_MOVE*} per muoverti. - - - Per scattare, sposta in avanti {*CONTROLLER_ACTION_MOVE*} due volte rapidamente. Finché tieni premuto {*CONTROLLER_ACTION_MOVE*}, il personaggio continuerà a scattare, a meno che non esaurisca il tempo per lo scatto o il cibo. - - - Premi{*CONTROLLER_ACTION_JUMP*} per saltare. - - - Tieni premuto{*CONTROLLER_ACTION_ACTION*} per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... - - - Tieni premuto{*CONTROLLER_ACTION_ACTION*} per abbattere 4 blocchi di legno (tronchi).{*B*}Quando un blocco si rompe, puoi raccoglierlo avvicinandoti all'oggetto fluttuante che appare, inserendolo così nel tuo inventario. - - - Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting. - - - Man mano che raccogli e crei oggetti, l'inventario si riempie.{*B*} - Premi{*CONTROLLER_ACTION_INVENTORY*} per aprire l'inventario. - - - Via via che ti sposti, scavi e attacchi i nemici, il livello della barra del cibo diminuisce {*ICON_SHANK_01*}. Scattando e saltando durante uno scatto si consuma molto più cibo che non camminando e saltando normalmente. - - - Se subisci dei danni, ma nella tua barra del cibo ci sono 9 o più{*ICON_SHANK_01*}, la tua salute si ripristinerà automaticamente. Mangiare farà risalire la tua barra del cibo. - - - Tenendo in mano un cibo, tieni premuto{*CONTROLLER_ACTION_USE*} per mangiarlo e reintegrare la tua barra del cibo. Se la barra del cibo è piena, non potrai mangiare. - - - Il livello della tua barra del cibo è sceso e hai perso energia. Mangia la bistecca nel tuo inventario per reintegrare la barra del cibo e riacquistare le forze.{*ICON*}364{*/ICON*} - - - Il legno ottenuto si può tagliare in assi. Apri l'interfaccia Crafting per crearle.{*PlanksIcon*} - - - Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Crea un tavolo da lavoro.{*CraftingTableIcon*} - - - Per velocizzare la raccolta di blocchi, puoi costruire attrezzi appositi. Alcuni attrezzi hanno un manico creato con dei bastoni. Crea dei bastoni.{*SticksIcon*} - - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. - - - Usa{*CONTROLLER_ACTION_USE*} per utilizzare gli oggetti, interagire e collocarli. Gli oggetti collocati possono essere raccolti scavando con l'attrezzo appropriato. - - - Una volta selezionato il tavolo da lavoro, sposta il puntatore nel punto desiderato e usa{*CONTROLLER_ACTION_USE*} per collocarlo. - - - Sposta il puntatore sul tavolo da lavoro e premi{*CONTROLLER_ACTION_USE*} per aprirlo. - - - La pala aiuta a scavare più in fretta i blocchi cedevoli come terra e neve. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea una pala di legno.{*WoodenShovelIcon*} - - - L'ascia ti aiuta a tagliare più in fretta la legna e i blocchi di legno. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea un'ascia di legno.{*WoodenHatchetIcon*} - - - La piccozza aiuta a scavare più in fretta i blocchi duri come pietra e minerale. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli, inoltre potrai scavare anche i materiali più duri. Crea una piccozza di legno.{*WoodenPickaxeIcon*} - - - Apri il contenitore - - - La notte arriva in fretta ed è pericoloso restare all'aperto impreparati. Puoi creare armi e armature, ma conviene avere un riparo sicuro. - - - Nelle vicinanze c'è un rifugio di minatori abbandonato che puoi completare entro sera. - - - Dovrai raccogliere le risorse per completare il rifugio. Per muri e tetto si può usare qualsiasi materiale, ma ti converrà creare una porta, delle finestre e un po' di luce. - - - Usa la piccozza per scavare dei blocchi di pietra. I blocchi di pietra producono ciottoli. Con 8 blocchi di ciottoli puoi costruire una fornace. Potresti dover scavare nella terra per raggiungere la pietra: usa la pala.{*StoneIcon*} + + Binari potenziati Hai abbastanza ciottoli per costruire una fornace. Usa il tavolo da lavoro. - - Usa{*CONTROLLER_ACTION_USE*} per collocare la fornace nel mondo, poi aprila. + + Canna da pesca - - Usa la fornace per creare l'antracite. Mentre aspetti che sia pronta, che ne dici di raccogliere altri materiali per completare il rifugio? + + Orologio - - Usa la fornace per creare del vetro. Mentre aspetti che sia pronto, che ne dici di raccogliere altri materiali per completare il rifugio? + + Polvere di pietra brillante - - 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*} + + Carrello con fornace - - Usa{*CONTROLLER_ACTION_USE*} per collocare la porta. Puoi usare{*CONTROLLER_ACTION_USE*} per aprire e chiudere una porta di legno nel mondo. + + Uovo - - Di notte è buio, quindi serve della luce per poterci vedere nel rifugio. Crea una torcia usando bastoni e antracite dall'interfaccia Crafting.{*TorchIcon*} + + Bussola - - Hai completato la prima parte del tutorial. + + Pesce crudo - + + Rosso rosa + + + Verde cactus + + + Semi di cacao + + + Pesce cotto + + + Tintura in polvere + + + Sacca d'inchiostro + + + Carrello con cassa + + + Palla di neve + + + Barca + + + Pelle + + + Carrello da miniera + + + Sella + + + Pietra rossa + + + Secchio di latte + + + Carta + + + Libro + + + Palla di slime + + + Mattone + + + Argilla + + + Canna da zucchero + + + Lapislazzulo + + + Mappa + + + Disco - "13" + + + Disco - "gatto" + + + Letto + + + Ripetitore pietra rossa + + + Biscotto + + + Disco - "blocchi" + + + Disco - "mellohi" + + + Disco - "stal" + + + Disco - "strad" + + + Disco - "cip" + + + Disco - "lontano" + + + Disco - "centro commerciale" + + + Torta + + + Tintura grigia + + + Tintura rosa + + + Tintura verde lime + + + Tintura viola + + + Tintura turchese + + + Tintura grigiastra + + + Giallo mimosa + + + Farina d'ossa + + + Osso + + + Zucchero + + + Tintura azzurra + + + Tintura magenta + + + Tintura arancione + + + Cartello + + + Tunica di pelle + + + Corsaletto di ferro + + + Corsal. di diamante + + + Elmo di ferro + + + Elmo di diamante + + + Elmo d'oro + + + Corsaletto d'oro + + + Gambali d'oro + + + Stivali di cuoio + + + Stivali di ferro + + + Pantaloni di pelle + + + Gambali di ferro + + + Gambali di diamante + + + Cappello di pelle + + + Zappa di pietra + + + Zappa di ferro + + + Zappa di diamante + + + Ascia di diamante + + + Ascia d'oro + + + Zappa di legno + + + Zappa d'oro + + + Corazza di maglia + + + Gambali di maglia metallica + + + Stivali di maglia metallica + + + Porta di legno + + + Porta di ferro + + + Elmo di maglia metallica + + + Stivali di diamante + + + Piuma + + + Polvere da sparo + + + Semi di grano + + + Ciotola + + + Zuppa di funghi + + + Corda + + + Grano + + + Costoletta di maiale cotta + + + Dipinto + + + Mela d'oro + + + Pane + + + Pietra focaia + + + Costoletta di maiale cruda + + + Bastone + + + Secchio + + + Secchio d'acqua + + + Secchio di lava + + + Stivali d'oro + + + Lingotto di ferro + + + Lingotto d'oro + + + Pietra foc. e acciarino + + + Carbone + + + Antracite + + + Diamante + + + Mela + + + Arco + + + Freccia + + + Disco - "reparto" + + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo strutture.{*StructuresIcon*} + + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo attrezzi.{*ToolsIcon*} + + + 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. + + + 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. + + + 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*} + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Alcuni oggetti esistono in varie versioni, a seconda dei materiali impiegati. Seleziona la pala di legno.{*WoodenShovelIcon*} + + + Il legno ottenuto si può tagliare in assi. Seleziona l'icona delle assi e premi{*CONTROLLER_VK_A*} per crearle.{*PlanksIcon*} + + + 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. + + + L'area crafting mostra gli elementi richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto, poi usa{*CONTROLLER_MENU_NAVIGATE*} per scegliere l'oggetto da creare. + + + Ora è visualizzato l'elenco degli ingredienti necessari per creare l'oggetto selezionato. + + + Ora è visualizzata la descrizione dell'oggetto selezionato, che ti dà un'idea del suo possibile utilizzo. + + + 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. + + + Alcuni oggetti non possono essere creati con il tavolo da lavoro, ma è necessaria una fornace. Ora crea una fornace.{*FurnaceIcon*} + + + Ghiaia + + + Minerale d'oro + + + Minerale di ferro + + + Lava + + + Sabbia + + + Arenaria + + + Minerale di carbone + + {*B*} - Premi{*CONTROLLER_VK_A*} per continuare il tutorial.{*B*} - Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. - - Questo è il tuo inventario. Mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura. + + Questa è l'interfaccia fornace, dove puoi modificare gli oggetti attraverso il fuoco. Per esempio, puoi trasformare il minerale di ferro in lingotti di ferro. + + + Colloca la fornace creata nel mondo. Ti conviene metterla nel tuo rifugio.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + Legno + + + Legno di quercia + + + 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. + + + {*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare di nuovo l'inventario. {*B*} Premi{*CONTROLLER_VK_A*} per continuare.{*B*} Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario. - - Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. Usa{*CONTROLLER_VK_A*} per raccogliere un oggetto sotto il puntatore. - Se c'è più di un oggetto, verranno raccolti tutti, oppure premi{*CONTROLLER_VK_X*} per raccoglierne soltanto la metà. + + 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 il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + + + Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posarlo. Sposta l'oggetto in un'altra casella dell'inventario usando il puntatore e collocalo con{*CONTROLLER_VK_A*}. Se il puntatore seleziona più oggetti, usa{*CONTROLLER_VK_A*} per collocarli tutti o{*CONTROLLER_VK_X*} per collocarne solo uno. - - Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posarlo. + + 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à. + + + Hai completato la prima parte del tutorial. + + + Usa la fornace per creare del vetro. Mentre aspetti che sia pronto, che ne dici di raccogliere altri materiali per completare il rifugio? + + + Usa la fornace per creare l'antracite. Mentre aspetti che sia pronta, che ne dici di raccogliere altri materiali per completare il rifugio? + + + Usa{*CONTROLLER_ACTION_USE*} per collocare la fornace nel mondo, poi aprila. + + + Di notte è buio, quindi serve della luce per poterci vedere nel rifugio. Crea una torcia usando bastoni e antracite dall'interfaccia Crafting.{*TorchIcon*} + + + Usa{*CONTROLLER_ACTION_USE*} per collocare la porta. Puoi usare{*CONTROLLER_ACTION_USE*} per aprire e chiudere una porta di legno nel mondo. + + + 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*} - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_BACK*}. + 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. + + Questa è l'interfaccia di Crafting (lavoro), che ti consente di combinare gli oggetti raccolti per crearne di nuovi. - - Questo è l'inventario della modalità Creativa. Mostra gli oggetti che hai in mano e tutti quelli a tua disposizione. + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. + + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + {*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare gli ingredienti necessari per creare l'oggetto corrente. + + + {*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare la descrizione dell'oggetto. + + + {*B*} + Premi {*CONTROLLER_VK_A*}per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il crafting. + + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto che vuoi prendere. {*B*} Premi{*CONTROLLER_VK_A*} per continuare.{*B*} Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario della modalità Creativa. + + + Questo è l'inventario della modalità Creativa. Mostra gli oggetti che hai in mano e tutti quelli a tua disposizione. + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. + + + 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*}. + + + + 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. + @@ -2847,2156 +5708,206 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - - - 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. - + + Acqua - - 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*}. + + Bottiglia di vetro - - Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto che vuoi prendere. + + Bottiglia d'acqua - - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_BACK*}. + + Occhio di ragno - - Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. + + Pepita d'oro - - Questa è l'interfaccia di Crafting (lavoro), che ti consente di combinare gli oggetti raccolti per crearne di nuovi. + + Verruca del Sottomondo - - {*B*} - Premi {*CONTROLLER_VK_A*}per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona il crafting. + + Pozione{*splash*}{*prefix*}{*postfix*} - - {*B*} - Premi{*CONTROLLER_VK_X*} per visualizzare la descrizione dell'oggetto. + + Occhio ragno fermen. - - {*B*} - Premi{*CONTROLLER_VK_X*} per visualizzare gli ingredienti necessari per creare l'oggetto corrente. + + Calderone - - {*B*} - Premi{*CONTROLLER_VK_X*} per visualizzare di nuovo l'inventario. + + Occhio di Ender - - 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. + + Anguria scintillante - - L'area crafting mostra gli elementi richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + Polvere di Vampe - - 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. + + Crema di magma - - La parte in basso a destra dell'interfaccia Crafting mostra il tuo inventario. Qui puoi anche vedere una descrizione dell'oggetto selezionato e gli ingredienti necessari per crearlo. - - - Ora è visualizzata la descrizione dell'oggetto selezionato, che ti dà un'idea del suo possibile utilizzo. - - - Ora è visualizzato l'elenco degli ingredienti necessari per creare l'oggetto selezionato. - - - Il legno ottenuto si può tagliare in assi. Seleziona l'icona delle assi e premi{*CONTROLLER_VK_A*} per crearle.{*PlanksIcon*} - - - Ora che hai costruito un tavolo da lavoro, collocalo nel mondo per creare una selezione di oggetti più vasta.{*B*} - Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. - - - Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo attrezzi.{*ToolsIcon*} - - - Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo strutture.{*StructuresIcon*} - - - Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Alcuni oggetti esistono in varie versioni, a seconda dei materiali impiegati. Seleziona la pala di legno.{*WoodenShovelIcon*} - - - Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Seleziona il tavolo da lavoro.{*CraftingTableIcon*} - - - Grazie agli attrezzi che hai creato, puoi partire alla grande e raccogliere diversi materiali in modo più efficiente.{*B*} - Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. - - - Alcuni oggetti non possono essere creati con il tavolo da lavoro, ma è necessaria una fornace. Ora crea una fornace.{*FurnaceIcon*} - - - Colloca la fornace creata nel mondo. Ti conviene metterla nel tuo rifugio.{*B*} - Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. - - - Questa è l'interfaccia fornace, dove puoi modificare gli oggetti attraverso il fuoco. Per esempio, puoi trasformare il minerale di ferro in lingotti di ferro. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. - - - Dovrai inserire del combustibile nella parte inferiore della fornace e l'oggetto da modificare nella parte superiore. A questo punto, la fornace si accenderà e si metterà in funzione, fornendo il risultato nella parte destra. - - - Puoi usare molti oggetti di legno come combustibile, ma ciascuno brucia per un tempo diverso. Puoi anche scoprire altri oggetti nel mondo da usare come combustibile. - - - Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. - - - Usando il legno come ingrediente, puoi produrre l'antracite. Inserisci del combustibile nella fornace e del legno nello slot ingrediente. La fornace può richiedere tempo per creare l'antracite, quindi sentiti libero di fare altro e di tornare in seguito a controllare l'avanzamento. - - - L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. - - - Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. - - - Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. - - - Per distillare una pozione, posiziona un ingrediente nello slot superiore e una pozione o una Bottiglia d'acqua negli slot inferiori. Puoi preparare fino a tre pozioni contemporaneamente. Una volta inserita una combinazione di ingredienti corretta, il processo di distillazione si avvierà e, dopo un breve periodo di tempo, potrai ritirare la tua pozione. - - - Il punto di partenza di tutte le pozioni è una Bottiglia d'acqua. Quasi tutte le pozioni vengono preparate utilizzando prima una Verruca del Sottomondo per creare una Maldestra pozione e aggiungendo poi almeno un altro ingrediente per ottenere il prodotto finale. - - - È possibile modificare gli effetti di una pozione aggiungendo altri ingredienti. La Polvere di pietra rossa, ad esempio, rende più duraturi gli effetti della pozione, mentre la Polvere di pietra brillante li rende più potenti. - - - L'Occhio di ragno fermentato inquina la pozione e può farle acquisire effetti diametralmente opposti, mentre la Polvere da sparo la trasforma in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nella zona colpita. - - - Crea una Pozione di Resistenza al fuoco aggiungendo prima una Verruca del Sottomondo a una Bottiglia d'acqua e completando poi la pozione con della Crema di magma. - - - Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. - - - In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla distillazione di pozioni.{*B*} - Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - - - Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. - - - Puoi riempire una Bottiglia di vetro attingendo acqua da un Calderone che ne contenga o da un blocco d'acqua. Riempi la tua bottiglia posizionando il cursore su una fonte d'acqua e premendo{*CONTROLLER_ACTION_USE*}. - - - Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. - - - Usa il Banco di distillazione per creare una Pozione di Resistenza al fuoco. Ti serviranno una Bottiglia d'acqua, una Verruca del Sottomondo e Crema di magma. - - - - Prendi una pozione e tieni premuto{*CONTROLLER_ACTION_USE*} per usarla. Le pozioni normali vengono ingerite e producono i propri effetti sul giocatore stesso; le pozioni Area, invece, vengono lanciate e il loro effetto si applica alle creature che si trovano nella zona dell'impatto. - È possibile creare delle pozioni bomba aggiungendo polvere da sparo a una pozione normale. - - - Usa la Pozione di Resistenza al fuoco su te stesso. - - - Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. - - - Questa è l'interfaccia degli incantesimi. Puoi usarla per incantare armi, armature e alcuni attrezzi. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia per gli incantesimi.{*B*} - Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - - - Per applicare un incantesimo a un oggetto, posizionalo nello slot di incantamento. È possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. - - - Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. - - - La cifra sul pulsante indica il costo in punti Esperienza dell'incantesimo. Se non hai un livello di Esperienza sufficiente, il pulsante non sarà selezionabile. - - - Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. - - - Gli incantesimi sono casuali, ma alcuni dei più potenti sono disponibili solo quando hai un livello elevato di Esperienza e intorno al Tavolo per incantesimi ci sono molti scaffali che ne aumentano la potenza. - - - In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} - Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - - - Utilizzando un Tavolo per incantesimi è possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. - - - Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. - - - Gli incantesimi richiedono un certo livello di Esperienza; puoi far salire di livello la tua Esperienza raccogliendo le sfere di Esperienza che vengono abbandonate da mostri e animali uccisi, estraendo metalli, facendo riprodurre animali, pescando e fondendo/cuocendo alcuni oggetti in una fornace. - - - Puoi guadagnare Esperienza anche usando una Bottiglia magica. Quando viene lanciata, la Bottiglia magica rilascia attorno a sé Sfere di Esperienza che possono essere raccolte. - - - Le casse che troverai in quest'area contengono oggetti già incantati, Bottiglie magiche e alcuni oggetti da incantare per acquisire dimestichezza con il Tavolo per incantesimi. - - - Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sul carrello da miniera.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona il carrello da miniera. - - - Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. - {*RailIcon*} - - - Puoi anche creare binari potenziati, che traggono energia dai circuiti e dalle torce di pietre rosse per far accelerare il carrello. Potrai quindi collegarli a interruttori, leve e piastre a pressione per realizzare sistemi complessi. - {*PoweredRailIcon*} - - - Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. - - - La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. - - - Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. - {*FishingRodIcon*} - - - Se aspetti che il galleggiante affondi sotto la superficie dell'acqua prima di tirare, potresti prendere un pesce. Il pesce si può mangiare crudo o cucinato nella fornace per reintegrare la salute. - {*FishIcon*} - - - Come nel caso di molti altri attrezzi, la canna da pesca ha un numero di utilizzi prestabilito, non limitato alla pesca. Sperimenta e scopri cos'altro puoi prendere o attivare... - {*FishingRodIcon*} - - - Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. - - - Il letto dovrebbe trovarsi in un punto sicuro e ben illuminato, in modo che i mostri non ti sveglino nel cuore della notte. Una volta usato un letto, se dovessi morire, tornerai in quel punto. - {*ICON*}355{*/ICON*} - - - Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. - {*ICON*}355{*/ICON*} - - - In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sui circuiti con pietre rosse e pistoni.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funzionano. - - - Leve, pulsanti, piastre a pressione e torce a pietre rosse alimentano i circuiti collegandoli direttamente all'oggetto da attivare o connettendoli con la polvere di pietra rossa. - - - Posizione e direzione delle fonti di alimentazione modificano il loro effetto sui blocchi circostanti. Per esempio, una torcia a pietre rosse sul lato di un blocco può essere spenta se il blocco è alimentato da un'altra fonte. - - - - La polvere di 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*} - - - - - I ripetitori a pietrarossa si usano per alimentare a distanza o per inserire un ritardo in un circuito. - {*ICON*}356{*/ICON*} - - - - - Quando è alimentato, un pistone si estende, spingendo fino a 12 blocchi. Quando si ritira, un pistone appiccicoso può tirare un blocco di quasi tutti i tipi. - {*ICON*}33{*/ICON*} - - - - Nel forziere in quest'area ci sono dei componenti per creare dei circuiti con i pistoni. Prova a usare o completare i circuiti in quest'area, oppure creane uno personalizzato. Troverai altri esempi al di fuori dell'area del tutorial. - - - In quest'area c'è un Portale per il Sottomondo! - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sui Portali e sul Sottomondo.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funzionano i Portali e il Sottomondo. - - - I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. - - - Per attivare un Sottoportale, dai fuoco ai blocchi di ossidiana dentro la struttura, usando acciarino e pietra focaia. I Portali possono essere disattivati se la struttura si rompe, se c'è un'esplosione nelle vicinanze o se del liquido vi scorre dentro. - - - Per usare un Sottoportale, mettiti in piedi all'interno. Lo schermo diventerà viola e sentirai un suono. Dopo qualche secondo sarai trasportato in un'altra dimensione. - - - Il Sottomondo può essere pericoloso e pieno di lava, ma può essere utile per raccogliere Sottogriglia, che una volta accesa brucia all'infinito, e Pietra brillante, che produce luce. - - - Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. - - - Ora sei in modalità Creativa. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla modalità Creativa.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona la modalità Creativa. - - - In modalità Creativa avrai a disposizione una quantità infinita di oggetti e blocchi, potrai distruggere blocchi con un clic, senza usare alcun attrezzo, sarai invulnerabile e potrai volare. - - - Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. - - - Raggiungi l'altra estremità di questo fosso per continuare. - - - Hai completato il tutorial della modalità Creativa. - - - In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona. - - - Grano, Zucche e 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. - - - 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. - - - Il Grano attraversa vari stadi prima di giungere a maturazione. È pronto ad essere raccolto quando ha assunto una tinta più scura.{*ICON*}59:7{*/ICON*} - - - Zucche e 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. - - - La Canna da zucchero deve essere piantata su un blocco di erba, terra o sabbia attiguo a un blocco d'acqua. Tagliare un blocco di Canna da zucchero fa cadere anche tutti i blocchi che lo sovrastano.{*ICON*}83{*/ICON*} - - - I Cactus si piantano nella sabbia e crescono fino a raggiungere un'altezza di tre blocchi. Come per la Canna da zucchero, distruggere il blocco inferiore ti permetterà di raccogliere anche i blocchi che lo sovrastano.{*ICON*}81{*/ICON*} - - - I Funghi vanno piantati in un'area scarsamente illuminata. Crescendo, si allargano verso i blocchi vicini, purché siano anch'essi in penombra.{*ICON*}39{*/ICON*} - - - La Farina d'ossa può essere usata per portare a maturità i raccolti o per trasformare i Funghi in Funghi giganti.{*ICON*}351:15{*/ICON*} - - - Hai completato il tutorial sulla coltivazione. - - - In quest'area troverai alcuni animali rinchiusi in un recinto. Se li fai riprodurre, gli animali metteranno al mondo delle versioni in miniatura di se stessi. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla riproduzione.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona. - - - Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. - - - 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. - - - Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto. - - - Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. - - - Alcuni animali ti seguiranno quando hai in mano il loro cibo. In questo modo ti sarà più semplice raggrupparli per farli riprodurre.{*ICON*}296{*/ICON*} - - - - I lupi selvatici possono essere 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. - - - - Hai completato il tutorial sulla riproduzione. - - - In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. - - - I golem si creano sistemando una zucca in cima a una pila di blocchi. - - - I golem di neve si creano con due blocchi di neve, uno sull'altro, con in cima una zucca. I golem di neve scagliano palle di neve contro i nemici. - - - I golem di ferro si creano con quattro blocchi di ferro, come mostrato, con una zucca sopra il blocco centrale. I golem di ferro attaccano i tuoi nemici. - - - I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. - - - Non puoi abbandonare l'area finché non avrai completato il tutorial. - - - Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. - - - Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. - - - Attrezzi diversi sono indicati per materiali diversi. Usa la piccozza per scavare pietra e minerali. Per ottenere risorse da alcuni blocchi, potrebbe rendersi necessario costruire piccozze con materiali migliori. - - - Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. - - - Suggerimento: tieni premuto {*CONTROLLER_ACTION_ACTION*}per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... - - - L'attrezzo che stai usando si è danneggiato. Ogni volta che usi un attrezzo, esso si danneggia e, alla fine, si rompe. La barra colorata sotto l'oggetto nell'inventario mostra lo stato corrente. - - - Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. - - - In quest'area c'è un carrello da miniera sui binari. Per salirci, punta il cursore verso i binari e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sul pulsante per far muovere il carrello. - - - Nella cassa accanto al fiume c'è una barca. Per usarla, punta il cursore verso l'acqua e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mentre punti verso la barca per salirci. - - - Nella cassa accanto al laghetto c'è una canna da pesca. Prendi la canna da pesca dalla cassa e selezionala come oggetto in mano per usarla. - - - Questo pistone con un meccanismo più avanzato crea un ponte auto-riparante! Premi il pulsante per attivarlo, poi scopri in che modo i componenti interagiscono tra loro per saperne di più. - - - Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. - - - Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. - - - Congratulazioni, hai completato il tutorial. Il tempo nel gioco scorre normalmente, e tra poco sarà notte e i mostri usciranno allo scoperto! Completa il rifugio! - - - {*EXIT_PICTURE*} Quando sarai pronto a proseguire l'esplorazione, vicino al rifugio del minatore troverai una scala che conduce a un piccolo castello. - - - Promemoria: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. - - - {*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} - Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. - - - In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. - - - Fuori da quest'area, troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi e pozioni da distillare! - - - La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla barra del cibo e sull'alimentazione.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. - - - Seleziona - - - Usa - - - Indietro - - - Esci - - - Annulla - - - Annulla accesso - - - Aggiorna elenco partite - - - Giochi Party - - - Tutti i giochi - - - Cambia gruppo - - - Mostra inventario - - - Mostra descrizione - - - Mostra ingredienti - - - Crafting - - - Crea - - - Prendi/Colloca - - - Prendi - - - Prendi tutto - - - Prendi metà - - - Colloca - - - Colloca tutti - - - Colloca uno - - - Posa - - - Posa tutti - - - Posa uno - - - Scambia - - - Spost. veloce - - - Elimina scelta rapida - - - Cos'è? - - - Condividi su Facebook - - - Cambia filtro - - - Invia richiesta amico - - - Pagina giù - - - Pagina su - - - Avanti - - - Indietro - - - Espelli giocatore - - - Tingi - - - Scava - - - Nutri - - - Addomestica - - - Cura - - - Siediti - - - Seguimi - - - Espelli - - - Svuota - - - Sella - - - Colloca - - - Colpisci - - - Mungi - - - Raccogli - - - Mangia - - - Dormi - - - Svegliati - - - Suona - - - Cavalca - - - Naviga - - - Coltiva - - - Nuota su - - - Apri - - - Cambia tonalità - - - Fai esplodere - - - Leggi - - - Appendi - - - Lancia - - - Pianta - - - Ara - - - Mieti - - - Continua - - - Sblocca gioco completo - - - Elimina salvataggio - - - Elimina - - - Opzioni - - - Invita amici - - - Accetta - - - Tosa - - - Escludi livello - - - Seleziona skin - - - Accendi - - - Naviga - - - Installa versione completa - - - Installa versione di prova - - - Installa - - - Reinstalla - - - Opzioni dati - - - Esegui comando - - - Creativa - - - Sposta ingrediente - - - Sposta combustibile - - - Sposta attrezzo - - - Sposta armatura - - - Sposta arma - - - Equipaggia - - - Tendi - - - Rilascia - - - Privilegi - - - Parata - - - Pagina su - - - Pagina giù - - - Modalità Amore - - - Bevi - - - Ruota - - - Nascondi - - - Libera tutti gli slot - - - OK - - - Annulla - - - Negozio di Minecraft - - - Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. - - - Esci dal gioco - - - Salva gioco - - - Esci senza salvare - - - Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? - - - Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! - - - Avvia gioco - - - Salvataggio dannegg. - - - Questo salvataggio è danneggiato. Vuoi eliminarlo? - - - Vuoi davvero tornare al menu principale e disconnettere tutti i giocatori? Tutti i progressi non salvati andranno persi. - - - Esci e salva - - - Esci senza salvare - - - Vuoi davvero tornare al menu principale? Tutti i progressi non salvati andranno persi. - - - Vuoi davvero tornare al menu principale? I progressi andranno persi! - - - Crea nuovo mondo - - - Avvia tutorial - - - Tutorial - - - Nomina il tuo mondo - - - Immetti un nome per il tuo mondo - - - Pianta il seme per la generazione del tuo mondo - - - Carica mondo salvato - - - Premi START per accedere - - - Uscita dal gioco - - - Si è verificato un errore. Tornerai al menu principale. - - - Connessione non riuscita - - - Connessione persa - - - Connessione al server persa. Tornerai al menu principale. - - - Disconnesso dal server - - - Sei stato espulso dalla partita - - - Sei stato espulso dalla partita per volo. - - - Timeout del tentativo di connessione - - - Server pieno - - - L'host è uscito dal gioco. - - - Non puoi accedere a questa partita perché non hai amici tra i partecipanti. - - - Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. - - - Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. - - - Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. - - - Nuovo mondo - - - Premio sbloccato! - - - Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! - - - Evviva, hai ottenuto un'immagine del giocatore con un creeper! - - - 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: - - - Amici - - - Punt. personale - - - Generale - - - Totale: - - - Posiz. - - - Preparazione al salvataggio livello - - - Preparazione blocchi... - - - Finalizzazione... - - - Creazione terreno - - - Simulazione mondo - - - Inizializzazione server - - - Creazione area di generazione - - - Caricamento area di generazione - - - Ingresso nel Sottomondo - - - Uscita dal Sottomondo - - - Rigenerazione - - - Generazione livello - - - Caricamento livello - - - Salvataggio giocatori - - - Connessione all'host - - - Download terreno - - - Passaggio a gioco offline - - - Attendi mentre l'host salva il gioco - - - Ingresso nel LIMITE - - - Uscita dal LIMITE - - - Questo letto è occupato - - - Puoi dormire solo di notte - - - %s dorme in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. - - - Letto mancante o passaggio ostruito - - - Non puoi riposare adesso: ci sono mostri nei paraggi - - - Stai dormendo in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. - - - Attrezzi e armi - - - Armi - - - Cibo - - - Strutture - - - Armature - - - Meccanismi - - - Trasporto - - - Decorazioni - - - Blocchi da costruzione - - - Pietra rossa e trasporti - - - Varie - - - Distillazione - - - Attrezzi, armi e armature - - - Materiali - - - Disconnesso - - - Difficoltà - - - Musica - - - Effetti - - - Gamma - - - Sensibilità gioco - - - Sensibilità interfaccia - - - Relax - - - Facile - - - Normale - - - Difficile - - - In questa modalità, il giocatore recupera salute col tempo e non ci sono nemici nell'ambiente. - - - In questa modalità, vengono generati nemici nell'ambiente, ma infliggono danni minori rispetto alla modalità normale. - - - In questa modalità, nell'ambiente vengono generati nemici che infliggono un danno standard al giocatore. - - - In questa modalità, nell'ambiente vengono generati nemici che infliggono gravi danni al giocatore. Fai attenzione anche ai creeper: è improbabile che annullino il loro attacco esplosivo quando ti allontani! - - - Timeout prova - - - Partita al completo - - - Impossibile accedere: nessuno spazio rimasto - - - Inserisci testo cartello - - - Inserisci il testo per il cartello - - - Inserisci titolo - - - Inserisci un titolo per il tuo messaggio - - - Inserisci didascalia - - - Inserisci una didascalia per il tuo messaggio - - - Inserisci descrizione - - - Inserisci una descrizione per il tuo messaggio - - - Inventario - - - Ingredienti - - + Banco di distillazione - - Cassa + + Lacrima di Ghast - - Incantesimo + + Semi di zucca - - Fornace + + Semi di anguria - - Ingrediente + + Pollo crudo - - Combustibile + + Disco - "11" - - Dispenser + + Disco - "dove siamo adesso" - - Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. + + Tosatrice - - %s si unisce alla partita. + + Pollo cotto - - %s ha abbandonato la partita. + + Perla di Ender - - %s è stato espulso dal gioco. + + Fetta di anguria - - Vuoi davvero eliminare questo salvataggio? + + Bacchetta di Vampe - - Da approvare + + Manzo crudo - - Censurato + + Bistecca - - In ascolto: + + Carne guasta - - Resetta impostazioni + + Bottiglia magica - - Vuoi davvero ripristinare le impostazioni predefinite? + + Assi di legno di quercia - - Errore caricamento + + Assi di legno di abete - - Partita di %s + + Assi di legno di betulla - - Partita con host sconosciuto + + Blocco d'erba - - Ospite disconnesso + + Terra - - Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. + + Ciottolo - - Accedi + + Assi di legno (giungla) - - Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? + + Arbusto di betulla - - Multiplayer non consentito + + Arbusto della giungla - - Creazione di partita non riuscita + + Substrato roccioso - - Selezionato automaticamente + + Arbusto - - No pacchetto: skin predef. + + Arbusto di quercia - - Skin preferite + + Arbusto di abete - - Livello escluso + + Pietra - - 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. + + Cornice oggetto - - Escludere questo livello? + + Genera {*CREATURE*} - - Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? -Selezionando OK, uscirai da questa partita. + + Mattone del Sottomondo - - Rimuovi da elenco esclusi + + Scarica di fuoco - - Autosalvataggio + + Scaric. fuoco brace - - Intervallo autosalvataggio: NO + + Scaric. fuoco carbone - - Min + + Teschio - - Impossibile collocare qui! + + Testa - - Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. + + Testa di %s - - Opacità interfaccia + + Testa di Creeper - - Preparazione salvataggio livello + + Teschio di scheletro - - Dimensioni dell'interfaccia + + Teschio di scheletro avvizzito - - Dimen. interfaccia (schermo div.) + + Testa di zombie - - Seme - - - Sblocca pacchetto Skin - - - Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. -Vuoi sbloccare il pacchetto Skin ora? - - - Sblocca pacchetto texture - - - Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. -Vuoi sbloccarlo ora? - - - Versione di prova pacchetto texture - - - Stai usando una versione di prova del pacchetto texture. Non potrai salvare questo mondo, a meno che non sblocchi la versione completa. -Vuoi sbloccare la versione completa del pacchetto texture? - - - Nessun pacchetto texture - - - Sblocca versione completa - - - Scarica versione di prova - - - Scarica versione completa - - - Questo mondo usa un pacchetto texture o mash-up che non hai! -Vuoi installare uno dei due pacchetti ora? - - - Ottieni la versione di prova - - - Ottieni la versione completa - - - Espelli giocatore - - - Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. - - - Pacchetti Immagini del giocatore - - - Temi - - - Pacchetti Skin - - - Accetta amici di amici - - - Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. - - - Impossibile accedere alla partita - - - Selezionato - - - Skin selezionata: - - - Contenuto scaricabile danneggiato - - - Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. - - - Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. - - - La modalità di gioco è cambiata - - - Rinomina il mondo - - - Inserisci il nuovo nome del tuo mondo - - - Modalità: Sopravvivenza - - - Modalità: Creativa - - - Sopravvivenza - - - Creativa - - - In modalità Sopravvivenza - - - In modalità Creativa - - - Renderizza nuvole - - - Cosa vuoi fare con questo salvataggio? - - - Rinomina salvataggio - - - Autosalvataggio tra %d... - - - - - - No - - - Normale - - - Superpiatto - - - Se attivato, il gioco sarà un gioco online. - - - Se attivato, i giocatori potranno unirsi solo su invito. - - - Se attivato, gli amici delle persone nell'elenco di amici potranno unirsi alla partita. - - - Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. - - - Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. - - - Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. - - - Se l'opzione è abilitata, il TNT esplode quando viene attivato. - - - Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. - - - Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. - - - Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. - - - Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. - - - Pacchetti di skin - - - Temi - - - Immagini del giocatore - - - Oggetti avatar - - - Pacchetti Texture - - - Pacchetti Mash-Up - - - {*PLAYER*} ha preso fuoco - - - {*PLAYER*} è bruciato vivo - - - {*PLAYER*} ha cercato di nuotare nella lava - - - {*PLAYER*} è soffocato dentro un muro - - - {*PLAYER*} è affogato - - - {*PLAYER*} è morto di fame - - - {*PLAYER*} è morto in seguito a una puntura - - - {*PLAYER*} si è schiantato al suolo - - - {*PLAYER*} è caduto fuori dal mondo - - - {*PLAYER*} è morto - - - {*PLAYER*} è saltato in aria - - - {*PLAYER*} è stato ucciso dalla magia - - - Un Drago di Ender ha ucciso {*PLAYER*} con il suo alito - - - {*PLAYER*} è stato ucciso da {*SOURCE*} - - - {*PLAYER*} è stato ucciso da {*SOURCE*} - - - {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} - - - {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} - - - {*PLAYER*} è stato pestato a morte da {*SOURCE*} - - - {*PLAYER*} è stato ucciso da {*SOURCE*} - - - Nebbia substrato roccioso - - - Mostra interfaccia - - - Mostra mano - - - Messaggi di morte - - - Personaggio animato - - - Animaz. skin personalizzata  - - - Non puoi più scavare né usare oggetti - - - Ora puoi scavare e usare oggetti - - - Non puoi più posizionare blocchi - - - Ora puoi posizionare blocchi - - - Ora puoi usare porte e interruttori - - - Non puoi più usare porte e interruttori - - - Ora puoi usare contenitori (es. casse) - - - Non puoi più usare contenitori (es. casse) - - - Non puoi più attaccare i nemici - - - Ora puoi attaccare i nemici - - - Non puoi più attaccare i giocatori - - - Ora puoi attaccare i giocatori - - - Non puoi più attaccare gli animali - - - Ora puoi attaccare gli animali - - - Ora sei un moderatore - - - Non sei più un moderatore - - - Ora puoi volare - - - Non puoi più volare - - - Non sentirai più la stanchezza - - - Ora sentirai la stanchezza - - - Ora sei invisibile - - - Non sei più invisibile - - - Ora sei invulnerabile - - - Non sei più invulnerabile - - - %d MSP - - - Drago di Ender - - - %s si trova ora nel Limite - - - %s ha lasciato il Limite - - - {*C3*}Ho capito a quale giocatore ti riferisci.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Sì. Fai attenzione. Ha raggiunto un livello superiore. Può leggere le nostre menti.{*EF*}{*B*}{*B*} -{*C2*}Non importa. Crede che siamo parte del gioco.{*EF*}{*B*}{*B*} -{*C3*}Mi piace, questo giocatore. Ha giocato bene. Non si è arreso.{*EF*}{*B*}{*B*} -{*C2*}Sta leggendo i nostri pensieri come se fossero parole su uno schermo.{*EF*}{*B*}{*B*} -{*C3*}È così che riesce a immaginare molte cose, quando è immerso nel sogno di un gioco.{*EF*}{*B*}{*B*} -{*C2*}Le parole sono un'interfaccia meravigliosa, estremamente flessibile e molto meno spaventosa del guardare la realtà oltre lo schermo.{*EF*}{*B*}{*B*} -{*C3*}Prima erano soliti ascoltare voci. Prima i giocatori erano in grado di leggere. Un tempo, chi non giocava chiamava i giocatori "streghe" e "stregoni", e i giocatori sognavano di volare su bastoni alimentati dall'energia dei demoni.{*EF*}{*B*}{*B*} -{*C2*}Cosa sognava questo giocatore?{*EF*}{*B*}{*B*} -{*C3*}Sognava la luce del sole, gli alberi... Sognava l'acqua e il fuoco... Sognava di creare, e sognava di distruggere... Sognava di cacciare e di essere preda... Sognava un riparo.{*EF*}{*B*}{*B*} -{*C2*}Ah, l'interfaccia originale... È vecchia di un milione di anni, ma ancora funziona. Ma quale vera struttura ha creato questo giocatore, nella realtà oltre lo schermo?{*EF*}{*B*}{*B*} -{*C3*}Ha funzionato, con oltre un milione di altri individui, per scolpire un vero mondo in una piega di {*EF*}{*NOISE*}{*C3*}, e ha creato {*EF*}{*NOISE*}{*C3*} per {*EF*}{*NOISE*}{*C3*}, in {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Non può leggere quel pensiero.{*EF*}{*B*}{*B*} -{*C3*}No. Non ha ancora raggiunto il livello più alto. Deve arrivarci nel lungo sogno della vita, non nella brevità di un gioco.{*EF*}{*B*}{*B*} -{*C2*}Sa che lo amiamo? Che l'universo è buono?{*EF*}{*B*}{*B*} -{*C3*}A volte, attraverso il rumore dei suoi pensieri, egli ascolta l'universo, sì.{*EF*}{*B*}{*B*} -{*C2*}Capita, però, che nel lungo sogno sia triste. Crea mondi senza estate, trema sotto un sole nero, e crede che la sua triste creazione sia la realtà.{*EF*}{*B*}{*B*} -{*C3*}Se lo guarissimo dal dolore lo distruggeremmo. Il dolore è parte del suo compito personale. Noi non possiamo interferire.{*EF*}{*B*}{*B*} -{*C2*}A volte, quando sognano profondamente, vorrei dire loro che in realtà stanno costruendo dei veri mondi. Vorrei svelare l'importanza che essi hanno per l'universo. E quando non hanno effettuato un vero collegamento per molto tempo, vorrei aiutarli a pronunciare la parola che temono.{*EF*}{*B*}{*B*} -{*C3*}Legge i nostri pensieri.{*EF*}{*B*}{*B*} -{*C2*}Non me ne importa. Certe volte vorrei dire loro che questo mondo che ritengono reale è solo {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}. Mi piacerebbe dire loro che sono {*EF*}{*NOISE*}{*C2*} nel {*EF*}{*NOISE*}{*C2*}. Vedono una parte minuscola della realtà, nel loro lungo sogno...{*EF*}{*B*}{*B*} -{*C3*}Eppure, essi continuano a giocare.{*EF*}{*B*}{*B*} -{*C2*}Sarebbe così facile dire tutto...{*EF*}{*B*}{*B*} -{*C3*}La rivelazione sarebbe troppo forte per questo sogno. Dire come vivere impedirebbe loro di vivere.{*EF*}{*B*}{*B*} -{*C2*}Non dirò al giocatore come vivere.{*EF*}{*B*}{*B*} -{*C3*}Il giocatore si sta inquietando.{*EF*}{*B*}{*B*} -{*C2*}Narrerò una storia al giocatore.{*EF*}{*B*}{*B*} -{*C3*}Ma non racconterò la verità.{*EF*}{*B*}{*B*} -{*C2*}No. Sarà una storia che conterrà la verità in modo sicuro, protetta da una gabbia di parole. Non dirò la cruda verità che può bruciare a qualsiasi distanza.{*EF*}{*B*}{*B*} -{*C3*}Dagli di nuovo un corpo.{*EF*}{*B*}{*B*} -{*C2*}Sì. Giocatore...{*EF*}{*B*}{*B*} -{*C3*}Usa il suo nome.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Giocatore.{*EF*}{*B*}{*B*} -{*C3*}Bene.{*EF*}{*B*}{*B*} - - - {*C2*}Ora respira profondamente. Respira ancora. Senti l'aria nei polmoni. I tuoi arti stanno tornando. Sì, muovi le dita... Hai di nuovo un corpo, nell'aria, soggetto alla forza di gravità. Rigenerati nel lungo sogno. Eccoti. Il tuo corpo tocca ancora una volta l'universo, in tutti i suoi punti, come se foste cose separate. Come se noi fossimo entità separate.{*EF*}{*B*}{*B*} -{*C3*}Chi siamo? Un tempo eravamo chiamati gli spiriti della montagna. Padre Sole, Madre Luna. Spiriti ancestrali... Spiriti animali... Jinn, fantasmi. Poi l'uomo verde. E ancora dei, demoni, angeli... Spiriti, alieni, extraterrestri... Infine leptoni, quark... Le parole cambiano. Noi non cambiamo.{*EF*}{*B*}{*B*} -{*C2*}Noi siamo l'universo. Siamo tutto ciò che credi non sia te. Ora ci stai guardando, attraverso la tua pelle e i tuoi occhi. Perché l'universo sfiora la tua pelle e ti inonda di luce? Per guardarti, giocatore. Per conoscersi e per farsi conoscere. Voglio raccontarti una storia.{*EF*}{*B*}{*B*} -{*C2*}Un tempo c'era un giocatore...{*EF*}{*B*}{*B*} -{*C3*}Quel giocatore eri tu, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}A volte il giocatore pensava di essere una creatura umana sulla sottile crosta di un globo rotante fatto di roccia fusa. Il globo di roccia fusa girava intorno a una sfera di gas fiammeggianti che era trecentotrentamila volte più grande di esso. La sfera era talmente distante dal globo che la luce impiegava otto minuti per viaggiare dall'una all'altro. La luce era informazione che veniva da una stella, e poteva bruciarti la pelle da una distanza di centocinquanta milioni di chilometri.{*EF*}{*B*}{*B*} -{*C2*}A volte il giocatore sognava di essere un minatore sulla superficie di un mondo piatto e infinito. Il sole era un quadrato bianco. I giorni erano brevi. C'era sempre molto da fare, e la morte non era altro che un inconveniente temporaneo.{*EF*}{*B*}{*B*} -{*C3*}A volte il giocatore credeva di essere parte di una storia.{*EF*}{*B*}{*B*} -{*C2*}A volte il giocatore sognava di essere altre cose in luoghi diversi. Alcuni di quei sogni erano sgradevoli, altri meravigliosi. Capitava anche che il giocatore si svegliasse da un sogno e si ritrovasse in un altro, per poi destarsi anche da quello e scoprirsi in un terzo sogno.{*EF*}{*B*}{*B*} -{*C3*}A volte il giocatore sognava di guardare delle parole su uno schermo.{*EF*}{*B*}{*B*} -{*C2*}Torniamo indietro.{*EF*}{*B*}{*B*} -{*C2*}Gli atomi del giocatore erano sparsi nell'erba, nei fiumi, nell'aria, nel suolo. Una donna raccolse gli atomi; li bevve, li mangiò, li respirò. La donna ricostruì il giocatore nel proprio corpo.{*EF*}{*B*}{*B*} -{*C2*}Il giocatore si svegliò dal caldo, buio mondo del corpo di sua madre e si ritrovò nel lungo sogno.{*EF*}{*B*}{*B*} -{*C2*}Il giocatore era una nuova storia, mai narrata prima, scritta con lettere di DNA. E il giocatore era un nuovo programma, mai eseguito prima, generato da un codice sorgente vecchio di miliardi di anni. E il giocatore era un nuovo essere umano, che non aveva mai vissuto prima, fatto solo di latte e amore.{*EF*}{*B*}{*B*} -{*C3*}Tu sei il giocatore. La storia. Il programma. L'essere umano. Sei fatto solo di latte e amore.{*EF*}{*B*}{*B*} -{*C2*}Torniamo ancora più indietro.{*EF*}{*B*}{*B*} -{*C2*}I sette miliardi di miliardi di miliardi di atomi che compongono il corpo del giocatore furono creati molto tempo prima di questo gioco, nel cuore di una stella. Quindi, anche il giocatore è informazione che proviene da una stella. Il giocatore si muove in una storia, che è una foresta di informazioni seminata da un uomo di nome Julian su un mondo piatto e infinito creato da un altro uomo chiamato Markus, che esiste nel piccolo mondo personale creato dal giocatore, che vive in un universo creato da...{*EF*}{*B*}{*B*} -{*C3*}Silenzio... A volte il giocatore creava il suo piccolo mondo personale, e lo faceva caldo, tenero, semplice. Altre volte lo faceva duro, freddo e complesso. A volte creava un modello dell'universo che aveva in mente, punti di energia che si muovono attraverso ampi spazi vuoti. A volte chiamava questi punti "elettroni" e "protoni".{*EF*}{*B*}{*B*} - - - {*C2*}A volte li chiamava "pianeti" e "stelle".{*EF*}{*B*}{*B*} -{*C2*}A volte credeva di esistere in un universo fatto di energia composta da serie di on e di off, di zero e di uno, di linee di codice. A volte credeva di giocare a un gioco. A volte credeva di leggere parole su uno schermo.{*EF*}{*B*}{*B*} -{*C3*}Tu sei il giocatore che legge le parole...{*EF*}{*B*}{*B*} -{*C2*}Silenzio... A volte il giocatore leggeva linee di codice su uno schermo, le scomponeva in parole e da esse ricavava un significato, che diventava sensazioni, emozioni, teorie e idee. Il giocatore iniziò a respirare più velocemente, più profondamente... Si era reso conto di essere vivo. Era vivo. Le migliaia di morti attraverso le quali era passato non erano reali. Il giocatore era vivo{*EF*}{*B*}{*B*} -{*C3*}Tu... Tu... sei... vivo.{*EF*}{*B*}{*B*} -{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato mediante i raggi di sole che filtravano tra le foglie ondeggianti sugli alberi d'estate...{*EF*}{*B*}{*B*} -{*C3*}E a volte il giocatore pensava che l'universo gli avesse parlato tramite la luce che cadeva dal limpido cielo delle notti invernali, quando un puntino luminoso nell'angolo del suo occhio poteva essere una stella milioni di volte più grande del sole, che trasformava i suoi pianeti in plasma incandescente per essere visibile per un solo istante al giocatore, che tornava a casa, dall'altro lato dell'universo, e sentiva il profumo dei cibi sulla porta a lui familiare, poco prima di rimettersi a sognare.{*EF*}{*B*}{*B*} -{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato con serie di zero e di uno, attraverso l'elettricità del mondo, con le parole che comparivano su uno schermo alla fine di un sogno.{*EF*}{*B*}{*B*} -{*C3*}L'universo gli diceva "ti amo"...{*EF*}{*B*}{*B*} -{*C2*}E l'universo gli diceva "hai giocato bene"...{*EF*}{*B*}{*B*} -{*C3*}E l'universo gli diceva "tutto ciò di cui hai bisogno è dentro di te"...{*EF*}{*B*}{*B*} -{*C2*}E l'universo gli diceva "sei più forte di quanto tu creda"...{*EF*}{*B*}{*B*} -{*C3*}E l'universo gli diceva "sei la luce del giorno"...{*EF*}{*B*}{*B*} -{*C2*}E l'universo gli diceva "tu sei la notte"...{*EF*}{*B*}{*B*} -{*C3*}E l'universo gli diceva "l'oscurità che combatti è dentro di te"...{*EF*}{*B*}{*B*} -{*C2*}E l'universo gli diceva "la luce che cerchi è dentro di te"...{*EF*}{*B*}{*B*} -{*C3*}E l'universo gli diceva "non sei solo"...{*EF*}{*B*}{*B*} -{*C2*}E l'universo gli diceva "tu non sei separato da tutte le altre cose"...{*EF*}{*B*}{*B*} -{*C3*}E l'universo gli diceva "tu sei l'universo che assapora sé stesso, che parla a sé stesso, che legge il proprio codice"...{*EF*}{*B*}{*B*} -{*C2*}E l'universo gli diceva "ti amo perché tu sei amore"...{*EF*}{*B*}{*B*} -{*C3*}E il gioco terminò, e il giocatore si svegliò dal sogno. Il giocatore iniziò un nuovo sogno, migliore del precedente. Il giocatore era l'universo. Il giocatore era amore.{*EF*}{*B*}{*B*} -{*C3*}Tu sei il giocatore.{*EF*}{*B*}{*B*} -{*C2*}Svegliati.{*EF*} - - - Resetta Sottomondo - - - Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! - - - Resetta il Sottomondo - - - Non resettare il Sottomondo - - - Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. - - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. - - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. - - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di lupi. - - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di galline. - - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. - - - Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. - - - Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. - - - Hai raggiunto il limite per i Telai di dipinti/oggetti di un mondo. - - - Non puoi generare nemici in modalità Relax. - - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. - - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. - - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. - - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. - - - È stato raggiunto il numero massimo di navi per mondo. - - - Hai raggiunto il numero massimo di teste di Mob in un mondo. - - - Inverti - - - Mancino - - - Sei morto! - - - Rigenerati - - - Offerte contenuto scaricabile - - - Cambia skin - - - Come giocare - - - Comandi - - - Impostazioni - - - Riconoscimenti - - - Reinstalla contenuto - - - Impostazioni debug - - - Diffusione incendio - - - Esplosione TNT - - - Giocatore vs Giocatore - - - Autorizza giocatori - - - Privilegi dell'host - - - Genera strutture - - - Mondo superpiatto - - - Cassa bonus - - - Opzioni mondo - - - Può costruire e scavare - - - Può usare porte e interruttori - - - Può aprire contenitori - - - Può attaccare i giocatori - - - Può attaccare gli animali - - - Moderatore - - - Espelli giocatore - - - Può volare - - - Disabilita stanchezza - - - Invisibile - - - Opzioni host - - - Giocatori/Invito - - - Partita online - - - Solo invito - - - Altre opzioni - - - Carica - - - Nuovo mondo - - - Nome mondo - - - Seme per generatore mondo - - - Lascia vuoto per seme casuale - - - Giocatori - - - Unisciti alla partita - - - Avvia gioco - - - Nessuna partita trovata - - - Gioca - - - Classifiche - - - Guida e opzioni - - - Sblocca gioco completo - - - Riprendi gioco - - - Salva gioco - - - Difficoltà: - - - Tipo di gioco: - - - Strutture: - - - Tipo di livello: - - - PvP: - - - Autorizza giocatori: - - - TNT: - - - Diffusione incendio: - - - Reinstalla tema - - - Reinstalla immagine del giocatore 1 - - - Reinstalla immagine del giocatore 2 - - - Reinstalla oggetto avatar 1 - - - Reinstalla oggetto avatar 2 - - - Reinstalla oggetto avatar 3 - - - Opzioni - - - Audio - - - Comando - - - Grafica - - - Interfaccia utente - - - Ripristina predefinite - - - Vedi bobbing - - - Aiuti - - - Aiuti contestuali del gioco - - - 2 gioc. schermo diviso verticale - - - Fatto - - - Modifica messaggio cartello: - - - Inserisci i dettagli del tuo screenshot - - - Didascalia - - - Screenshot del gioco - - - Modifica messaggio cartello: - - - Texture, icone e interfaccia classiche di Minecraft! - - - Mostra tutti i mondi Mash-up - - - Nessun effetto - - - Velocità - - - Lentezza - - - Fretta - - - Fatica del minatore - - - Forza - - - Debolezza - - - Guarigione istantanea - - - Danno istantaneo - - - Salto potenziato - - - Nausea - - - Rigenerazione - - - Resistenza - - - Resistenza al fuoco - - - Apnea - - - Invisibilità - - - Cecità - - - Visione notturna - - - Fame + + 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 + + dell'Opacità + + + della Fretta + + + della Debolezza + + + della Forza + + + Resistenza al fuoco + + + Saturazione + della Resistenza - - della Resistenza al fuoco + + del Salto - - dell'Apnea + + Avvizzito - - dell'Invisibilità + + Potenziamento salute - - della Cecità - - - della Visione notturna - - - della Fame - - - del Veleno + + Assorbimento @@ -5037,9 +5957,78 @@ Vuoi installare uno dei due pacchetti ora? III + + dell'Invisibilità + IV + + dell'Apnea + + + della Resistenza al fuoco + + + della Visione notturna + + + del Veleno + + + della Fame + + + dell'assorbimento + + + di saturazione + + + del potenziamento salute + + + della Cecità + + + del Decadimento + + + Rozza + + + Sottile + + + Diffusa + + + Chiara + + + Opaca + + + Maldestra + + + Imburrata + + + Amabile + + + Pasticciata + + + Insipida + + + Voluminosa + + + Blanda + Bomba @@ -5049,50 +6038,14 @@ Vuoi installare uno dei due pacchetti ora? Banale - - Blanda + + Prestante - - Chiara + + Cordiale - - Opaca - - - Diffusa - - - Rozza - - - Sottile - - - Maldestra - - - Insipida - - - Voluminosa - - - Pasticciata - - - Imburrata - - - Amabile - - - Affabile - - - Distinta - - - Densa + + Affascinante Elegante @@ -5100,149 +6053,152 @@ Vuoi installare uno dei due pacchetti ora? Elaborata - - Affascinante - - - Prestante - - - Raffinata - - - Cordiale - Frizzante - - Potente - - - Pessima - - - Inodore - Posizione Aspra + + Inodore + + + Potente + + + Pessima + + + Affabile + + + Raffinata + + + Densa + + + Distinta + + + Restituisce progressivamente salute a giocatori, animali e mostri affetti. + + + Riduce istantaneamente la salute di giocatori, animali e mostri affetti. + + + 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. + 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. + + + Si usa in un Banco di distillazione come base per tutte le pozioni. + Disgustosa Puzzolente - - Si usa in un Banco di distillazione come base per tutte le pozioni. - - - Non ha effetti; può essere usata in un Banco di distillazione per creare pozioni aggiungendo altri ingredienti. - - - Aumenta la velocità di movimento di giocatori, animali e mostri affetti. Nei giocatori affetti aumenta inoltre la velocità di scatto, la lunghezza dei salti e il campo visivo. - - - Riduce la velocità di movimento di giocatori, animali e mostri affetti. Nei giocatori affetti riduce inoltre la velocità di scatto, la lunghezza dei salti e il campo visivo. - - - Aumenta i danni provocati con l'attacco da giocatori e mostri affetti. - - - Riduce i danni provocati con l'attacco da giocatori e mostri affetti. - - - Aumenta istantaneamente la salute di giocatori, animali e mostri affetti. - - - Riduce istantaneamente la salute di giocatori, animali e mostri affetti. - - - Restituisce progressivamente salute a giocatori, animali e mostri affetti. - - - Rende giocatori, animali e mostri affetti immuni ai danni causati da fuoco, lava e attacchi a distanza di Vampe. - - - Riduce progressivamente la salute di giocatori, animali e mostri affetti. + + Percossa Acutezza - - Percossa + + Riduce progressivamente la salute di giocatori, animali e mostri affetti. - - Flagello degli Artropodi + + Danno da attacco Atterramento - - Aspetto di Fuoco + + Flagello degli Artropodi - - Protezione + + Velocità - - Protezione dal Fuoco + + Rinforzi zombie - - Caduta della Piuma + + Potenza di salto del cavallo - - Protezione dalle esplosioni + + Quando applicato: - - Protezione dai proiettili + + Resistenza all'atterramento - - Respirazione + + Gittata di inseguimento dei nemici - - Affinità con l'acqua - - - Efficienza + + Salute max Tocco di Seta - - Durezza + + Efficienza - - Saccheggio + + Affinità con l'acqua Fortuna - - Potenza + + Saccheggio - - Fiamma + + Durezza - - Pugno + + Protezione dal Fuoco - - Infinito + + Protezione - - I + + Aspetto di Fuoco - - II + + Caduta della Piuma - - III + + Respirazione + + + Protezione dai proiettili + + + Protezione dalle esplosioni IV @@ -5253,23 +6209,29 @@ Vuoi installare uno dei due pacchetti ora? VI + + Pugno + VII - - VIII + + III - - IX + + Fiamma - - X + + Potenza - - Può essere scavato con una piccozza di ferro o migliore per produrre smeraldi. + + Infinito - - 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. + + II + + + I Si attiva quando un'entità passa attraverso un allarme collegato. @@ -5280,44 +6242,59 @@ Vuoi installare uno dei due pacchetti ora? Un modo per compattare smeraldi. - - Un muro fatto di ciottoli. + + 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 può usare per riparare armi, strumenti e armature. + + IX - - Può essere fuso in una fornace per produrre quarzo del Sottomondo. + + VIII - - Si usa come decorazione. + + Può essere scavato con una piccozza di ferro o migliore per produrre smeraldi. - - Si può commerciare con gli abitanti. - - - Si usa come decorazione. Ci si possono piantare fiori, arbusti, cactus e funghi. + + X Reintegra 2{*ICON_SHANK_01*} e può essere trasformato in una carota d'oro. Si può piantare in una fattoria. + + Si usa come decorazione. Ci si possono piantare fiori, arbusti, cactus e funghi. + + + Un muro fatto di ciottoli. + Reintegra 0.5{*ICON_SHANK_01*}. Si può cuocere in una fornace o piantare in una fattoria. - - Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando una patata in una fornace. + + Può essere fuso in una fornace per produrre quarzo del Sottomondo. + + + Si può usare per riparare armi, strumenti e armature. + + + Si può commerciare con gli abitanti. + + + Si usa come decorazione. + + + Reintegra 4{*ICON_SHANK_01*}. - 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. + Reintegra 1{*ICON_SHANK_01*}, ma potrebbe avvelenarti. Si usa per controllare un maiale sellato quando lo si cavalca. - - Reintegra 4{*ICON_SHANK_01*}. + + Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando una patata in una fornace. + + + Reintegra 3{*ICON_SHANK_01*}. Composto da una carota e pepite d'oro. Si usa con un'incudine per incantare armi, strumenti e armature. @@ -5325,6 +6302,15 @@ Vuoi installare uno dei due pacchetti ora? 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 + + Torta di zucca - - Patata - - - 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. + + + Tingi collare + + + + Per iniziare a lavorare su un oggetto, piazzalo nel primo slot di ingresso. {*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. - - - - - 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. @@ -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,14 +6627,24 @@ 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. In quest'area c'è un abitante e una cassa contenente carta per acquistare oggetti. + + + + + premi{*CONTROLLER_VK_A*} per scambiare gli oggetti che l'abitante richiede con l'oggetto offerto. + + + + + I giocatori possono scambiare oggetti del loro inventario con gli abitanti del villaggio. @@ -5671,19 +6653,14 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi Premi{*CONTROLLER_VK_B*} se sai già tutto sugli scambi. - + - I giocatori possono scambiare oggetti del loro inventario con gli abitanti del villaggio. + 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. - - - - - Effettuando un mix di scambi, gli scambi offerti dall'abitante verranno aggiornati o aumentati in modo casuale. @@ -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,37 +1,124 @@  - + + Vuoi accedere a "PSN"? + + + 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. + + + SELECT + + + 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. + + + Sistema PlayStation®Vita + + + Scegli "Rete Ad Hoc" per connetterti con altri sistemi PlayStation®Vita nelle vicinanze, o "PSN" per connetterti con amici in tutto il mondo. + + + Rete Ad Hoc + + + Cambia modalità di rete + + + Scegli modalità di rete + + + ID online schermo condiviso + + + Trofei + + + 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. + + + 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. + + + ID online: + + + 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. + + + + Patch 1.04 (Aggiornamento titolo 14) + + + ID online nel gioco + + + Guarda cosa ho fatto in Minecraft: PlayStation®Vita Edition! + + + Scaricamento fallito. Riprova più tardi. + + + Impossibile entrare nella partita a causa di un tipo di NAT restrittivo. Verificare le impostazioni di rete. + + + Caricamento fallito. Riprova più tardi. + + + Scaricamento completato! + + + + 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. + + + + Salvataggio incompleto + + + Minecraft: PlayStation®Vita Edition ha esaurito lo spazio per i salvataggi. Per creare spazio, cancella altri salvataggi di Minecraft: PlayStation®Vita Edition. + + + Caricamento annullato + + + Hai annullato il caricamento di questo salvataggio nell'area di trasferimento salvataggi. + + + Carica salvataggio per PS3™/PS4™ + + + Caricamento dati: %d%% + + + "PSN" + + + Scarica salvataggio PS3™ + + + Scaricamento dati: %d%% + + + Salvataggio + + + Caricamento completato! + + + Vuoi davvero caricare questo salvataggio, sovrascrivendo il salvataggio esistente nell'area di trasferimento salvataggi? + + + Conversione dati + + NOT USED - - Puoi usare il touchscreen per navigare nei menu del sistema PlayStation®Vita! - - - minecraftforum contiene una sezione dedicata alla PlayStation®Vita Edition. - - - Segui @4JStudios e @Kappische su Twitter per le ultime notizie sul gioco! - - - Non guardare un Enderman negli occhi! - - - Riteniamo che 4J Studios abbia rimosso Herobrine dal gioco per sistema PlayStation®Vita, ma non ne siamo sicuri. - - - Minecraft: PlayStation®Vita Edition ha battuto diversi record! - - - {*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. - - - {*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. + + NOT USED {*T3*}COME GIOCARE: MODALITÀ CREATIVA{*ETW*}{*B*}{*B*} @@ -46,32 +133,80 @@ Per andare a sinistra premi {*CONTROLLER_ACTION_DPAD_LEFT*} o per andare a destr 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. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Invita Amici - 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? Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. Vuoi davvero continuare? - - Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. + + "NOT USED" - - 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? + + Invita Amici + + + minecraftforum contiene una sezione dedicata alla PlayStation®Vita Edition. + + + Segui @4JStudios e @Kappische su Twitter per le ultime notizie sul gioco! + + + NOT USED + + + Puoi usare il touchscreen per navigare nei menu del sistema PlayStation®Vita! + + + Non guardare un Enderman negli occhi! + + + {*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. + + + {*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. + + + Riteniamo che 4J Studios abbia rimosso Herobrine dal gioco per sistema PlayStation®Vita, ma non ne siamo sicuri. + + + Minecraft: PlayStation®Vita Edition ha battuto diversi record! + + + 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? + + + Caricamento di "Minecraft: PlayStation®Vita Edition" non riuscito, impossibile continuare. + + + Distillazione + + + Sei tornato alla schermata iniziale perché sei uscito da "PSN". + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. Connessione a "PSN" persa. Tornerai al menu principale. @@ -79,11 +214,23 @@ Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CON Connessione a "PSN" persa. + + Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. + + + 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? + 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? + + I giocatori ospiti non possono sbloccare il gioco completo. Connettiti ad un account Sony Entertainment Network. + + + ID Online + 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". @@ -93,151 +240,7 @@ Vuoi sbloccare il gioco completo? Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Per accettare questo invito è necessario il gioco completo. Vuoi sbloccare il gioco completo? - - I giocatori ospiti non possono sbloccare il gioco completo. Connettiti ad un account Sony Entertainment Network. - - - ID Online - - - Distillazione - - - Sei tornato alla schermata iniziale perché sei uscito da "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? - - - Caricamento di "Minecraft: PlayStation®Vita Edition" non riuscito, impossibile continuare. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - ID online schermo condiviso - - - Trofei - - - ID online: - - - ID online nel gioco - - - Guarda cosa ho fatto in Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Patch 1.04 (Aggiornamento titolo 14) - - - SELECT - - - 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. - - - Vuoi accedere a "PSN"? - - - 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. - - - Sistema PlayStation®Vita - - - Cambia modalità di rete - - - Scegli modalità di rete - - - Scegli "Rete Ad Hoc" per connetterti con altri sistemi PlayStation®Vita nelle vicinanze, o "PSN" per connetterti con amici in tutto il mondo. - - - Rete Ad Hoc - - - "PSN" - - - Scarica salvataggio sistema PlayStation®3 - - - Carica salvataggio per sistema PlayStation®3/PlayStation®4 - - - Caricamento annullato - - - Hai annullato il caricamento di questo salvataggio nell'area di trasferimento salvataggi. - - - Caricamento dati: %d%% - - - Scaricamento dati: %d%% - - - Vuoi davvero caricare questo salvataggio, sovrascrivendo il salvataggio esistente nell'area di trasferimento salvataggi? - - - Conversione dati - - - Salvataggio - - - Caricamento completato! - - - Caricamento fallito. Riprova più tardi. - - - Scaricamento completato! - - - Scaricamento fallito. Riprova più tardi. - - - Impossibile entrare nella partita a causa di un tipo di NAT restrittivo. Verificare le impostazioni di rete. - - - - 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. - - - - Salvataggio incompleto - - - Minecraft: PlayStation®Vita Edition ha esaurito lo spazio per i salvataggi. Per creare spazio, cancella altri salvataggi di Minecraft: PlayStation®Vita Edition. + + 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" からサインアウトしました。タイトル画面に戻ります - - - "PSN" からサインアウトしました。マッチを終了します - - - 現在サインインしていません - - - このゲームの一部の機能は、"PSN" にサインインしていないと使用できません。現在は "PSN" にサインインしていません - - - アドホックネットワークがオフラインです - - - このゲームの一部の機能は、アドホックネットワークに接続していないと使用できません。現在はオフラインです - - - この機能を使うには、"PSN" にサインインしている必要があります - - - "PSN" に接続 - - - アドホックネットワークに接続 - - - トロフィー獲得のエラー - - - Sony Entertainment Network のアカウントに正常にアクセスできませんでした。現在はトロフィーを獲得できません + + Sony Entertainment Network アカウントの設定を保存できませんでした Sony Entertainment Network アカウントのエラー - - Sony Entertainment Network アカウントの設定を保存できませんでした + + Sony Entertainment Network のアカウントに正常にアクセスできませんでした。現在はトロフィーを獲得できません - これは Minecraft: PlayStation(R)3 Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! -完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: PlayStation(R)3 Editionの楽しさを体験してください。 + これは Minecraft: "PlayStation 3" Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation 3" Editionの楽しさを体験してください。 完全版を購入しますか? + + アドホックネットワークに接続 + + + このゲームの一部の機能は、アドホックネットワークに接続していないと使用できません。現在はオフラインです + + + アドホックネットワークがオフラインです + + + トロフィー獲得のエラー + + + "PSN" からサインアウトしました。マッチを終了します + + + "PSN" からサインアウトしました。タイトル画面に戻ります + + + 本体ストレージに新しいセーブデータを作成するための空き容量がありません + + + 現在サインインしていません + + + "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,2996 +1,874 @@  - - 新しいダウンロード コンテンツが追加されました! メイン メニューの [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() は最高でした! - - - ウワサは鵜呑みにしないこと。ほどほどに信じるのが一番! - - - {*T3*}遊び方: 基本{*ETW*}{*B*}{*B*} -Minecraft は自由な発想でブロックを積み上げて、いろいろな物を作るゲームです。夜になるとモンスターが現れるので、その前に必ず安全な場所を作っておかなければなりません。{*B*}{*B*} -{*CONTROLLER_ACTION_LOOK*} を使って周囲を見回します。{*B*}{*B*} -{*CONTROLLER_ACTION_MOVE*} を使って歩き回ります。{*B*}{*B*} -ジャンプするには、{*CONTROLLER_ACTION_JUMP*} を押します。{*B*}{*B*} -ダッシュするには、{*CONTROLLER_ACTION_MOVE*} を前方向にすばやく2回連続で倒します。{*CONTROLLER_ACTION_MOVE*} を前に倒している間、キャラクターはダッシュを続けます。ただし一定時間が過ぎるか空腹ゲージが{*ICON_SHANK_03*}以下になると、そこでやめます。{*B*}{*B*} -手や、手に持ったアイテムで物を掘ったり、木を切ったりするには、 {*CONTROLLER_ACTION_ACTION*} を押し続けます。ブロックの中には、特別な道具を作らないと、掘ることができないものもあります。{*B*}{*B*} -手に持ったアイテムは、{*CONTROLLER_ACTION_USE*} で使うことができます。また、{*CONTROLLER_ACTION_DROP*} を押すと、そのアイテムを落とします - - - {*T3*}遊び方: 画面の表示{*ETW*}{*B*}{*B*} -画面上にはプレイヤーのステータスが表示されています。HP、空気の残り (水中の場合)、空腹度 (何か食べると回復する)、装備している防具などです。 -空腹ゲージの {*ICON_SHANK_01*} が 9 個以上ある状態では、HP が自然に回復します。食べ物を食べると空腹ゲージは回復します。{*B*} -経験値ゲージには、現在の経験値レベルを示す数字と次のレベルまでに必要な値を示すゲージが表示されます。 -経験値は、生き物を倒した時、特定のブロックを採掘した時、動物を繁殖させた時、釣り、かまどで鉱石を製錬した時などに獲得できる経験値オーブを集めると貯まっていきます。{*B*}{*B*} -さらに使用できるアイテムも表示され、{*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} で手に持つアイテムを切り替えられます. - - - {*T3*}遊び方: 持ち物{*ETW*}{*B*}{*B*} -持ち物は {*CONTROLLER_ACTION_INVENTORY*} で見ることができます。{*B*}{*B*} -手で持って使用できるアイテムと、所有しているアイテムのリスト、現在装備している防具を確認できます。{*B*}{*B*} -ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かして、アイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。そのアイテムを複数所有している場合は、そのすべてが選択されます。半分だけ選択するには {*CONTROLLER_VK_X*} を使用します。{*B*}{*B*} -ポインターで選んだアイテムを持ち物の別の場所に移動させるには、移動先で {*CONTROLLER_VK_A*} を押します。 ポインターに複数のアイテムがある場合は、{*CONTROLLER_VK_A*} を押すと全部、 {*CONTROLLER_VK_X*} を押すと 1 つだけ移動させることができます。{*B*}{*B*} -ポインターで選んだアイテムが防具の場合、適切な防具スロットに移すためのボタンガイドが表示されます。{*B*}{*B*} -革の防具は、染料で染めて色を変えられます。持ち物メニュー内で染料をポインターで選択し、染めたいアイテムに合わせてから {*CONTROLLER_VK_X*} を押すと、染めることができます。 - - - {*T3*}使い方: チェスト{*ETW*}{*B*}{*B*} -チェストを作ったら、それをゲームの世界に置きましょう。{*CONTROLLER_ACTION_USE*} でチェストを使って、中にアイテムを保管できます。{*B*}{*B*} -ポインターを使って、アイテムを持ち物からチェストに、あるいはその逆に移せます。{*B*}{*B*} -チェストに入れたアイテムはそのまま保管され、後でまた自分の持ち物に戻すことができます - - - {*T3*}使い方: チェスト (大){*ETW*}{*B*}{*B*} -2 つのチェストを横に並べて置くと、チェスト (大) になります。よりたくさんのアイテムを保管できます。{*B*}{*B*} -使い方は普通のチェストと同じです - - - {*T3*}遊び方: 工作{*ETW*}{*B*}{*B*} -工作画面では、持ち物のアイテムを組み合わせて新しいアイテムを作れます。 工作画面を開くには {*CONTROLLER_ACTION_CRAFTING*} を押します。{*B*}{*B*} -画面上部のタブを {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で切り替えて、作りたいアイテムのグループを選んでから {*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選びます。{*B*}{*B*} -工作ウィンドウに、そのアイテムを作るのに必要なアイテムが表示されます。{*CONTROLLER_VK_A*} を押すとアイテムが作られ、持ち物に追加されます - - - {*T3*}使い方: 作業台{*ETW*}{*B*}{*B*} -作業台を使うと、もっと大きなアイテムを作ることができます{*B*}{*B*} -ゲームの世界に作業台を置いて {*CONTROLLER_ACTION_USE*} を押すと、使うことができます{*B*}{*B*} -作業台での作業も通常の工作と流れは同じですが、工作ウィンドウが大きくなり、より多くのアイテムを作れるようになります - - - {*T3*}使い方: かまど{*ETW*}{*B*}{*B*} -かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます。{*B*}{*B*} -ゲームの世界にかまどを置いて {*CONTROLLER_ACTION_USE*} を押すと使うことができます。{*B*}{*B*} -かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。{*B*}{*B*} -加工が終わると、そのアイテムをかまどの取り出し口から持ち物に移すことができます。{*B*}{*B*} -ポインターで選んだアイテムがかまどで使用する素材または燃料の場合、かまどへ移動するためのボタンガイドが表示されます - - - {*T3*}使い方: 分配装置{*ETW*}{*B*}{*B*} -分配装置を使うと、アイテムを撃ち出すことができます。そのためには分配装置の横にレバーなどのスイッチ部分を取り付ける必要があります。{*B*}{*B*} -分配装置にアイテムを入れるには、{*CONTROLLER_ACTION_USE*} を押してから、持ち物からアイテムを分配装置に移します。{*B*}{*B*} -それから取り付けたスイッチを使うと、分配装置がアイテムを撃ち出します - - - {*T3*}遊び方: 調合{*ETW*}{*B*}{*B*} -ポーションの調合には、作業台で作れる調合台を使います。ポーションの調合にはまず水のビンが必要なので、大釜や水源からガラスビンに水を移し、水のビンを用意しましょう。{*B*} -調合台にはビンを置く枠が 3 つあり、1 回の調合で最大 3 つのポーションを調合できます。1 つの材料でビン 3 本分のポーションが作れるので、資源を効率よく使うには一度に 3 つのポーションを作りましょう。{*B*} -調合台の上の枠にポーションの材料を置いて少し待つと、基剤となるポーションができます。基剤自体に効果はありませんが、別の材料を加えて調合すると、効力を持つポーションを作れます。{*B*} -このポーションが完成したら、3 つめの材料を加えてさらなる効果をつけてみましょう。レッドストーンの粉を足せば効果の持続時間が長くなり、光石の粉を足せばポーションの効力が高まり、発酵したクモの目を足せばマイナス効果のあるポーションが作れます。{*B*} -また、どのポーションでも火薬を加えればスプラッシュポーションになります。スプラッシュポーションは投げて使用し、落ちた場所に効果を発揮します。{*B*} - -ポーションの原材料となるものは以下の通りです:{*B*}{*B*} -* {*T2*}暗黒茸{*ETW*}{*B*} -* {*T2*}クモの目{*ETW*}{*B*} -* {*T2*}砂糖{*ETW*}{*B*} -* {*T2*}ガストの涙{*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*} -エンチャントに必要な経験値は、不足している場合は赤、足りている場合は緑で表示されます。{*B*}{*B*} -エンチャントは消費可能な経験値の範囲でランダムに選択されます。{*B*}{*B*} -エンチャントテーブルの周囲に、テーブルとブロック 1 つ分のすき間を空けて本棚 (最大 15 台) を並べることで、エンチャントのレベルが上がります。またエンチャントテーブル上の本から謎の文字が出るエフェクトが表示されます。{*B*}{*B*} -エンチャントテーブルに必要な材料は、すべてゲームの世界内の村や、採掘、農耕などで手に入ります。{*B*}{*B*} -エンチャントの本は、金床でアイテムをエンチャントする際に使います。これによって、アイテムに付与するエンチャントの内容をより制御できるようになります。{*B*} - - - {*T3*}遊び方: 動物の飼育{*ETW*}{*B*}{*B*} -動物を特定の場所で飼うには 20 x 20 ブロック未満のエリアに柵を立て、その中に動物を入れます。これで動物は柵の中にとどまり、いつでも様子を見ることができます - - - {*T3*}遊び方: 動物の繁殖{*ETW*}{*B*}{*B*} -Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ちゃんバージョン -を産み出します!{*B*} -動物を繁殖させるには、その動物に合った餌を与えて、動物たちを「求愛モー -ド」に導く必要があります。{*B*} -牛、ムーシュルーム、羊には小麦、豚にはニンジン、ニワトリには小麦の種か暗 -黒茸、オオカミには肉を与えましょ う。すると、近くにいる求愛モードの仲間 -を探し始めます。{*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*} - ほかのプレイヤーやプレイヤー自身を、ゲームの世界内の別のプレイヤーがいる場所へと移動させることができます。 - - - - 次へ - - - 前へ - - - 基本 - - - 画面の表示 - - - 持ち物 - - - チェスト - - - 工作 - - - かまど - - - 分配装置 - - - 動物の飼育 - - - 動物の繁殖 - - + 調合 - - エンチャント - - - 闇のポータル - - - マルチプレイヤー - - - スクリーンショットの公開 - - - 世界へのアクセス禁止 - - - クリエイティブ モード - - - ホストとプレイヤーのオプション - - - 取引 - - - 金床 - - - 果ての世界 - - - {*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 + + セーブ データの破損 - - 光沢を放つ延べ棒。道具を作る材料として使う。かまどで鉱石を精錬して作る + + OK - - 延べ棒、宝石、染料などを、世界に置くことができるブロックに変えられる。高級な建築用ブロックや、鉱石の保管用として使うことができる + + キャンセル - - プレイヤーや動物、モンスターなどが上を通ると電気を送り出す。木の重量感知板は、物を上に置くことでも作動する + + Minecraft ストア - - 小さな階段を作るのに使う + + 回転する - - 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + 隠す - - 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + すべての枠を空にする - - 明かりを照らすのに使う。たいまつは、雪や氷も溶かすことができる + + 本当に現在プレイしているゲームを終了して、新しいゲームに参加してもよろしいですか? セーブしていない途中経過は失われてしまいます - - 建築用素材。様々な物の材料になる。どんな形の木からでも切り出せる + + 以前のこの世界のセーブ データを、現在のデータで上書きしてもよろしいですか? - - 建築用素材。通常の砂のように重力の影響を受けない + + 本当にセーブせずメイン メニューに戻ってもよろしいですか? この世界での途中経過は失われてしまいます - - 建築用素材 + + ゲームを始める - - たいまつ、矢、看板、はしご、柵の材料や、道具や武器の握り部分として使う + + ゲームを終了 - - ゲーム内の全てのプレイヤーがベッドで寝ている時に使うと、夜から朝へ時間を早回しすることができる。そして、使用したプレイヤーの復活地点が変わる。 -ベッドの色は使われたウールの色に関係なく、常に同じ + + ゲームをセーブ - - 通常の工作よりも、さらに多くの種類のアイテムを作ることができる + + セーブせずに終了 - - 鉱石を精錬して木炭やガラスを作ったり、魚や豚肉を調理することができる + + START を押してゲームに参加 - - 中にブロックやアイテムを保管できる。2 つのチェストを横に並べることで、2 倍の容量のチェスト (大) ができる + + おめでとうございます! Minecraft の Steve のゲーマー アイコンを獲得しました! - - 「障害物」として機能し、ジャンプで飛び越えることができない。プレイヤーや動物、モンスターに対しては、高さ 1.5 ブロックとして機能し、他のブロックに対しては高さ 1 ブロックとして機能する + + おめでとうございます! クリーパーのゲーマー アイコンを獲得しました! - - 垂直方向に登るのに使う + + 完全版を購入 - - 使用したり、叩いたり、レッドストーンで開く。普通のドアとして機能するが、ブロック 1 個分であり、平らな床面として置ける + + 相手のプレイヤーのゲームのバージョンが新しいため、ゲームに参加できません - - 自分や他のプレイヤーの入力したテキストを表示できる + + 新しい世界 - - たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + + アワードをアンロックしました! - - 爆発を起こすのに使う。置いてから火打ち石と打ち金を使ったり、電気を通すことで起爆する + + 今はお試し版をプレイ中です。データをセーブするためには完全版を購入いただく必要があります +今すぐ完全版を購入しますか? - - きのこシチューを入れるのに使う。シチューを食べてしまっても、おわんは残る + + フレンド - - 水や溶岩、ミルクを貯めて移動するのに使う + + マイスコア - - 水を入れて運ぶのに使う + + 通算 - - 溶岩を入れて運ぶのに使う + + お待ちください - - ミルクを入れて運ぶのに使う + + 結果なし - - 火を起こしたり、TNT を起爆したり、建築済みのポータルを開くのに使う + + フィルター: - - 魚を獲るのに使う + + 相手のプレイヤーのゲームのバージョンが古いため、ゲームに参加できません - - 太陽と月の位置を表示する + + 接続が切断されました - - 自分のスタート地点を示す + + サーバーとの接続が切断されました。メイン メニューに戻ります - - 手に持っていると、探索済みのエリアの地図を表示する。道を確認するのに使う + + サーバーにより切断されました - - 矢を射る攻撃ができる + + ゲームを終了 - - 弓と組み合わせて、武器として使う + + エラーが起こりました。メイン メニューに戻ります - - 2.5{*ICON_SHANK_01*} 回復する + + 接続に失敗しました - - 1{*ICON_SHANK_01*} 回復する。6 回まで使用できる + + ゲームから追放されました - - 1{*ICON_SHANK_01*} 回復する + + ホストがゲームを終了しました - - 1{*ICON_SHANK_01*} 回復する + + この世界でプレイ中のフレンドがいないため、この世界には入れません - - 3{*ICON_SHANK_01*} 回復する + + 以前にホストにより追放されているため、この世界には入れません - - 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。食べると毒にあたる可能性がある + + 空を飛んだため、ゲームから追放されました - - 3{*ICON_SHANK_01*} 回復する。かまどで鶏肉を調理するとできる + + 接続に時間がかかりすぎています - - 1.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能 + + サーバーが満員です - - 4{*ICON_SHANK_01*} 回復する。かまどで牛肉を調理するとできる + + 敵が出現し、その攻撃力がアップします。また、一瞬近づいただけでもクリーパーが爆発するようになるので注意しましょう - - 1.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能 + + テーマ - - 4{*ICON_SHANK_01*} 回復する。かまどで生の豚肉を調理するとできる + + スキン パック - - 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。ヤマネコに与えて手なずけることもできる + + フレンドのフレンドを許可 - - 2.5{*ICON_SHANK_01*} 回復する。かまどで生魚を調理するとできる + + プレイヤーを追放 - - 2{*ICON_SHANK_01*} 回復する。金のリンゴの材料となる + + このプレイヤーをゲームから追放しますか? 追放されたプレイヤーは、この世界を再スタートするまで世界に入れなくなります - - 2{*ICON_SHANK_01*} 回復し、さらに HP が 4 秒間、自動回復する。リンゴと金の塊から作られる + + ゲーマー アイコン パック - - 2{*ICON_SHANK_01*} 回復する。食べると毒にあたる可能性がある + + この世界への参加は、ホスト プレイヤーのフレンドのみに制限されています - - ケーキの材料の 1 つ。ポーションを調合する際の原材料としても使われる + + 破損したダウンロード コンテンツ - - オン/オフを切り替えて、電気を送れる。もう一度押すまでオンまたはオフの状態が保たれる + + このダウンロード コンテンツは破損しているため使用できません。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください - - ブロックの横に取り付けて、常に電気を送ったり、送受信機として使える。 -弱い明かりとしても使用可能 + + 破損して使用できないダウンロード コンテンツがあります。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください - - 反復装置、遅延装置、ダイオードとして単体で、または組み合わせて、レッドストーンの回路に使われる + + 世界に入れません - - 押すと電気を送れる。約 1 秒間起動した後、自動的にオフになる + + 選択中 - - レッドストーンを電源として使い、ランダムな順番でアイテムを撃ち出す + + 選択したスキン: - - 音を奏でる。叩くと音程を変えられる。種類の違うブロックの上に置くことで、楽器の種類を変えることができる + + 完全版を購入 - - トロッコを走らせるのに使う + + テクスチャ パックのロック解除 - - 電源が入っている時、上を走るトロッコを加速させる。電源が入っていない時は、上でトロッコが止まる + + このテクスチャ パックを世界で使用するには、これをロック解除してください。 +今すぐテクスチャ パックをロック解除しますか? - - トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る + + テクスチャ パック試用版 - - プレイヤーや動物、モンスターを乗せて、レールの上を移動できる + + シード - - 物を載せて、レール上を移動できる + + スキン パックのロック解除 - - レールの上を移動する。石炭を使うことで他のトロッコを押すことができる + + 選択したスキンを使用するには、スキン パックをロック解除してください。 +今すぐスキン パックをロック解除しますか? - - 泳ぐよりも速く水上を移動できる + + 現在お使いのテクスチャ パックは試用版です。完全版を利用しない場合、この世界はセーブできません。 +テクスチャ パックの完全版を購入しますか? - - 羊から採れる。染料を使って色を変えることができる + + 完全版をダウンロード - - 建築用素材。染料で色を変えることができる。ウールは羊から簡単に入手できるので、この作り方はあまりお勧めできない + + この世界は、持っていないテクスチャ パック、またはマッシュアップ パックが使用されています。 +今すぐこのテクスチャ パック、またはマッシュアップ パックをインストールしますか? - - 黒のウールを作るのに使う染料 + + 試用版を購入 - - 緑のウールを作るのに使う染料 + + テクスチャ パックを持っていません - - 茶色のウールを作るのに使う染料。クッキーの材料や、カカオの実を育てるのにも使われる + + 完全版を購入 - - 銀のウールを作るのに使う染料 + + 試用版をダウンロード - - 黄色のウールを作るのに使う染料 + + ゲームモードを変更しました - - 赤のウールを作るのに使う染料 + + 有効にすると、招待されたプレイヤーしか参加できません - - 即座に作物や木、背の高い草、巨大なきのこ、花などを育てるのに使う。染料の材料にもなる + + 有効にすると、フレンド リストのフレンドのみゲームに参加できます - - ピンクのウールを作るのに使う染料 + + 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります。(サバイバル モードのみ) - - オレンジのウールを作るのに使う染料 + + ノーマル - - 黄緑のウールを作るのに使う染料 + + スーパーフラット - - 灰色のウールを作るのに使う染料 + + 有効にすると、オンラインのゲームになります - - 薄灰色のウールを作るのに使う染料 -(注意: 薄灰色の染料は灰色の染料と骨粉を混ぜて作るれば、 1 つの墨袋から 3 つではなく 4 つの薄灰色の染料を作ることができる) + + 無効にすると、このゲームに参加したプレイヤーは許可をもらわないかぎり建設や採掘ができません - - 空色のウールを作るのに使う染料 + + 有効にすると、村や要塞などの建物が世界に生成されるようになります - - 水色のウールを作るのに使う染料 + + 有効にすると、地上界および暗黒界に、まったく平らな世界を生成します - - 紫のウールを作るのに使う染料 + + 有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します - - 赤紫のウールを作るのに使う染料 + + 有効にすると、火は近くの可燃性ブロックに燃え広がります - - 青のウールを作るのに使う染料 + + 有効にすると、TNT 火薬を起爆すると爆発します - - 音楽ディスクを聞ける + + 有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です - - 強力な道具、武器や防具を作ることができる + + オフ - - たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + + ゲームモード: クリエイティブ - - 本や地図を作るのに使う + + サバイバル - - 本棚を作るのに使う。エンチャントするとエンチャントの本になる。 + + クリエイティブ - - エンチャントテーブルの周囲に並べることで、エンチャントの効果をより強力にできる + + 世界の名前を変更する - - 飾り付けとして使う + + 世界の新しい名前を入力してください - - 鉄のツルハシ以上で掘れる。かまどに入れて精錬すると、金の延べ棒になる + + ゲームモード: サバイバル - - 石のツルハシ以上で掘れる。かまどに入れて精錬すると、鉄の延べ棒になる + + サバイバル モードで作成 - - ツルハシで掘れる。石炭が採れる + + セーブデータの名前を変更する - - 石のツルハシ以上で掘れる。ラピスラズリが採れる + + %d 秒後にオートセーブを開始します... - - 鉄のツルハシ以上で掘れる。ダイヤモンドが採れる + + オン - - 鉄のツルハシ以上で掘れる。レッドストーンの粉が採れる + + クリエイティブ モードで作成 - - ツルハシで掘れる。丸石が採れる + + 雲を表示する - - シャベルを使って集める。建築用に使われる + + このセーブデータに対する操作を選んでください - - 植えると、最終的に木に成長する + + 画面表示サイズ (画面分割) - - 破壊することができない + + 材料 - - 触れる物すべてに火をつける。バケツを使って集める + + 燃料 - - シャベルを使って集める。かまどに入れて精錬するとガラスになる。下に何もないと重力に引かれる - - - シャベルを使って集める。掘っていると、時々火打ち石が出てくる。下に何もないと重力に引かれる - - - 斧を使って切る。木の板の材料になったり、燃料としても使われる - - - かまどで砂を精錬するとできる。建築用素材として使えるが、掘ると壊れる - - - ツルハシを使って石から掘り出す。かまどや石の道具を作るのに使う - - - かまどで粘土を焼いて作る - - - かまどで焼くとレンガになる - - - 壊すと粘土の塊を落とす。粘土はかまどで焼くとレンガになる - - - 雪玉を保管するのに使える - - - シャベルで掘り出して雪玉を作る - - - 壊すと時々、小麦の種が出てくる - - - 染料の材料になる - - - おわんに入れてシチューを作れる - - - ダイヤモンドのツルハシのみで掘れる。水と溶岩が混ざることで生まれる。ポータルの材料になる - - - モンスターを出現させる - - - 地面に置いて、電気を伝えられる。ポーションに加えて調合すると、効果の持続時間が延長される - - - 十分に育つと作物が実り、小麦を収穫できる - - - 耕された地面。種を植えられる - - - かまどで加熱することで、緑色の染料になる - - - 砂糖を作るための材料になる - - - ヘルメットとしてかぶったり、たいまつと組み合わせてカボチャ ランタンにできる。カボチャのパイの主原料でもある - - - いったん火がつくと、燃え続ける - - - 上を歩くもののスピードを遅くする - - - ポータルを通過すると、地上界と暗黒界を行き来できる - - - かまどの燃料として使用する。たいまつの材料にもなる - - - クモを倒すと手に入る。弓や釣り竿の材料になる。地面に設置してトリップワイヤーを作ることもできる - - - ニワトリを倒すと手に入る。矢の材料になる - - - クリーパーを倒すと手に入る。TNT 火薬の材料になる。ポーションを調合する際の原材料としても使われる - - - 農地にまくと作物ができる。日光が十分に当たるようにしよう! - - - 作物から収穫できる。食べ物アイテムを作るのに使われる - - - 砂利を掘ると手に入る。火打ち石と打ち金の材料になる - - - 豚に使うと、その豚に乗れる。豚は串刺しのニンジンで操ることができる - - - 雪を掘ると手に入る。投げることができる - - - 牛を倒すと手に入る。防具の材料となる。本を作る際にも使われる - - - スライムを倒すと手に入る。ポーションを調合する際の原材料として使われ、吸着ピストンの材料にもなる - - - ニワトリがランダムで落とす。食べ物アイテムの材料になる - - - 光石を掘ると手に入る。光石のブロックに戻すことができる。ポーションに加えて調合すると、効果のレベルが上がる - - - ガイコツを倒すと手に入る。骨粉の材料となる。オオカミに与えると手なずけることができる - - - ガイコツにクリーパーを倒させると手に入る。ジュークボックスで再生できる - - - 火を消し、作物の成長を促進する。バケツで集めることができる - - - 壊すと時々、苗木を落とす。苗木は植えると木へと成長する - - - ダンジョン内にある。建設と飾り付けに使う - - - 羊からウールを刈り取ったり、葉っぱのブロックを収穫するのに使う - - - (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押すことができる - - - (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押し、ピストンが戻る時には、触れているブロックを引き戻す - - - 石ブロックから作る。要塞で見かけることが多い - - - 柵と同様、障害物として使う - - - ドアと似ているが、主に柵と組み合わせて使う - - - 切ったスイカから作れる - - - 透明なブロックで、ガラスブロックの代わりに使える - - - 植えるとカボチャが生える - - - 植えるとスイカが生える - - - エンダーマンが倒されたときに落とす。投げると、落ちた場所にプレイヤーがテレポートされ、HP が少し減る - - - 上面に草が生えた土ブロック。シャベルを使って集める。建築用に使われる - - - 建設と飾り付けに使う - - - 歩くと移動が遅くなる。ハサミで破壊でき、糸が採れる - - - 破壊されるとシルバーフィッシュを出現させる。近くで別のシルバーフィッシュが攻撃を受けたときにも、シルバーフィッシュを出現させる場合がある - - - 置くと徐々に茂る。ハサミを使って集める。はしごのように登ることができる - - - 上面を歩くと滑る。他のブロックの上で壊れると水になる。光源に近づけたり、暗黒界に設置すると溶ける - - - 飾り付けとして使う - - - ポーションの調合や要塞を探すのに使う。暗黒砦の周囲にいるブレイズが落とす - - - ポーションの調合に使う。ガストが倒されたときに落とす - - - ゾンビ ピッグマンが倒されたときに落とす。ゾンビピッグマンは暗黒界にいる。ポーションを調合する際の原材料として使われる - - - ポーションの調合に使う。暗黒砦に生えている。また、ソウルサンドでも育つ - - - 何に使うかにより、様々な効果が現れる - - - 水を入れるビン。調合台でポーションを作る時、最初に必要になる - - - 食べ物や薬の材料となる有毒のアイテム。クモや洞窟グモが倒されたときに落とす - - - 主にマイナス効果のポーションを調合するのに使う - - - ポーションの調合や、他のアイテムと合わせてエンダーアイまたはマグマクリームを作るのに使う - - - ポーションの調合に使う - - - ポーションやスプラッシュポーションの調合に使う - - - 雨水またはバケツの水を入れて、水をガラスビンに詰めるのに使われる - - - 投げると果てのポータルがある方角を示す。果てのポータルの枠内に 12 個置くと、果てのポータルが起動する - - - ポーションの調合に使う - - - 草ブロックに似ているが、きのこ栽培に最適 - - - 水に浮く植物。上を歩くことができる - - - 暗黒砦を建てるのに使う。ガストの火の玉が効かない - - - 暗黒砦で使う - - - 暗黒砦で手に入る。壊すと暗黒茸を落とす - - - プレイヤーの経験値を消費して剣やツルハシ、斧、シャベル、弓、防具にエンチャントを行う - - - エンダーアイを 12 個使って起動すると、果ての世界へ行くためのポータルができる - - - 果てのポータルを作るのに使う - - - 果ての世界に存在するブロックの一種。爆発に対する耐性が高いので建材として便利 - - - 果ての世界でエンダー ドラゴンを倒すと出現するブロック - - - 投げると経験値オーブを落とす。経験値オーブを貯めると経験値が上がる - - - 火をつけるのに便利。分配装置から撃ち出して、無差別に火を起こすのにも使われる - - - 陳列ケースのように、中に入れたアイテムまたはブロックを展示する - - - 投げると特定の種類の生き物が出現する - - - 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる - - - 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる - - - かまどで暗黒石を精錬するとできる。暗黒レンガ ブロックの材料となる - - - 動力を受けると点灯する - - - 栽培して、カカオ豆を収穫できる - - - モブ ヘッドは飾り付けとして並べたり、ヘルメットのスロットからマスクとして着用もできる - - - イカ - - - 倒すと墨袋を落とす - - - - - - 倒すと革を落とす。バケツがあればミルクも取れる - - - - - - 毛を刈るときウールを落とす (毛が残っている場合)。ウールはいろいろな色に染められる - - - ニワトリ - - - 倒すと羽根を落とす。タマゴを持っている場合もある - - - - - - 倒すと豚肉を落とす。鞍があれば乗ることもできる - - - オオカミ - - - 普段はおとなしいが、攻撃すると反撃してくる。骨を使うと手なずけることができ、プレイヤーについて回って、プレイヤーを攻撃してくる敵を攻撃してくれる - - - クリーパー - - - 近づきすぎると爆発する! - - - ガイコツ - - - 矢を放ってくる。倒すと矢を落とす - - - クモ - - - 近づくと攻撃してくる。壁を登ることができる。倒すと糸を落とす - - - ゾンビ - - - 近づくと攻撃してくる - - - ゾンビ ピッグマン - - - 最初はおとなしいが、1 匹を攻撃すると集団で反撃してくる - - - ガスト - - - 当たると爆発する火の玉を放ってくる - - - スライム - - - ダメージを与えると、小さなスライムに分裂する - - - エンダーマン - - - 照準を向けると攻撃してくる。ブロックを移動できる - - - シルバーフィッシュ - - - 攻撃すると、近くに隠れているシルバーフィッシュも集まってくる。石ブロックの中に隠れている - - - 洞窟グモ - - - 牙に毒がある - - - ムーシュルーム - - - おわんを使うと、きのこシチューが採れる。ハサミで毛刈りをするときのこを落とすが、普通の牛になってしまう - - - スノー ゴーレム - - - 雪ブロックとカボチャで作れるゴーレム。作った人の敵に向かって雪玉を投げつける - - - エンダー ドラゴン - - - 果ての世界に存在する大きな黒竜 - - - ブレイズ - - - 暗黒界に出現する敵。主に暗黒砦内にいる。倒すとブレイズ ロッドを落とす - - - マグマ キューブ - - - 暗黒界に出現する。スライム同様、倒すと分裂する - - - 村人 - - - ヤマネコ - - - ジャングルに生息。生魚を与えて飼い慣らせる。不意な動きに驚いてすぐに逃げるため、向こうから寄ってくるのを待たなければならない - - - アイアン ゴーレム - - - 村に出現して村人を守ってくれる。鉄のブロックとカボチャで作ることもできる - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - リード ゲーム プログラマー Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kagstrom - - - Tobias Mollstam - - - Rise Lugo - - - 木の剣 - - - 石の剣 - - - 鉄の剣 - - - ダイヤモンドの剣 - - - 金の剣 - - - 木のシャベル - - - 石のシャベル - - - 鉄のシャベル - - - ダイヤモンドのシャベル - - - 金のシャベル - - - 木のツルハシ - - - 石のツルハシ - - - 鉄のツルハシ - - - ダイヤモンドのツルハシ - - - 金のツルハシ - - - 木の斧 - - - 石の斧 - - - 鉄の斧 - - - ダイヤモンドの斧 - - - 金の斧 - - - 木のくわ - - - 石のくわ - - - 鉄のくわ - - - ダイヤモンドのくわ - - - 金のくわ - - - 木のドア - - - 鉄のドア - - - 鎖のヘルメット - - - 鎖のチェストプレート - - - 鎖のレギンス - - - 鎖のブーツ - - - 革の帽子 - - - 鉄のヘルメット - - - ダイヤモンドのヘルメット - - - 金のヘルメット - - - 革の服 - - - 鉄のチェストプレート - - - ダイヤモンドの鎧 - - - 金のチェストプレート - - - 革のパンツ - - - 鉄のレギンス - - - ダイヤモンドのレギンス - - - 金のレギンス - - - 革のブーツ - - - 鉄のブーツ - - - ダイヤモンドのブーツ - - - 金のブーツ - - - 鉄の延べ棒 - - - 金の延べ棒 - - - バケツ - - - 水バケツ - - - 溶岩バケツ - - - 火打ち石と打ち金 - - - リンゴ - - - - - - - - - 石炭 - - - 木炭 - - - ダイヤモンド - - - - - - おわん - - - きのこシチュー - - - - - - 羽根 - - - 火薬 - - - 小麦の種 - - - 小麦 - - - パン - - - 火打ち石 - - - 生の豚肉 - - - 調理した豚肉 - - - - - - 金のリンゴ - - - 看板 - - - トロッコ - - - - - - レッドストーン - - - 雪玉 - - - ボート - - - - - - ミルク バケツ - - - レンガ - - - 粘土 - - - サトウキビ - - - - - - - - - スライムボール - - - チェストつきトロッコ - - - かまどつきトロッコ - - - タマゴ - - - コンパス - - - 釣り竿 - - - 時計 - - - 光石の粉 - - - 生魚 - - - 調理した魚 - - - 染色粉 - - - 墨袋 - - - ローズ レッド - - - サボテン グリーン - - - ココア ビーンズ - - - ラピスラズリ - - - 紫の染料 - - - 水色の染料 - - - 薄灰色の染料 - - - 灰色の染料 - - - ピンクの染料 - - - 黄緑の染料 - - - たんぽぽイエロー - - - 空色の染料 - - - 赤紫の染料 - - - オレンジの染料 - - - 骨粉 - - - - - - 砂糖 - - - ケーキ - - - ベッド - - - レッドストーン反復装置 - - - クッキー - - - 地図 - - - 音楽ディスク: 13 - - - 音楽ディスク: cat - - - 音楽ディスク: blocks - - - 音楽ディスク: chirp - - - 音楽ディスク: far - - - 音楽ディスク: mall - - - 音楽ディスク: mellohi - - - 音楽ディスク: stal - - - 音楽ディスク: strad - - - 音楽ディスク: ward - - - 音楽ディスク: 11 - - - 音楽ディスク: where are we now - - - ハサミ - - - カボチャの種 - - - スイカの種 - - - 鶏肉 - - - 焼き鳥 - - - 牛肉 - - - ステーキ - - - 腐肉 - - - エンダーパール - - - 切ったスイカ - - - ブレイズ ロッド - - - ガストの涙 - - - 金の塊 - - - 暗黒茸 - - - {*prefix*}{*postfix*}ポーション{*splash*} - - - ガラスビン - - - 水のビン - - - クモの目 - - - 発酵したクモの目 - - - ブレイズの粉 - - - マグマクリーム - - - 調合台 - - - 大釜 - - - エンダーアイ - - - 輝くスイカ - - - エンチャントのビン - - - 発火剤 - - - 発火剤 (木炭) - - - 発火剤 (石炭) - - - 額縁 - - - {*CREATURE*}出現 - - - 暗黒レンガ - - - スカル - - - ガイコツ スカル - - - ウィザー ガイコツ スカル - - - ゾンビ ヘッド - - - ヘッド - - - %sのヘッド - - - クリーパー ヘッド - - - - - - 草ブロック - - - - - - 丸石 - - - 樫の板 - - - トウヒの板 - - - 樺の板 - - - ジャングルの木の板 - - - 苗木 - - - 樫の苗木 - - - トウヒの苗木 - - - 樺の苗木 - - - ジャングルの木の苗木 - - - 岩盤 - - - - - - 溶岩 - - - - - - 砂岩 - - - 砂利 - - - 金鉱石 - - - 鉄鉱石 - - - 石炭の原石 - - - - - - 樫の木 - - - トウヒの木 - - - 樺の木 - - - ジャングルの木 - - - - - - トウヒ - - - - - - 葉っぱ - - - 樫の葉 - - - トウヒの葉 - - - 樺の葉 - - - ジャングルの木の葉 - - - スポンジ - - - ガラス - - - ウール - - - 黒のウール - - - 赤のウール - - - 緑のウール - - - 茶色のウール - - - 青のウール - - - 紫のウール - - - 水色のウール - - - 薄灰色のウール - - - 灰色のウール - - - ピンクのウール - - - 黄緑のウール - - - 黄色のウール - - - 空色のウール - - - 赤紫のウール - - - オレンジのウール - - - 白のウール - - - - - - バラ - - - きのこ - - - 金のブロック - - - 金を省スペースに保管できる - - - 鉄のブロック - - - 鉄を省スペースに保管できる - - - 石の厚板 - - - 石の厚板 - - - 砂岩の厚板 - - - 樫の厚板 - - - 丸石の厚板 - - - レンガの厚板 - - - 石レンガの厚板 - - - 樫の厚板 - - - トウヒの厚板 - - - 樺の厚板 - - - ジャングルの木の厚板 - - - 暗黒レンガの厚板 - - - レンガ - - - TNT 火薬 - - - 本棚 - - - コケ石 - - - 黒曜石 - - - たいまつ - - - たいまつ (石炭) - - - たいまつ (木炭) - - - - - - モンスター発生器 - - - 樫の階段 - - - チェスト - - - レッドストーンの粉 - - - ダイヤモンド鉱石 - - - ダイヤモンドのブロック - - - ダイヤモンドを省スペースに保管できる - - - 作業台 - - - 作物 - - - 農地 - - - かまど - - - 看板 - - - 木のドア - - - はしご - - - レール - - - 加速レール - - - 感知レール - - - 石の階段 - - - レバー - - - 重量感知板 - - - 鉄のドア - - - レッドストーン鉱石 - - - レッドストーンのたいまつ - - - ボタン - - - - - - - - - サボテン - - - 粘土 - - - サトウキビ - - - ジュークボックス - - - - - - カボチャ - - - カボチャ ランタン - - - 暗黒石 - - - ソウルサンド - - - 光石 - - - ポータル - - - ラピスラズリ鉱石 - - - ラピスラズリのブロック - - - ラピスラズリを省スペースに保管できる - - + 分配装置 - - 音ブロック + + チェスト - - ケーキ + + エンチャント - - ベッド + + かまど - - クモの巣 + + 現在、このタイプのダウンロードできるコンテンツはありません - - 背の高い草 + + 本当にこのセーブデータを削除してもよろしいですか? - - 枯れた茂み + + 承認待ち - - ダイオード + + 検閲済み - - 鍵つきチェスト + + %s が世界にやってきました - - トラップドア + + %s が世界を去りました - - ウール (すべての色) + + %s が追放されました - - ピストン - - - 吸着ピストン - - - シルバーフィッシュ ブロック - - - 石レンガ - - - 苔の生えた石レンガ - - - ひび割れた石レンガ - - - 模様入り石レンガ - - - きのこ - - - きのこ - - - 鉄格子 - - - ガラス板 - - - スイカ - - - カボチャの茎 - - - スイカの茎 - - - つた - - - フェンスゲート - - - レンガ階段 - - - 石レンガ階段 - - - シルバーフィッシュの石 - - - シルバーフィッシュの丸石 - - - シルバーフィッシュの石レンガ - - - 菌糸 - - - スイレンの葉 - - - 暗黒レンガ - - - 暗黒レンガの柵 - - - 暗黒レンガ階段 - - - 暗黒茸 - - - エンチャントテーブル - - + 調合台 - - 大釜 + + 看板の文字を入力 - - 果てのポータル + + 看板の文字を入力してください - - 果てのポータルの枠 + + タイトルを入力 - - 果ての石 + + お試し版タイムアウト - - ドラゴンの卵 + + 完全版 - - 低木 + + 既に満員のため、ゲームに参加できませんでした - - シダ + + 投稿のタイトルを入力してください - - 砂岩の階段 + + 投稿の説明を入力してください - - トウヒの階段 - - - 樺の階段 - - - ジャングルの木の階段 - - - レッドストーン ランプ - - - ココア - - - スカル - - - 現在の操作方法 - - - レイアウト - - - 動く/ダッシュ - - - 見る - - - 止まる - - - ジャンプ - - - ジャンプ/上昇 (飛行時) - - + 持ち物 - - 手持ちアイテムの切り替え + + 材料 - - アクション + + キャプションを入力 - - 使う + + 投稿のキャプションを入力してください - - 工作 + + 説明を入力 - - 落とす + + プレイ中: - - しのび足 + + この世界をアクセス禁止リストに登録しますか? +OK を選択すると、この世界でのプレイを終了します - - しのび足/下降 (飛行時) + + アクセス禁止を解除 - - カメラ モードの変更 + + オートセーブの間隔 - - プレイヤー/招待 + + アクセスが禁止されています - - 移動 (飛行時) + + アクセス禁止リストに登録されている世界に参加しようとしています。 +このまま参加すると、この世界はアクセス禁止リストから外されます - - レイアウト 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;]]> + + %s のゲーム - - <![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;]]> + + ロード エラー - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + ゲスト プレイヤーの 1 人がサインアウトしたため、すべてのゲスト プレイヤーがゲームから取り除かれました - - <![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*} - - - 工作にはいくつもの工程があります。木の板が手に入ったので、これで、いろいろ作ることができます。まずは作業台を作ってみましょう{*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*} + 農作業の説明を続ける: {*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*} + ポータルと暗黒界の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ポータルと暗黒界の説明を飛ばす: {*CONTROLLER_VK_B*} - - ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かして、アイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。 - そのアイテムを複数所有している場合は、そのすべてが選択されます。半分だけ選択するには {*CONTROLLER_VK_X*} を使用します + + レッドストーンの粉は、鉄、ダイヤモンド、金のツルハシでレッドストーン鉱石を掘ると手に入ります。レッドストーンの粉を使って電気を伝えることができます。ただし、伝えられるのは距離にして 15 ブロック分、上下には 1 ブロック分までとなります + {*ICON*}331{*/ICON*} - - ポインターで選んだアイテムを持ち物の別の場所に移動させるには、移動先で {*CONTROLLER_VK_A*} を押します。 - ポインターに複数のアイテムがある場合は、{*CONTROLLER_VK_A*} を押すと全部を移動、 {*CONTROLLER_VK_X*} を押すと 1 つだけ移動できます + + レッドストーン反復装置で電気の届く距離を伸ばしたり、回路を遅延させたりすることができます + {*ICON*}356{*/ICON*} - - ポインターでアイテムを選択したまま、持ち物画面の外にポインターを動かすことで、アイテムを外に落とすことができます + + ピストンは電気が送られると伸びて、最大 12 個のブロックを押します。吸着ピストンであれば、戻るときに大半の種類のブロックを 1 つ引き寄せることができます + {*ICON*}33{*/ICON*} - - アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_VK_BACK*} を押してください + + ポータルは、黒曜石のブロックで横 4 ブロック、縦 5 ブロックの枠を作成することで完成します。角のブロックは必要ありません。 - - 持ち物画面を閉じるには {*CONTROLLER_VK_B*} を押します + + 暗黒界をうまく利用して地上界を高速移動することができます。暗黒界での 1 ブロックの距離は、地上界での 3 ブロックに相当します - - これがクリエイティブ モードの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリストを確認できます + + クリエイティブ モードになりました - + {*B*} - 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - クリエイティブ モードの持ち物の説明を飛ばす: {*CONTROLLER_VK_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*} を押します + + 材料ごとに適した道具があります。石や鉱石を掘り出す場合はツルハシを使うのがよいでしょう。特定の種類のブロックを掘るためには、さらに優れた材料を使ってツルハシを作る必要があるかもしれません - - -これが工作画面です。この画面では、これまでに集めたアイテムを組み合わせて、新しいアイテムを作ることができます + + 特定の道具は敵を攻撃するのに向いています。剣を使うと良いでしょう - + + アイアン ゴーレムは村に自然に現れて村人を守ることもあります。村人を攻撃すると、このアイアン ゴーレムが反撃します + + + チュートリアルを終えるまで、このエリアから出ることはできません + + + 材料ごとに適した道具があります。土や砂などの柔らかいものを掘る場合はシャベルを使うのがよいでしょう + + + ヒント: 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*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*} + 動物の繁殖の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 動物の繁殖の説明を飛ばす: {*CONTROLLER_VK_B*} - + + 動物を繁殖させるには、動物にあった餌を与えて、動物たちを「求愛モード」にしてやる必要があります + + + 手にえさを持っていると、あなたの後ろをついてくる動物もいます。この習性を利用すれば、簡単に動物を一か所に集めことができるでしょう。{*ICON*}296{*/ICON*} + + {*B*} - アイテムの説明を見るには {*CONTROLLER_VK_X*} を押します + ゴーレムの説明を続ける{*CONTROLLER_VK_A*}{*B*} + ゴーレムの説明を飛ばす{*CONTROLLER_VK_B*} - - {*B*} - このアイテムを作るのに必要なアイテムのリストを見るには {*CONTROLLER_VK_X*} を押します + + ゴーレムは、重ねたブロックの一番上にカボチャをおいて完成します - - {*B*} - 持ち物に戻るには {*CONTROLLER_VK_X*} を押します + + スノー ゴーレムは、雪ブロックを 2 つ重ね、その上にカボチャをのせて完成します。作った人の敵に、雪玉を投げます - - {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替えて、作りたいアイテムのグループを選択し、{*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選択します + + 野生のオオカミは、骨を与えることで手なずけることができます。オオカミを手なずけると周りにハートマークが現れます。手なずけたオオカミは、座らせていないときはプレイヤーにつき従い守ってくれます - - 工作ウィンドウには、新しいアイテムを作るのに必要なアイテムが表示されます。{*CONTROLLER_VK_A*} を押すとアイテムが作られ、持ち物に追加されます + + 動物の繁殖のチュートリアルを完了しました - - 作業台を使うと、より多くの種類のアイテムを作れるようになります。作業台での工作も普通の工作と変わりません。ですが作業スペースが広い分、より多くの材料を組み合わせてアイテムを作ることができます + + このエリアには、スノー ゴーレムやアイアン ゴーレムを作るためのカボチャやブロックがあります - - 工作画面の右下には、持ち物が表示されます。さらに、選択しているアイテムの説明と、それを作るのに必要な材料も表示されます + + 電気の源を配置する位置や向きで、周囲のブロックへの効果が変わります。たとえば、ブロックに設置されたレッドストーンのたいまつは、そのブロックに電気が送られると消えます - - 選択しているアイテムの説明が表示されています。説明から、そのアイテムが何に使えるかが分かります + + 大釜が空になったら、水バケツを使って水を溜めてください - - 選択したアイテムを作るのに必要なアイテムのリストです + + 調合台を使って耐火ポーションを作りましょう。水のビン、暗黒茸とマグマクリームを用意してください - - 集めた木を使って、木の板を作ることができます。作るには、木の板のアイコンを選んでから {*CONTROLLER_VK_A*} を押してください{*PlanksIcon*} - - - これで 作業台が完成です! ゲームの世界に置いて、いろいろなアイテムを作れるようにしましょう。{*B*} - 工作画面から出るには {*CONTROLLER_VK_B*} を押します - - - 作るアイテムのグループを切り替えるには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} を使います。道具のグループを選択しましょう{*ToolsIcon*} - - - 作るアイテムのグループを切り替えるには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} を使います。建物のグループを選択しましょう{*StructuresIcon*} - - - 作るアイテムを変えるには {*CONTROLLER_MENU_NAVIGATE*} を使います。アイテムによっては、使う材料によって、できる物が変わります。それでは木のシャベルを選びましょう{*WoodenShovelIcon*} - - - 工作にはいくつもの工程があります。木の板が何枚か手元にあるので、さらにいろいろなアイテムを作れます。作るアイテムは {*CONTROLLER_MENU_NAVIGATE*} で変更できます。それでは作業台を選びましょう{*CraftingTableIcon*} - - - 道具が完成しました。順調です。これで様々な材料をさらに効率よく集めることができます。{*B*} - 工作画面を閉じるには {*CONTROLLER_VK_B*} を押してください - - - 一部のアイテムは作業台ではなく、かまどで作ります。それではかまどを作りましょう{*FurnaceIcon*} - - - 完成したかまどをゲームの世界に置きましょう。小屋の中に置くとよいかもしれません。{*B*} - 工作画面を閉じるには {*CONTROLLER_VK_B*} を押してください - - - これがかまどの画面です。かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます - - - {*B*} - かまどの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - かまどの説明を飛ばす: {*CONTROLLER_VK_B*} - - - かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。完成したアイテムは右のスロットに入ります - - - 木でできているアイテムの多くが燃料として使えますが、種類によって燃える時間が異なります。さらに木以外にも燃料として使えるアイテムがあります - - - アイテムの加工が終わると、その完成したアイテムを持ち物へ移動できます。様々な材料を使って、何が出来上がるのかいろいろ実験してみましょう - - - 木を材料に使うと、木炭が出来上がります。かまどに燃料を入れ、材料を入れる所に木を入れてください。木炭が出来上がるには少し時間がかるので、その間は他のことをしながら、時々進み具合を確かめに戻って来ましょう - - - 木炭は燃料として使えます。棒と組み合わせると、たいまつになります - - - 材料を入れる所に砂を入れると、ガラスを作ることができます。小屋の窓用にガラスを作ってみましょう - - - これが調合の画面です。さまざまな効果を発揮するポーションを作ることができます - - - {*B*} - 調合台の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 調合台の説明を飛ばす: {*CONTROLLER_VK_B*} - - - 調合を行うには、上の枠に材料を入れ、下の枠にポーションまたは水のビンを入れます (一度に 3 つまで調合可能)。正しい組み合わせの材料が置かれると調合が始まり、少し待てばポーションの出来上がりです - - - ポーションの調合にはまず水のビンが必要です。また、ほとんどのポーションは暗黒茸から不完全なポーションを作るところから始め、完成させるには少なくともあと 1 種類の材料を必要とします - - - ポーションを作ったら、その効果を変えることができます。レッドストーンの粉を加えると効果の持続時間が延長され、光石の粉を加えると効果がより強くなります - - - 発酵したクモの目を加えると、ポーションが腐敗して効果が反転します。また、火薬を加えるとポーションがスプラッシュポーションになり、投げると落ちた場所の周囲に効果を発揮するようになります - - - まず暗黒茸を水のビンに加え、それからマグマクリームを足すことで耐火のポーションを作りましょう - - - 調合画面を閉じるには {*CONTROLLER_VK_B*} を押します - - - ここには調合台、大釜と調合に必要なアイテムが詰まったチェストがあります. + + ポーションを使うには、ポーション手に持って {*CONTROLLER_ACTION_USE*} を押します。普通のポーションは飲んだ本人に効果を発揮します。スプラッシュポーションの場合は、投げて落ちた所の周囲にいるクリーチャーに効果を発揮します + スプラッシュポーションは普通のポーションに火薬を混ぜ合わせると作れます {*B*} @@ -3003,19 +881,18 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち 水の入った大釜か水のブロックからガラスビンに水を移します。水源にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押してガラスビンに水を詰めてください - - 大釜が空になったら、水バケツを使って水を溜めてください - - - 調合台を使って耐火ポーションを作りましょう。水のビン、暗黒茸とマグマクリームを用意してください - - - ポーションを使うには、ポーション手に持って {*CONTROLLER_ACTION_USE*} を押します。普通のポーションは飲んだ本人に効果を発揮します。スプラッシュポーションの場合は、投げて落ちた所の周囲にいるクリーチャーに効果を発揮します - スプラッシュポーションは普通のポーションに火薬を混ぜ合わせると作れます - 耐火ポーションを自分に使ってみましょう + + アイテムをエンチャントするには、まずアイテムをエンチャントの枠に入れてください。武器や防具、一部の道具にエンチャントすることで、ダメージ耐性を上げたり、採掘量を増やしたりなどの特別なボーナスを付加できます + + + エンチャントの枠にアイテムを入れると、右側のボタンにランダムなエンチャントが表示されます + + + ボタンに表示される数値はそのエンチャントを行うのに必要な経験値を表します。経験値が足りない場合、使えないボタンは無効になります + 火と溶岩に対する耐性が上がりました。これまで行けなかった場所にも行けるので試してみましょう @@ -3027,80 +904,53 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち エンチャント画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} エンチャント画面の説明を飛ばす: {*CONTROLLER_VK_B*} - - アイテムをエンチャントするには、まずアイテムをエンチャントの枠に入れてください。武器や防具、一部の道具にエンチャントすることで、ダメージ耐性を上げたり、採掘量を増やしたりなどの特別なボーナスを付加できます + + ここには調合台、大釜と調合に必要なアイテムが詰まったチェストがあります. - - エンチャントの枠にアイテムを入れると、右側のボタンにランダムなエンチャントが表示されます + + 木炭は燃料として使えます。棒と組み合わせると、たいまつになります - - ボタンに表示される数値はそのエンチャントを行うのに必要な経験値を表します。経験値が足りない場合、使えないボタンは無効になります + + 材料を入れる所に砂を入れると、ガラスを作ることができます。小屋の窓用にガラスを作ってみましょう + + + これが調合の画面です。さまざまな効果を発揮するポーションを作ることができます + + + 木でできているアイテムの多くが燃料として使えますが、種類によって燃える時間が異なります。さらに木以外にも燃料として使えるアイテムがあります + + + アイテムの加工が終わると、その完成したアイテムを持ち物へ移動できます。様々な材料を使って、何が出来上がるのかいろいろ実験してみましょう + + + 木を材料に使うと、木炭が出来上がります。かまどに燃料を入れ、材料を入れる所に木を入れてください。木炭が出来上がるには少し時間がかるので、その間は他のことをしながら、時々進み具合を確かめに戻って来ましょう + + + {*B*} + 調合台の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合台の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 発酵したクモの目を加えると、ポーションが腐敗して効果が反転します。また、火薬を加えるとポーションがスプラッシュポーションになり、投げると落ちた場所の周囲に効果を発揮するようになります + + + まず暗黒茸を水のビンに加え、それからマグマクリームを足すことで耐火のポーションを作りましょう + + + 調合画面を閉じるには {*CONTROLLER_VK_B*} を押します + + + 調合を行うには、上の枠に材料を入れ、下の枠にポーションまたは水のビンを入れます (一度に 3 つまで調合可能)。正しい組み合わせの材料が置かれると調合が始まり、少し待てばポーションの出来上がりです + + + ポーションの調合にはまず水のビンが必要です。また、ほとんどのポーションは暗黒茸から不完全なポーションを作るところから始め、完成させるには少なくともあと 1 種類の材料を必要とします + + + ポーションを作ったら、その効果を変えることができます。レッドストーンの粉を加えると効果の持続時間が延長され、光石の粉を加えると効果がより強くなります エンチャントを行うには、エンチャントを選んで {*CONTROLLER_VK_A*} を押してください。エンチャントのコストに応じて経験値レベルが下がります - - エンチャントは基本的にランダムですが、一部の強力なエンチャントは経験値レベルが高く、エンチャントテーブルの周囲にテーブルを強化する本棚がたくさん設置されていないと表示されません - - - ここにはエンチャントテーブルと、エンチャントについて学ぶためのいくつかのアイテムがあります - - - {*B*} - エンチャントの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - エンチャントの説明を飛ばす: {*CONTROLLER_VK_B*} - - - エンチャントテーブルを使うと、採掘量を増やしたり、武器や防具、一部の道具のダメージ耐性を上げたりなどの特別なボーナスを付加できます - - - エンチャントテーブルの周囲に本棚を置くと、テーブルが強化されてより高レベルのエンチャントができるようになります - - - エンチャントは経験値を消費します。経験値は、モンスターや動物を倒したり、採掘したり、動物を繁殖させたり、釣りをしたり、かまどを使った精錬や料理などで生成される経験値オーブを集めることで、貯まっていきます - - - エンチャントのビンを使って経験値を貯めることもできます。投げると落ちた場所に経験値オーブが出現するので、集めて経験値を貯めましょう - - - ここにあるチェストにはエンチャントされたアイテムや、エンチャントのビンのほか、エンチャントを試してみることのできるアイテムがあります - - - 今トロッコに乗っています。トロッコから降りるには、ポインターをトロッコに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*MinecartIcon*} - - - {*B*} - トロッコの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - トロッコの説明を飛ばす: {*CONTROLLER_VK_B*} - - - トロッコはレールの上を走ります。かまどを乗せた動力つきのトロッコや、チェストがついたトロッコを作ることもできます - {*RailIcon*} - - - トロッコのスピードを上げるために、レッドストーンのたいまつや回路から動力を得る加速レールを作ることができます。これはスイッチやレバー、重量感知板などを組み合わせた、複雑な装置になります - {*PoweredRailIcon*} - - - 今ボートに乗っています。ボートから降りるには、ポインターをボートに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*BoatIcon*} - - - {*B*} - ボートの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - ボートの説明を飛ばす: {*CONTROLLER_VK_B*} - - - ボートを使えば、水上を速く移動することができます。舵を取るには {*CONTROLLER_ACTION_MOVE*} と {*CONTROLLER_ACTION_LOOK*} を使います - {*BoatIcon*} - - - 釣り竿を手にしました。使うには {*CONTROLLER_ACTION_USE*} を押します{*FishingRodIcon*} - - - {*B*} - 魚釣りの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 魚釣りの説明を飛ばす: {*CONTROLLER_VK_B*} - 釣りを始めるには {*CONTROLLER_ACTION_USE*} を押します。リールを巻き上げるときも {*CONTROLLER_ACTION_USE*} を押してください {*FishingRodIcon*} @@ -3112,10 +962,33 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち 釣り竿は 様々な道具と組み合わせることができますが、その用途は比較的限られています。しかし魚を釣る以外のこともできます。釣り竿を使って他に何が釣れるのか、どんなことができるのか、いろいろ試してみましょう {*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*} @@ -3129,201 +1002,278 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち ゲーム内に他のプレイヤーがいる場合、眠るためには全員が同時にベッドに入っていなければなりません {*ICON*}355{*/ICON*} - - このエリアには、レッドストーンとピストンの回路、回路に使うアイテムの入ったチェストがあります - - + {*B*} - レッドストーン回路とピストンの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - レッドストーン回路とピストンの説明を飛ばす: {*CONTROLLER_VK_B*} + ボートの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ボートの説明を飛ばす: {*CONTROLLER_VK_B*} - - レバー、ボタン、重量感知版、レッドストーンのたいまつは、起動したいアイテムに直接とりつけたり、レッドストーンの粉でつなげることで、電気を送ることができます + + エンチャントテーブルを使うと、採掘量を増やしたり、武器や防具、一部の道具のダメージ耐性を上げたりなどの特別なボーナスを付加できます - - 電気の源を配置する位置や向きで、周囲のブロックへの効果が変わります。たとえば、ブロックに設置されたレッドストーンのたいまつは、そのブロックに電気が送られると消えます + + エンチャントテーブルの周囲に本棚を置くと、テーブルが強化されてより高レベルのエンチャントができるようになります - - レッドストーンの粉は、鉄、ダイヤモンド、金のツルハシでレッドストーン鉱石を掘ると手に入ります。レッドストーンの粉を使って電気を伝えることができます。ただし、伝えられるのは距離にして 15 ブロック分、上下には 1 ブロック分までとなります - {*ICON*}331{*/ICON*} + + エンチャントは経験値を消費します。経験値は、モンスターや動物を倒したり、採掘したり、動物を繁殖させたり、釣りをしたり、かまどを使った精錬や料理などで生成される経験値オーブを集めることで、貯まっていきます - - レッドストーン反復装置で電気の届く距離を伸ばしたり、回路を遅延させたりすることができます - {*ICON*}356{*/ICON*} + + エンチャントは基本的にランダムですが、一部の強力なエンチャントは経験値レベルが高く、エンチャントテーブルの周囲にテーブルを強化する本棚がたくさん設置されていないと表示されません - - ピストンは電気が送られると伸びて、最大 12 個のブロックを押します。吸着ピストンであれば、戻るときに大半の種類のブロックを 1 つ引き寄せることができます - {*ICON*}33{*/ICON*} + + ここにはエンチャントテーブルと、エンチャントについて学ぶためのいくつかのアイテムがあります - - このエリアには、ピストン付きの回路を作るためのアイテムを入れたチェストがあります。すでにある回路を改造したり、1 から回路を作成したりしてみてください。チュートリアル エリアの外には、さらに多くの見本があります - - - このエリアには、暗黒界へのポータルが存在します! - - + {*B*} - ポータルと暗黒界の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - ポータルと暗黒界の説明を飛ばす: {*CONTROLLER_VK_B*} + エンチャントの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + エンチャントの説明を飛ばす: {*CONTROLLER_VK_B*} - - ポータルは、黒曜石のブロックで横 4 ブロック、縦 5 ブロックの枠を作成することで完成します。角のブロックは必要ありません。 + + エンチャントのビンを使って経験値を貯めることもできます。投げると落ちた場所に経験値オーブが出現するので、集めて経験値を貯めましょう - - ポータルを起動するには、火打ち石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します + + トロッコはレールの上を走ります。かまどを乗せた動力つきのトロッコや、チェストがついたトロッコを作ることもできます + {*RailIcon*} - - ポータルを使用するには、ポータルの中に立ちましょう。画面が紫色に変わり、音がし始め、しばらくすると、別世界へテレポートできます + + トロッコのスピードを上げるために、レッドストーンのたいまつや回路から動力を得る加速レールを作ることができます。これはスイッチやレバー、重量感知板などを組み合わせた、複雑な装置になります + {*PoweredRailIcon*} - - 暗黒界はあちこちで溶岩が噴き出す危険な場所ですが、暗黒石や光石を手に入れるには最適な場所です。暗黒石は火をつけると、消えることなく燃え続け、光石は、光を発生させます + + 今ボートに乗っています。ボートから降りるには、ポインターをボートに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*BoatIcon*} - - 暗黒界をうまく利用して地上界を高速移動することができます。暗黒界での 1 ブロックの距離は、地上界での 3 ブロックに相当します + + ここにあるチェストにはエンチャントされたアイテムや、エンチャントのビンのほか、エンチャントを試してみることのできるアイテムがあります - - クリエイティブ モードになりました + + 今トロッコに乗っています。トロッコから降りるには、ポインターをトロッコに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*MinecartIcon*} - + {*B*} - クリエイティブ モードの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - クリエイティブ モードの説明を飛ばす: {*CONTROLLER_VK_B*} - - - クリエイティブ モードではほとんどのアイテムやブロックが無限に使えます。また、道具がなくても 1 回クリックするだけでブロックが破壊できるほか、攻撃されてもダメージを受けなくなり、飛行も可能です - - - クリエイティブ モードの持ち物を開くには {*CONTROLLER_ACTION_CRAFTING*} を押してください - - - 続けるには穴の反対側へ移動してください - - - クリエイティブ モードのチュートリアルを完了しました - - - このエリアには、畑があります。畑では、食べ物などの繰り返し生産できる資源を作り出すことができます - - - {*B*} - 農作業の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 農作業の説明を飛ばす: {*CONTROLLER_VK_B*} - - - 小麦、カボチャ、スイカは、種から育てます。小麦の種は、背の高い草を切ったり、小麦を栽培することで手に入れることができます。カボチャの種やスイカの種は、それぞれ、カボチャやスイカから入手します - - - 種をまく前に、くわをつかって土のブロックを耕地に変える必要があります。近くに水源や光源があり、十分な水と光が供給されていると作物が早く成長します - - - 小麦は何段階かに変化しながら成長していき、色が濃くなると収穫できるようになります。{*ICON*}59:7{*/ICON*} - - - カボチャとスイカの場合は、茎が太くなってきたら、種をまいた場所の隣に実ができるためのブロックが必要になります - - - サトウキビは、水ブロックと隣接する、草、土、砂のブロックに植える必要があります。また、サトウキビのブロックは中ほどを収穫すると、上にあるブロックもすべて収穫されます。{*ICON*}83{*/ICON*} - - - サボテンは砂に植える必要があり、成長すると 3 ブロックの高さになります。サトウキビと同様、下のブロックを収穫すると、上にあるブロックもすべて収穫できます。{*ICON*}81{*/ICON*} - - - きのこは薄暗いエリアに植えましょう。隣接する薄暗いブロックに広がっていきます。{*ICON*}39{*/ICON*} - - - 骨粉は作物を最大まで成長させたり、きのこを巨大なきのこに成長させることができます。{*ICON*}351:15{*/ICON*} - - - 農作業のチュートリアルを完了しました - - - このエリアでは動物が飼育されています。動物を飼育して子供を増やすことができます - - - {*B*} - 動物の繁殖の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 動物の繁殖の説明を飛ばす: {*CONTROLLER_VK_B*} - - - 動物を繁殖させるには、動物にあった餌を与えて、動物たちを「求愛モード」にしてやる必要があります - - - 牛、ムーシュルーム、羊には小麦を、豚にはニンジンを、ニワトリには小麦の種または暗黒茸、オオカミには肉を与えましょう。すると、近くにいる求愛モードの仲間を探し始めます - - - ともに求愛モードの同種の動物が出会うと、少しの間キスをして、動物の赤ちゃんが誕生します。赤ちゃんは、成長するまでは、両親の後ろをついて回ります - - - 一度求愛モードになった動物は、5 分間は再び求愛モードになることはありません - - - 手にえさを持っていると、あなたの後ろをついてくる動物もいます。この習性を利用すれば、簡単に動物を一か所に集めことができるでしょう。{*ICON*}296{*/ICON*} - - - 野生のオオカミは、骨を与えることで手なずけることができます。オオカミを手なずけると周りにハートマークが現れます。手なずけたオオカミは、座らせていないときはプレイヤーにつき従い守ってくれます - - - 動物の繁殖のチュートリアルを完了しました - - - このエリアには、スノー ゴーレムやアイアン ゴーレムを作るためのカボチャやブロックがあります - - - {*B*} - ゴーレムの説明を続ける{*CONTROLLER_VK_A*}{*B*} - ゴーレムの説明を飛ばす{*CONTROLLER_VK_B*} - - - ゴーレムは、重ねたブロックの一番上にカボチャをおいて完成します - - - スノー ゴーレムは、雪ブロックを 2 つ重ね、その上にカボチャをのせて完成します。作った人の敵に、雪玉を投げます - - - アイアン ゴーレムは、鉄のブロック 4 つを T 字に並べ、中央にカボチャをのせて完成します。作った人の敵を攻撃します - - - アイアン ゴーレムは村に自然に現れて村人を守ることもあります。村人を攻撃すると、このアイアン ゴーレムが反撃します - - - チュートリアルを終えるまで、このエリアから出ることはできません - - - 材料ごとに適した道具があります。土や砂などの柔らかいものを掘る場合はシャベルを使うのがよいでしょう - - - 材料ごとに適した道具があります。木の幹を切り出す場合は斧を使うのがよいでしょう - - - 材料ごとに適した道具があります。石や鉱石を掘り出す場合はツルハシを使うのがよいでしょう。特定の種類のブロックを掘るためには、さらに優れた材料を使ってツルハシを作る必要があるかもしれません - - - 特定の道具は敵を攻撃するのに向いています。剣を使うと良いでしょう - - - ヒント: 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります - - - 道具は使っていると、少しずつ壊れていきます。使うたびに少しずつ損傷していき、最後は完全に壊れます。アイテムの下にあるゲージで、現在の状態が分かります - - - 上に向かって泳ぐには {*CONTROLLER_ACTION_JUMP*} を押し続けます - - - このエリアではレールの上をトロッコが走っています。トロッコに乗るには、ポインターをトロッコに合わせて {*CONTROLLER_ACTION_USE*} を押します。トロッコを動かすには、ボタンにポインターを合わせて {*CONTROLLER_ACTION_USE*} を押しましょう - - - 川のそばにあるチェストの中に、ボートが入っています。ボートを使うには、ポインターを水に合わせて {*CONTROLLER_ACTION_USE*} を押します。ボートに乗るにはポインターをボートに合わせて {*CONTROLLER_ACTION_USE*} を押しましょう - - - 池のそばにあるチェストの中に、釣り竿が入っています。使うには、チェストから釣り竿を出してから、手に持って使うアイテムに選んでください - - - このピストン装置は、自動建設される橋です。ボタンを押して、装置の動きを調べてみましょう + トロッコの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + トロッコの説明を飛ばす: {*CONTROLLER_VK_B*} アイテムを選択した状態で、持ち物画面の外へポインターを動かすと、アイテムを落とすことができます + + 読む + + + 掛ける + + + 投げる + + + 開く + + + 音程を変える + + + 起爆する + + + 植える + + + 完全版を購入 + + + セーブデータを削除 + + + 削除 + + + 耕す + + + 収穫する + + + 続ける + + + 泳ぐ + + + 叩く + + + 乳搾り + + + 集める + + + 空にする + + + 鞍を置く + + + 置く + + + 食べる + + + 乗る + + + 船に乗る + + + 育てる + + + 眠る + + + 起きる + + + 聞く + + + オプション + + + 防具を移動 + + + 武器を移動 + + + 装備 + + + 材料を移動 + + + 燃料を移動 + + + 道具を移動 + + + 引く + + + 上へ + + + 下へ + + + 求愛モード + + + 放つ + + + 特権 + + + ブロック + + + クリエイティブ + + + アクセスを禁止 + + + スキンを決定 + + + 火をつける + + + フレンドを招待 + + + 決定 + + + 毛を刈る + + + 選択 + + + 再インストール + + + セーブのオプション + + + コマンドを実行 + + + 完全版をインストール + + + お試し版をインストール + + + インストール + + + 取り出す + + + オンライン ゲーム リストを更新 + + + パーティー ゲーム + + + すべてのゲーム + + + 終了 + + + キャンセル + + + 参加をキャンセル + + + グループを切り替え + + + 工作 + + + 作る + + + 取る/置く + + + 持ち物を見る + + + 説明を見る + + + 材料を見る + + + 戻る + + + お忘れなく: + + + + + + バージョン アップにより、チュートリアルの新エリアを始めとする新機能が追加されました + このアイテムを作るために必要な材料が揃っていません。左下にあるボックスの中に表示されているのが、必要な材料です @@ -3333,28 +1283,10 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち {*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*} @@ -3366,102 +1298,18 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち 使う - - 戻る + + このエリアで、釣り竿、ボート、ピストン、レッドストーンなどの使い方を練習しましょう - - 終了 + + このエリアの外では、建物、畑、トロッコ、エンチャント、調合、取引、鍛冶などがあなたを待っています! - - キャンセル - - - 参加をキャンセル - - - オンライン ゲーム リストを更新 - - - パーティー ゲーム - - - すべてのゲーム - - - グループを切り替え - - - 持ち物を見る - - - 説明を見る - - - 材料を見る - - - 工作 - - - 作る - - - 取る/置く + + 空腹ゲージが減りすぎて、HP が回復できません。 取る - - すべて取る - - - 半分取る - - - 置く - - - すべて置く - - - 1 つ置く - - - 落とす - - - すべて落とす - - - 1 つ落とす - - - 入れ替え - - - クイック移動 - - - クイック選択バーを空にする - - - これは何? - - - Facebook に公開 - - - フィルターを変更 - - - フレンド登録の依頼を送る - - - 次へ - - - 前へ - 次へ @@ -3471,18 +1319,18 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち プレイヤーを追放 + + フレンド登録の依頼を送る + + + 次へ + + + 前へ + 染める - - 掘る - - - えさを与える - - - 手なずける - 回復する @@ -3492,1066 +1340,780 @@ Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ち ついてこい - - 取り出す + + 掘る - - 空にする + + えさを与える - - 鞍を置く + + 手なずける - + + フィルターを変更 + + + すべて置く + + + 1 つ置く + + + 落とす + + + すべて取る + + + 半分取る + + 置く - - 叩く + + すべて落とす - - 乳搾り + + クイック選択バーを空にする - - 集める + + これは何? - - 食べる + + Facebook に公開 - - 眠る + + 1 つ落とす - - 起きる + + 入れ替え - - 聞く - - - 乗る - - - 船に乗る - - - 育てる - - - 泳ぐ - - - 開く - - - 音程を変える - - - 起爆する - - - 読む - - - 掛ける - - - 投げる - - - 植える - - - 耕す - - - 収穫する - - - 続ける - - - 完全版を購入 - - - セーブデータを削除 - - - 削除 - - - オプション - - - フレンドを招待 - - - 決定 - - - 毛を刈る - - - アクセスを禁止 - - - スキンを決定 - - - 火をつける - - - 選択 - - - 完全版をインストール - - - お試し版をインストール - - - インストール - - - 再インストール - - - セーブのオプション - - - コマンドを実行 - - - クリエイティブ - - - 材料を移動 - - - 燃料を移動 - - - 道具を移動 - - - 防具を移動 - - - 武器を移動 - - - 装備 - - - 引く - - - 放つ - - - 特権 - - - ブロック - - - 上へ - - - 下へ - - - 求愛モード - - - 飲む - - - 回転する - - - 隠す - - - すべての枠を空にする - - - OK - - - キャンセル - - - Minecraft ストア - - - 本当に現在プレイしているゲームを終了して、新しいゲームに参加してもよろしいですか? セーブしていない途中経過は失われてしまいます - - - ゲームを終了 - - - ゲームをセーブ - - - セーブせずに終了 - - - 以前のこの世界のセーブ データを、現在のデータで上書きしてもよろしいですか? - - - 本当にセーブせずメイン メニューに戻ってもよろしいですか? この世界での途中経過は失われてしまいます - - - ゲームを始める - - - セーブ データの破損 - - - このセーブ データは破損しています。削除しますか? - - - 現在のゲームを終了し、すべてのプレイヤーとの接続を切断してメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます - - - セーブして終了 - - - セーブせずに終了 - - - 本当にメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます - - - 本当にメイン メニューに戻ってもよろしいですか? ここまでの途中経過は失われてしまいます - - - 新しい世界 - - - チュートリアルをプレイ - - - チュートリアル - - - 新しい世界に名前をつける - - - 新しい世界の名前を入力してください - - - 世界生成のシードを入力してください - - - セーブした世界をロードする - - - START を押してゲームに参加 - - - ゲームを終了 - - - エラーが起こりました。メイン メニューに戻ります - - - 接続に失敗しました - - - 接続が切断されました - - - サーバーとの接続が切断されました。メイン メニューに戻ります - - - サーバーにより切断されました - - - ゲームから追放されました - - - 空を飛んだため、ゲームから追放されました - - - 接続に時間がかかりすぎています - - - サーバーが満員です - - - ホストがゲームを終了しました - - - この世界でプレイ中のフレンドがいないため、この世界には入れません - - - 以前にホストにより追放されているため、この世界には入れません - - - 相手のプレイヤーのゲームのバージョンが古いため、ゲームに参加できません - - - 相手のプレイヤーのゲームのバージョンが新しいため、ゲームに参加できません - - - 新しい世界 - - - アワードをアンロックしました! - - - おめでとうございます! Minecraft の Steve のゲーマー アイコンを獲得しました! - - - おめでとうございます! クリーパーのゲーマー アイコンを獲得しました! - - - 完全版を購入 - - - 今はお試し版をプレイ中です。データをセーブするためには完全版を購入いただく必要があります -今すぐ完全版を購入しますか? - - - お待ちください - - - 結果なし - - - フィルター: - - - フレンド - - - マイスコア - - - 通算 - - - 登録数: - - - ランク - - - セーブレベル - - - 詳細を設定中... - - - 最終処理中... - - - 地形を構築中 - - - 世界のシミュレート中 - - - サーバーを初期化中 - - - 復活地点を作成中 - - - 復活地点を読み込み中 - - - 暗黒界に入る - - - 暗黒界を出る - - - 復活中 - - - レベルを生成中 - - - レベルを読み込み中 - - - プレイヤーをセーブ中 - - - ホストサーバーに接続中 - - - 地形をダウンロード中 - - - オフライン ゲームに切り替える - - - ホストがゲームをセーブしています。しばらくお待ちください - - - 果ての世界に入る - - - 果ての世界を出る - - - このベッドは使用中です - - - 夜の間しか眠ることはできません - - - %s は寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります - - - 最後に使用したベッドがなくなっているか、アクセスできません - - - モンスターが近くにいる時に休むのは危険です - - - あなたは寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります - - - 道具と武器 - - - 武器 - - - 食べ物 - - - 建物 - - - 防具 - - - 機械 - - - 乗り物 - - - 飾り - - - 建設用ブロック - - - レッドストーンと乗り物 - - - その他 - - - 調合 - - - 道具、武器、防具 - - - 材料 - - - サインアウト - - - 難易度 - - - BGM - - - 効果音 - - - ガンマ - - - ゲームでの感度 - - - メニューでの感度 - - - ピース - - - イージー - - - ノーマル - - - ハード - - - プレイヤーの HP は自動で回復し、敵もいません - - - 敵は出現しますが、ノーマル モードほど攻撃力が高くありません - - - 敵が出現し、その攻撃力は普通です - - - 敵が出現し、その攻撃力がアップします。また、一瞬近づいただけでもクリーパーが爆発するようになるので注意しましょう - - - お試し版タイムアウト - - - 完全版 - - - 既に満員のため、ゲームに参加できませんでした - - - 看板の文字を入力 - - - 看板の文字を入力してください - - - タイトルを入力 - - - 投稿のタイトルを入力してください - - - キャプションを入力 - - - 投稿のキャプションを入力してください - - - 説明を入力 - - - 投稿の説明を入力してください - - - 持ち物 - - - 材料 - - - 調合台 - - - チェスト - - - エンチャント - - - かまど - - - 材料 - - - 燃料 - - - 分配装置 - - - 現在、このタイプのダウンロードできるコンテンツはありません - - - %s が世界にやってきました - - - %s が世界を去りました - - - %s が追放されました - - - 本当にこのセーブデータを削除してもよろしいですか? - - - 承認待ち - - - 検閲済み - - - プレイ中: - - - 設定を元に戻す - - - 本当に設定を最初の状態に戻してもよろしいですか? - - - ロード エラー - - - %s のゲーム - - - ななしのホストのゲーム - - - ゲストがサインアウトしました - - - ゲスト プレイヤーの 1 人がサインアウトしたため、すべてのゲスト プレイヤーがゲームから取り除かれました - - - サインイン - - - サインインしていません。このゲームをプレイするにはサインインが必要です。今すぐサインインしますか? - - - マルチプレイが制限されています - - - ゲームを作成できません - - - 自動選択されました - - - デフォルト スキン - - - お気に入りのスキン - - - アクセスが禁止されています - - - アクセス禁止リストに登録されている世界に参加しようとしています。 -このまま参加すると、この世界はアクセス禁止リストから外されます - - - アクセス禁止にしますか? - - - この世界をアクセス禁止リストに登録しますか? -OK を選択すると、この世界でのプレイを終了します - - - アクセス禁止を解除 - - - オートセーブの間隔 - - - オートセーブの間隔: オフ - - - - - - ここには置けません - - - 復活したプレイヤーにダメージを与える可能性があるため、復活地点の近くに溶岩を置くことはできません - - - インターフェースの不透明度 - - - オートセーブを実行します - - - 画面表示サイズ - - - 画面表示サイズ (画面分割) - - - シード - - - スキン パックのロック解除 - - - 選択したスキンを使用するには、スキン パックをロック解除してください。 -今すぐスキン パックをロック解除しますか? - - - テクスチャ パックのロック解除 - - - このテクスチャ パックを世界で使用するには、これをロック解除してください。 -今すぐテクスチャ パックをロック解除しますか? - - - テクスチャ パック試用版 - - - 現在お使いのテクスチャ パックは試用版です。完全版を利用しない場合、この世界はセーブできません。 -テクスチャ パックの完全版を購入しますか? - - - テクスチャ パックを持っていません - - - 完全版を購入 - - - 試用版をダウンロード - - - 完全版をダウンロード - - - この世界は、持っていないテクスチャ パック、またはマッシュアップ パックが使用されています。 -今すぐこのテクスチャ パック、またはマッシュアップ パックをインストールしますか? - - - 試用版を購入 - - - 完全版を購入 - - - プレイヤーを追放 - - - このプレイヤーをゲームから追放しますか? 追放されたプレイヤーは、この世界を再スタートするまで世界に入れなくなります - - - ゲーマー アイコン パック - - - テーマ - - - スキン パック - - - フレンドのフレンドを許可 - - - この世界への参加は、ホスト プレイヤーのフレンドのみに制限されています - - - 世界に入れません - - - 選択中 - - - 選択したスキン: - - - 破損したダウンロード コンテンツ - - - このダウンロード コンテンツは破損しているため使用できません。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください - - - 破損して使用できないダウンロード コンテンツがあります。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください - - - ゲームモードを変更しました - - - 世界の名前を変更する - - - 世界の新しい名前を入力してください - - - ゲームモード: サバイバル - - - ゲームモード: クリエイティブ - - - サバイバル - - - クリエイティブ - - - サバイバル モードで作成 - - - クリエイティブ モードで作成 - - - 雲を表示する - - - このセーブデータに対する操作を選んでください - - - セーブデータの名前を変更する - - - %d 秒後にオートセーブを開始します... - - - オン - - - オフ - - - ノーマル - - - スーパーフラット - - - 有効にすると、オンラインのゲームになります - - - 有効にすると、招待されたプレイヤーしか参加できません - - - 有効にすると、フレンド リストのフレンドのみゲームに参加できます - - - 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります。(サバイバル モードのみ) - - - 無効にすると、このゲームに参加したプレイヤーは許可をもらわないかぎり建設や採掘ができません - - - 有効にすると、火は近くの可燃性ブロックに燃え広がります - - - 有効にすると、TNT 火薬を起爆すると爆発します - - - 有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です - - - 有効にすると、村や要塞などの建物が世界に生成されるようになります - - - 有効にすると、地上界および暗黒界に、まったく平らな世界を生成します - - - 有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します + + クイック移動 スキン パック - - テーマ + + 赤のステンドグラスの板 - - ゲーマーアイコン + + 緑のステンドグラスの板 - - アバター アイテム + + 茶色のステンドグラスの板 - - テクスチャ パック + + 白のステンドグラス - - マッシュアップ パック + + ステンドグラスの板 - - {*PLAYER*} は火の中で力尽きた + + 黒のステンドグラスの板 - - {*PLAYER*} は火によって力尽きた + + 青のステンドグラスの板 - - {*PLAYER*} は溶岩に飲み込まれた + + 灰色のステンドグラスの板 - - {*PLAYER*} は壁に飲み込まれた + + ピンクのステンドグラスの板 - - {*PLAYER*} は溺れて力尽きた + + 黄緑のステンドグラスの板 - - {*PLAYER*} は飢えて力尽きた + + 紫のステンドグラスの板 - - {*PLAYER*} は刺されて力尽きた + + 水色のステンドグラスの板 - - {*PLAYER*} は落下の衝撃で力尽きた + + 薄灰色のステンドグラスの板 - - {*PLAYER*} は世界の外へ落ちた + + オレンジのステンドグラス - - {*PLAYER*} は力尽きた + + 青のステンドグラス - - {*PLAYER*} は爆発した + + 紫のステンドグラス - - {*PLAYER*} は魔法により力尽きた + + 水色のステンドグラス - - {*PLAYER*}はエンダードラゴンのブレスで力尽きた + + 赤のステンドグラス - - {*PLAYER*} は {*SOURCE*} に倒された + + 緑のステンドグラス - - {*PLAYER*} は {*SOURCE*} に倒された + + 茶色のステンドグラス - - {*PLAYER*} は {*SOURCE*} に撃たれて力尽きた + + 薄灰色のステンドグラス - - {*PLAYER*} は {*SOURCE*} に火だるまにされた + + 黄色のステンドグラス - - {*PLAYER*} は {*SOURCE*} に叩き潰された + + 空色のステンドグラス - - {*PLAYER*} は {*SOURCE*} に倒された + + 赤紫のステンドグラス - - 岩盤の霧 + + 灰色のステンドグラス - - HUD の表示 + + ピンクのステンドグラス - - プレイヤーの手の表示 + + 黄緑のステンドグラス - - ゲームオーバー メッセージ + + 黄色のステンドグラスの板 - - キャラクターを動かす + + 薄灰色 - - カスタム スキン アニメーション + + 灰色 - - 採掘やアイテムの使用ができなくなりました + + ピンク - - 採掘やアイテムの使用ができるようになりました + + - - ブロックを設置できなくなりました + + - - ブロックを設置できるようになりました + + 水色 - - ドアとスイッチを使用できるようになりました + + 黄緑 - - ドアとスイッチを使用できなくなりました + + オレンジ - - チェストなどの入れ物を使用できるようになりました + + - - チェストなどの入れ物を使用できなくなりました + + カスタム - - 生き物を攻撃できなくなりました + + 黄色 - - 生き物を攻撃できるようになりました + + 空色 - - プレイヤーを攻撃できなくなりました + + 赤紫 - - プレイヤーを攻撃できるようになりました + + 茶色 - - 動物を攻撃できなくなりました + + 白のステンドグラスの板 - - 動物を攻撃できるようになりました + + 球体 (小) - - ホストオプションを変更できるようになりました + + 球体 (大) - - ホストオプションを変更できなくなりました + + 空色のステンドグラスの板 - - 飛行できるようになりました + + 赤紫のステンドグラスの板 - - 飛行できなくなりました + + オレンジのステンドグラスの板 - - 疲労無効になりました + + 星形 - - 疲労無効ではなくなりました + + - - 不可視になりました + + - - 不可視ではなくなりました + + - - 攻撃されてもダメージを受けなくなりました + + クリーパーの形 - - 攻撃されるとダメージを受けます + + 破裂 - - %d MSP + + 未知の形 - - エンダードラゴン + + 黒のステンドグラス - - %s は果ての世界に入りました + + 鉄の馬鎧 - - %s は果ての世界から出ました + + 金の馬鎧 - - {*C3*}この人が、例のプレイヤーか{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}のこと?{*EF*}{*B*}{*B*} -{*C3*}そう。気をつけろよ、もうずいぶんレベルが上がったみたいだ。僕らの考えは読まれているんだから{*EF*}{*B*}{*B*} -{*C2*}別にいいよ。僕らはゲームの一部だと思われてるんだろうし{*EF*}{*B*}{*B*} -{*C3*}僕はこのプレイヤー嫌いじゃないな。あきらめないで、たくさん遊んだじゃないか{*EF*}{*B*}{*B*} -{*C2*}僕らの思考が画面上の文字みたいに読まれてるね{*EF*}{*B*}{*B*} -{*C3*}ゲームという夢にのめり込んでいる時、プレイヤーは言葉を使っていろいろな物事を想像するらしい{*EF*}{*B*}{*B*} -{*C2*}言葉はとても柔軟で素晴らしいインターフェイスだね。その上、画面の外の現実を直視するより全然怖くない{*EF*}{*B*}{*B*} -{*C3*}文字で読めるようになる前には声を使ってたんだぞ。ゲームをしない人がゲームをする人たちを魔法使いとか賢者とか呼んで、悪魔の杖に乗って空を飛ぶ夢を見ていた頃の話だ{*EF*}{*B*}{*B*} -{*C2*}このプレイヤーは何の夢を見たんだろう?{*EF*}{*B*}{*B*} -{*C3*}陽の光と木の夢。それに火と水。夢を見ては、作る。夢を見ては、壊す。夢を見ては、狩る。時々狩られたりしたけど。あとは安全な場所の夢だ{*EF*}{*B*}{*B*} -{*C2*}ふーん、元祖インターフェイスか。100 万年も昔の物なのにまだちゃんと動く。でもプレイヤーは、画面の外の現実で、本当はどんなものを作ったんだろう?{*EF*}{*B*}{*B*} -{*C3*}それは、{*EF*}{*NOISE*}{*C3*} の檻の中で真実の世界を彫り上げるために、100 万の人と一緒に {*EF*}{*NOISE*}{*C3*} を作ったんだ。目的は {*EF*}{*NOISE*}{*C3*} だ。{*EF*}{*NOISE*}{*C3*} の中のことに過ぎないのに{*EF*}{*B*}{*B*} -{*C2*}これはプレイヤーには読めないね{*EF*}{*B*}{*B*} -{*C3*}そう、まだ最高レベルまで到達していないから。ゲームの中の短い夢じゃなくて、人生の長い夢を叶えなくてはいけない{*EF*}{*B*}{*B*} -{*C2*}プレイヤーは僕らの好意を知っているの? 宇宙は寛容だってことを?{*EF*}{*B*}{*B*} -{*C3*}おそらく。プレイヤーは宇宙の思いのノイズを聞いている{*EF*}{*B*}{*B*} -{*C2*}でもプレイヤーの長い夢の中には、時に悲しいこともある。夏が訪れず、黒い太陽の下で凍え、自分が作った悲しさを現実と思ってしまうことがある{*EF*}{*B*}{*B*} -{*C3*}だがその悲しさを外から癒すと、プレイヤーは壊れてしまう。悲しみはプレイヤー自身が乗り越えるもののひとつで、外から干渉できることではない{*EF*}{*B*}{*B*} -{*C2*}プレイヤーがあまりに夢に浸っていると、時々教えたくなるんだ。プレイヤーは現実に本当の世界を作り上げていることを。その存在が宇宙にとって大切であることを。もし本当の絆を持てない時は、恐くて口に出せないでいる言葉を言う手助けをしたくなる{*EF*}{*B*}{*B*} -{*C3*}おい、プレイヤーに読まれているぞ{*EF*}{*B*}{*B*} -{*C2*}プレイヤーのことなんかどうでもいい時もあるけど、教えてあげたい時もある。現実だと思っている世界は本当はただの {*EF*}{*NOISE*}{*C2*} で、しかも {*EF*}{*NOISE*}{*C2*} だけだってこと。プレイヤーは {*EF*}{*NOISE*}{*C2*} の中では {*EF*}{*NOISE*}{*C2*} なんだ。長い夢の中で知る現実はほんの一部でしかない{*EF*}{*B*}{*B*} -{*C3*}それでもプレイヤーはゲームを遊ぶんだ{*EF*}{*B*}{*B*} -{*C2*}だけど、真実を教えることは簡単じゃないか...{*EF*}{*B*}{*B*} -{*C3*}この夢の中では厳しすぎる。生きる方法を教えることは、生きる道を閉ざすことと同じだ{*EF*}{*B*}{*B*} -{*C2*}だから僕は生き方を教えない{*EF*}{*B*}{*B*} -{*C3*}プレイヤーは落ち着かなくなってきてるな{*EF*}{*B*}{*B*} -{*C2*}なら、ある物語を教えようよ{*EF*}{*B*}{*B*} -{*C3*}ただの物語で真実ではない{*EF*}{*B*}{*B*} -{*C2*}そう。辺りを焼き払ってしまうようなむき出しの真実ではなく、言葉の檻の中に真実を優しく隠した物語{*EF*}{*B*}{*B*} -{*C3*}もう一度プレイヤーに体を与えよう{*EF*}{*B*}{*B*} -{*C2*}さあ、プレイヤー...{*EF*}{*B*}{*B*} -{*C3*}君の名前をもう一度聞かせてほしい{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}。ゲームのプレイヤーだよ{*EF*}{*B*}{*B*} -{*C3*}では始めようか{*EF*}{*B*}{*B*} + + ダイヤモンドの馬鎧 + + + レッドストーン比較装置 + + + TNT 火薬つきトロッコ + + + ホッパーつきトロッコ + + + + + + ビーコン + + + トラップつきチェスト + + + 荷重した重量感知板 (軽) + + + 名札 + + + 木の板 (全タイプ) + + + コマンド ブロック + + + 花火の星 + + + 手なずけて乗ることができる。チェストを取りつけられる + + + ラバ + + + 馬とロバをかけ合わせて繁殖させると生まれる。手なずけると乗ったり、チェストの運搬が可能になる + + + + + + 手なづけて乗ることができる + + + ロバ + + + ゾンビの馬 + + + 空白の地図 + + + 暗黒星 + + + 打ち上げ花火 + + + ガイコツ馬 + + + ウィザー + + + ウィザー スカルとソウルサンド から作る。プレイヤーに爆発するスカルを放つ + + + 荷重した重量感知板 (重) + + + 薄灰色の粘土 + + + 灰色の粘土 + + + ピンクの粘土 + + + 青の粘土 + + + 紫の粘土 + + + 水色の粘土 + + + 黄緑の粘土 + + + オレンジの粘土 + + + 白の粘土 + + + ステンドグラス + + + 黄色の粘土 + + + 空色の粘土 + + + 赤紫の粘土 + + + 茶色の粘土 + + + ホッパー + + + 起動レール + + + ドロッパー + + + レッドストーン比較装置 + + + 日光センサー + + + レッドストーンのブロック + + + 色つきの粘土 + + + 黒の粘土 + + + 赤の粘土 + + + 緑の粘土 + + + 干し草の俵 + + + 硬くなった粘土 + + + 石炭のブロック + + + 色の変化 + + + 無効にすると、モンスターや動物がブロックを変化させなくなり (例えば、クリーパーが爆発してもブロックを壊さない。羊が草を取らない)、アイテムを拾い上げなくなる + + + 有効にすると、プレイヤーが絶命した時に持ち物が残ります + + + 無効にすると、モブは自然に出現しなくなります + + + ゲームモード: アドベンチャー + + + アドベンチャー + + + シードを入力して同じ世界を生成してください。空白にするとランダムに生成されます + + + 無効にすると、モンスターや動物がアイテムを落とさなくなります (例えば、クリーパーが火薬を落とさなくなる) + + + {*PLAYER*} は、はしごから落ちた + + + {*PLAYER*} は、つたから落ちた + + + {*PLAYER*} は水から落ちた + + + 無効にすると、ブロックが壊れた時にアイテムを落とさなくなります (例えば、石のブロックは丸石を落とさなくなる) + + + 無効にすると、HP が自然に回復しなくなります + + + 無効 + + + トロッコ + + + 引き綱 + + + 放つ + + + 取りつける + + + 下りる + + + チェストを取りつける + + + 発射 + + + 名前 + + + ビーコン + + + 第 1 パワー + + + 第 2 パワー + + + + + + ドロッパー + + + ホッパー + + + {*PLAYER*} は高い場所から落ちた + + + 現在、スポーン エッグを使用できません。 世界のコウモリの数が最大数に達しました + + + この動物は求愛モードにできません。コウモリの繁殖数が最大数に達しました + + + ゲームのオプション + + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で火だるまにされた + + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で叩き潰された + + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で倒された + + + モブの嘆き + + + タイルの落下 + + + 自然再生 + + + 日光サイクル + + + 持ち物を残す + + + モブ出現 + + + モブ アイテム + + + {*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 つ置く必要があります。ビーコンは、一度設定したら無限にパワーを発揮します + + + このピラミッドの頂上に、有効化されていないビーコンがあります + + + これがビーコンの画面です。ビーコンに与えるパワーを選ぶことができます + + + {*B*}ビーコン画面の説明を続ける: {*CONTROLLER_VK_A*} +{*B*}ビーコン画面の説明を飛ばす: {*CONTROLLER_VK_B*} + + + ビーコン メニューでは、ビーコンの第 1 パワーを 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*} @@ -4602,9 +2164,61 @@ OK を選択すると、この世界でのプレイを終了します 暗黒界をリセットする + + %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*} + 本当にこのセーブ データの暗黒界を最初の状態にリセットしてもよろしいですか? 暗黒界に建設したものはすべて失われます + + 現在、スポーン エッグを使用できません。 豚、羊、牛、ネコ、馬の数が最大数に達しました + + + 現在、スポーン エッグを使用できません。 ムーシュルームの数が最大数に達しました + + + 現在、スポーン エッグを使用できません。 世界のオオカミの数が最大数に達しました + 暗黒界をリセットする @@ -4612,113 +2226,11 @@ OK を選択すると、この世界でのプレイを終了します 暗黒界をリセットしない - 現在、ムーシュルームは毛刈りできません。豚、羊、牛、ネコの数が最大数に達しました。 - - - 現在、スポーン エッグを使用できません。 豚、羊、牛、ネコの数が最大数に達しました - - - 現在、スポーン エッグを使用できません。 ムーシュルームの数が最大数に達しました - - - 現在、スポーン エッグを使用できません。 世界のオオカミの数が最大数に達しました - - - 現在、スポーン エッグを使用できません。 世界のニワトリの数が最大数に達しました - - - 現在、スポーン エッグを使用できません。 世界のイカの数が最大数に達しました - - - 現在、スポーン エッグを使用できません。 世界の敵の数が最大数に達しました - - - 現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました - - - 世界の絵/額縁の数が最大数に達しました。 - - - 難易度「ピース」では敵を出現させることはできません。 - - - この動物は求愛モードにできません。豚、羊、牛、ネコの繁殖数が最大数に達しました - - - この動物は求愛モードにできません。オオカミの繁殖数が最大数に達しました - - - この動物は求愛モードにできません。ニワトリの繁殖数が最大数に達しました - - - この動物は求愛モードにできません。ムーシュルームの繁殖数が最大数に達しました - - - 世界のボートの数が最大数に達しました - - - 世界のモブ ヘッドの数が最大数に達しました - - - 上下反転 - - - 左利き + 現在、ムーシュルームは毛刈りできません。豚、羊、牛、ネコ、馬の数が最大数に達しました。 ゲームオーバー! - - 復活 - - - 利用可能ダウンロード コンテンツ - - - スキンを変更 - - - 遊び方 - - - 操作方法 - - - 設定 - - - クレジット - - - コンテンツを再インストール - - - デバッグ設定 - - - 火の延焼 - - - TNT の爆発 - - - PvP - - - 高度な操作を許可 - - - ホスト特権 - - - 建物を生成する - - - スーパーフラット - - - ボーナス チェスト - 世界のオプション @@ -4728,18 +2240,18 @@ OK を選択すると、この世界でのプレイを終了します ドアとスイッチを使用可能 + + 建物を生成する + + + スーパーフラット + + + ボーナス チェスト + 入れ物を使用可能 - - プレイヤーを攻撃可能 - - - 動物を攻撃可能 - - - ホストオプション変更可能 - プレイヤーを追放 @@ -4749,185 +2261,305 @@ OK を選択すると、この世界でのプレイを終了します 疲労無効 + + プレイヤーを攻撃可能 + + + 動物を攻撃可能 + + + ホストオプション変更可能 + + + ホスト特権 + + + 遊び方 + + + 操作方法 + + + 設定 + + + 復活 + + + 利用可能ダウンロード コンテンツ + + + スキンを変更 + + + クレジット + + + 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*} + - - ゲームを始める + + ドロッパー - - ゲームが見つかりません - - - プレイする - - - ランキング - - - ヘルプとオプション - - - 完全版を購入 - - - ゲームに戻る - - - セーブ - - - 難易度: - - - ゲームタイプ: - - - 建物: - - - レベルタイプ: - - - PvP: - - - 高度な操作を許可: - - - TNT 火薬: - - - 火の延焼: - - - テーマを再インストール - - - ゲーマー アイコン 1 を再インストール - - - ゲーマー アイコン 2 を再インストール - - - アバター アイテム 1 を再インストール - - - アバター アイテム 2 を再インストール - - - アバター アイテム 3 を再インストール - - - オプション - - - オーディオ - - - コントロール - - - グラフィック - - - ユーザー インターフェイス - - - デフォルトにリセット - - - 画面の揺れ - - - ヒント - - - プレイ中のボタンガイド - - - 2 プレイヤー左右分割画面 - - - 完了 - - - 看板のメッセージを編集: - - - スクリーンショットの説明を入力してください - - - キャプション - - - ゲームのスクリーンショット - - - 看板のメッセージを編集: - - - Minecraft 正統派のテクスチャ、アイコン、ユーザー インターフェイス! - - - マッシュアップの世界をすべて表示 - - - 効果なし - - - スピード - - - 鈍化 - - - 勤勉 - - - 疲労 - - - - - - 弱体化 + + NOT USED 回復 @@ -4938,62 +2570,3253 @@ OK を選択すると、この世界でのプレイを終了します 跳躍 + + 疲労 + + + + + + 弱体化 + 目まい + + NOT USED + + + NOT USED + + + NOT USED + 再生 耐性 - - 耐火 + + 世界生成のシードを見つける - - 水中呼吸 + + 起動すると、色鮮やかな爆発を起こす。色、効果、形、変化は、花火を作る時に使う花火の星によって決まる - - 不可視 + + ホッパーつきトロッコを有効/無効にしたり、TNT 火薬つきトロッコを起爆させることができるレール - - 盲目 + + レッドストーンを電源として使い、アイテムをつかんで落としたり、ほかの入れ物に運び入れたりする - - 暗視 + + 硬くなった粘土を染めてできるカラフルなブロック - - 空腹 + + レッドストーンの電力を供給する。感知板の上に乗る物が多いほど動力は強くなる。軽量用より多くの重量を要する + + + レッドストーンの動力源として使われる。レッドストーンへと復元することができる + + + アイテムをつかんだり、アイテムを入れ物に出し入れするのに使う + + + 馬、ロバ、ラバに与えて、ハートを最高 10 個まで回復させることができる。子どもの成長を速める + + + コウモリ + + + 洞穴や閉ざされた広い空間に生息する空飛ぶ動物 + + + 魔女 + + + かまどで粘土を精錬するとできる + + + ガラスと染料から作られる + + + ステンドグラスから作られる + + + レッドストーンの電力を供給する。感知板の上に乗る物が多いほど動力は強くなる + + + 日光 (または日光の不足) に基づいてレッドストーンの信号を出力するブロック + + + ホッパーに似た働きをする特殊なトロッコ。レールの上や上部にある入れ物からアイテムを集める + + + 馬に装備できる特殊な防具。装備するとアーマーポイント +5 + + + 花火の色、効果、形を決めるのに使う + + + 信号の強度を維持、比較、減少させるため、または特定のブロックの状態を測定するために、レッドストーンの回路に使われる + + + トロッコの一種で、移動する TNT 火薬として機能する + + + 馬に装備できる特殊な防具。装備するとアーマーポイント +7 + + + コマンドを実行するのに使う + + + 空に向かって光を発し、近くにいるプレイヤーにパワーを与える + + + ブロックやアイテムを中に保管する。2 つのチェストを横に並べて置くと、容量が 2 倍の大きなチェストになる。トラップつきチェストは、開けるとレッドストーンに動力を生じさせる + + + 馬に装備できる特殊な防具。装備するとアーマーポイント +11 + + + 生き物をプレイヤーや柵に繋ぐのに使う + + + ゲームの世界のモブに名前をつけるのに使う + + + 勤勉 + + + 完全版を購入 + + + ゲームに戻る + + + セーブ + + + プレイする + + + ランキング + + + ヘルプとオプション + + + 難易度: + + + PvP: + + + 高度な操作を許可: + + + TNT 火薬: + + + ゲームタイプ: + + + 建物: + + + レベルタイプ: + + + ゲームが見つかりません + + + 招待者のみ + + + その他のオプション + + + ロード + + + ホスト オプション + + + プレイヤー/招待 + + + オンライン ゲーム + + + 新しい世界 + + + プレイヤー + + + ゲームに参加 + + + ゲームを始める + + + 世界の名前 + + + 世界生成のシード + + + 空白にすると、ランダムにシードを決めます + + + 火の延焼: + + + 看板のメッセージを編集: + + + スクリーンショットの説明を入力してください + + + キャプション + + + プレイ中のボタンガイド + + + 2 プレイヤー左右分割画面 + + + 完了 + + + ゲームのスクリーンショット + + + 効果なし + + + スピード + + + 鈍化 + + + 看板のメッセージを編集: + + + Minecraft 正統派のテクスチャ、アイコン、ユーザー インターフェイス! + + + マッシュアップの世界をすべて表示 + + + ヒント + + + アバター アイテム 1 を再インストール + + + アバター アイテム 2 を再インストール + + + アバター アイテム 3 を再インストール + + + テーマを再インストール + + + ゲーマー アイコン 1 を再インストール + + + ゲーマー アイコン 2 を再インストール + + + オプション + + + ユーザー インターフェイス + + + デフォルトにリセット + + + 画面の揺れ + + + オーディオ + + + コントロール + + + グラフィック + + + ポーションの調合に使う。ガストが倒されたときに落とす + + + ゾンビ ピッグマンが倒されたときに落とす。ゾンビピッグマンは暗黒界にいる。ポーションを調合する際の原材料として使われる + + + ポーションの調合に使う。暗黒砦に生えている。また、ソウルサンドでも育つ + + + 上面を歩くと滑る。他のブロックの上で壊れると水になる。光源に近づけたり、暗黒界に設置すると溶ける + + + 飾り付けとして使う + + + ポーションの調合や要塞を探すのに使う。暗黒砦の周囲にいるブレイズが落とす + + + 何に使うかにより、様々な効果が現れる + + + ポーションの調合や、他のアイテムと合わせてエンダーアイまたはマグマクリームを作るのに使う + + + ポーションの調合に使う + + + ポーションやスプラッシュポーションの調合に使う + + + 水を入れるビン。調合台でポーションを作る時、最初に必要になる + + + 食べ物や薬の材料となる有毒のアイテム。クモや洞窟グモが倒されたときに落とす + + + 主にマイナス効果のポーションを調合するのに使う + + + 置くと徐々に茂る。ハサミを使って集める。はしごのように登ることができる + + + ドアと似ているが、主に柵と組み合わせて使う + + + 切ったスイカから作れる + + + 透明なブロックで、ガラスブロックの代わりに使える + + + (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押し、ピストンが戻る時には、触れているブロックを引き戻す + + + 石ブロックから作る。要塞で見かけることが多い + + + 柵と同様、障害物として使う + + + 植えるとカボチャが生える + + + 建設と飾り付けに使う + + + 歩くと移動が遅くなる。ハサミで破壊でき、糸が採れる + + + 破壊されるとシルバーフィッシュを出現させる。近くで別のシルバーフィッシュが攻撃を受けたときにも、シルバーフィッシュを出現させる場合がある + + + 植えるとスイカが生える + + + エンダーマンが倒されたときに落とす。投げると、落ちた場所にプレイヤーがテレポートされ、HP が少し減る + + + 上面に草が生えた土ブロック。シャベルを使って集める。建築用に使われる + + + 雨水またはバケツの水を入れて、水をガラスビンに詰めるのに使われる + + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + + かまどで暗黒石を精錬するとできる。暗黒レンガ ブロックの材料となる + + + 動力を受けると点灯する + + + 陳列ケースのように、中に入れたアイテムまたはブロックを展示する + + + 投げると特定の種類の生き物が出現する + + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + + 栽培して、カカオ豆を収穫できる + + + + + + 倒すと革を落とす。バケツがあればミルクも取れる + + + + + + モブ ヘッドは飾り付けとして並べたり、ヘルメットのスロットからマスクとして着用もできる + + + イカ + + + 倒すと墨袋を落とす + + + 火をつけるのに便利。分配装置から撃ち出して、無差別に火を起こすのにも使われる + + + 水に浮く植物。上を歩くことができる + + + 暗黒砦を建てるのに使う。ガストの火の玉が効かない + + + 暗黒砦で使う + + + 投げると果てのポータルがある方角を示す。果てのポータルの枠内に 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 + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + 木の剣 + + + 石の剣 + + + 鉄の剣 + + + Jon Kagstrom + + + Tobias Mollstam + + + Rise Lugo + + + Developer + + + 当たると爆発する火の玉を放ってくる + + + スライム + + + ダメージを与えると、小さなスライムに分裂する + + + ゾンビ ピッグマン + + + 最初はおとなしいが、1 匹を攻撃すると集団で反撃してくる + + + ガスト + + + エンダーマン + + + 洞窟グモ + + + 牙に毒がある + + + ムーシュルーム + + + 照準を向けると攻撃してくる。ブロックを移動できる + + + シルバーフィッシュ + + + 攻撃すると、近くに隠れているシルバーフィッシュも集まってくる。石ブロックの中に隠れている + + + 近づくと攻撃してくる + + + 倒すと豚肉を落とす。鞍があれば乗ることもできる + + + オオカミ + + + 普段はおとなしいが、攻撃すると反撃してくる。骨を使うと手なずけることができ、プレイヤーについて回って、プレイヤーを攻撃してくる敵を攻撃してくれる + + + ニワトリ + + + 倒すと羽根を落とす。タマゴを持っている場合もある + + + + + + クリーパー + + + クモ + + + 近づくと攻撃してくる。壁を登ることができる。倒すと糸を落とす + + + ゾンビ + + + 近づきすぎると爆発する! + + + ガイコツ + + + 矢を放ってくる。倒すと矢を落とす + + + おわんを使うと、きのこシチューが採れる。ハサミで毛刈りをするときのこを落とすが、普通の牛になってしまう + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + リード ゲーム プログラマー Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + 果ての世界に存在する大きな黒竜 + + + ブレイズ + + + 暗黒界に出現する敵。主に暗黒砦内にいる。倒すとブレイズ ロッドを落とす + + + スノー ゴーレム + + + 雪ブロックとカボチャで作れるゴーレム。作った人の敵に向かって雪玉を投げつける + + + エンダー ドラゴン + + + マグマ キューブ + + + ジャングルに生息。生魚を与えて飼い慣らせる。不意な動きに驚いてすぐに逃げるため、向こうから寄ってくるのを待たなければならない + + + アイアン ゴーレム + + + 村に出現して村人を守ってくれる。鉄のブロックとカボチャで作ることもできる + + + 暗黒界に出現する。スライム同様、倒すと分裂する + + + 村人 + + + ヤマネコ + + + エンチャントテーブルの周囲に並べることで、エンチャントの効果をより強力にできる + + + {*T3*}使い方: かまど{*ETW*}{*B*}{*B*} +かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます。{*B*}{*B*} +ゲームの世界にかまどを置いて {*CONTROLLER_ACTION_USE*} を押すと使うことができます。{*B*}{*B*} +かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。{*B*}{*B*} +加工が終わると、そのアイテムをかまどの取り出し口から持ち物に移すことができます。{*B*}{*B*} +ポインターで選んだアイテムがかまどで使用する素材または燃料の場合、かまどへ移動するためのボタンガイドが表示されます + + + {*T3*}使い方: 分配装置{*ETW*}{*B*}{*B*} +分配装置を使うと、アイテムを撃ち出すことができます。そのためには分配装置の横にレバーなどのスイッチ部分を取り付ける必要があります。{*B*}{*B*} +分配装置にアイテムを入れるには、{*CONTROLLER_ACTION_USE*} を押してから、持ち物からアイテムを分配装置に移します。{*B*}{*B*} +それから取り付けたスイッチを使うと、分配装置がアイテムを撃ち出します + + + {*T3*}遊び方: 調合{*ETW*}{*B*}{*B*} +ポーションの調合には、作業台で作れる調合台を使います。ポーションの調合にはまず水のビンが必要なので、大釜や水源からガラスビンに水を移し、水のビンを用意しましょう。{*B*} +調合台にはビンを置く枠が 3 つあり、1 回の調合で最大 3 つのポーションを調合できます。1 つの材料でビン 3 本分のポーションが作れるので、資源を効率よく使うには一度に 3 つのポーションを作りましょう。{*B*} +調合台の上の枠にポーションの材料を置いて少し待つと、基剤となるポーションができます。基剤自体に効果はありませんが、別の材料を加えて調合すると、効力を持つポーションを作れます。{*B*} +このポーションが完成したら、3 つめの材料を加えてさらなる効果をつけてみましょう。レッドストーンの粉を足せば効果の持続時間が長くなり、光石の粉を足せばポーションの効力が高まり、発酵したクモの目を足せばマイナス効果のあるポーションが作れます。{*B*} +また、どのポーションでも火薬を加えればスプラッシュポーションになります。スプラッシュポーションは投げて使用し、落ちた場所に効果を発揮します。{*B*} + +ポーションの原材料となるものは以下の通りです:{*B*}{*B*} +* {*T2*}暗黒茸{*ETW*}{*B*} +* {*T2*}クモの目{*ETW*}{*B*} +* {*T2*}砂糖{*ETW*}{*B*} +* {*T2*}ガストの涙{*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*} +使い方は普通のチェストと同じです + + + {*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*} +エンチャントテーブルの周囲に、テーブルとブロック 1 つ分のすき間を空けて本棚 (最大 15 台) を並べることで、エンチャントのレベルが上がります。またエンチャントテーブル上の本から謎の文字が出るエフェクトが表示されます。{*B*}{*B*} +エンチャントテーブルに必要な材料は、すべてゲームの世界内の村や、採掘、農耕などで手に入ります。{*B*}{*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*} + +{*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*} +ほかのプレイヤーやプレイヤー自身を、ゲームの世界内の別のプレイヤーがいる場所へと移動させることができます。 + + + + 次へ + + + {*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 には参加しましたか? + + + Mojang のスタッフですらジャンクボーイの素顔は知りません + + + Minecraft Wiki があるのを知っていますか? + + + 虫と目を合わせてはいけません + + + クリーパーはプログラムのバグから発生します + + + ニワトリ? それともアヒル? + + + 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 はフロリダ州オーランド (アメリカ合衆国) で開催されました! + + + .party() は最高でした! + + + ウワサは鵜呑みにしないこと。ほどほどに信じるのが一番! + + + 前へ + + + 取引 + + + 金床 + + + 果ての世界 + + + 世界へのアクセス禁止 + + + クリエイティブ モード + + + ホストとプレイヤーのオプション + + + {*T3*}遊び方: 果ての世界{*ETW*}{*B*}{*B*} +果ての世界は別世界の 1 つで、果てのポータルを起動して行くことができます。果てのポータルは地上界の地下深くの要塞にあります{*B*} +果てのポータルを起動するには、エンダーアイを果てのポータルの枠内にはめ込む必要があります。{*B*} +ポータルが起動したら、飛び込んで果ての世界に行きましょう{*B*}{*B*} +果ての世界では大勢のエンダーマンが待ち構えているだけでなく、恐ろしく手ごわいエンダードラゴンが出現します。果ての世界に進む前にしっかり戦いの準備を整えましょう!{*B*}{*B*} +8 本の黒曜石の柱の上にはエンダークリスタルがあり、エンダードラゴンはこれを使って回復します。 +戦いが始まったら最初にエンダークリスタルをひとつずつ破壊しましょう{*B*} +手前の数個は矢が届く場所にありますが、残りは鉄の柵で囲まれています。届く高さまで足場を積み上げましょう{*B*}{*B*} +その間、エンダードラゴンが飛びかかってきたり、エンダーアシッドブレスを吐いて攻撃してきます!{*B*} +柱の中央にあるタマゴ台に近づくと、エンダードラゴンが攻撃しようと降下してきます。ダメージを与えるチャンスです!{*B*} +アシッドブレスをかわしながら、エンダードラゴンの弱点である目を狙うのが効果的です。助けてくれるフレンドがいる場合は、果ての世界に来てもらって一緒に戦いましょう!{*B*}{*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*} + + + スクリーンショットの公開 + + + チェスト + + + 工作 + + + かまど + + + 基本 + + + 画面の表示 + + + 持ち物 + + + 分配装置 + + + エンチャント + + + 闇のポータル + + + マルチプレイヤー + + + 動物の飼育 + + + 動物の繁殖 + + + 調合 + + + deadmau5 は Minecraft が大好き! + + + ピッグマンは、こちらから攻撃しない限り、攻撃してきません + + + ベッドで寝ることで、復活地点の変更と、夜から朝へ時間を早回しすることができます + + + ガストに火の玉を打ち返してやりましょう! + + + たいまつを作って、夜に明かりとして使いましょう。たいまつの回りにはモンスターが近寄ってこなくなります + + + トロッコとレールを使えば、早く目的地に着けます + + + 苗木を植えれば、成長して木になります + + + 闇のポータルを作れば、別の世界である暗黒界に行くことができます + + + 真下や真上に掘り進むのは、賢いとはいえません + + + ガイコツの骨から作った骨粉は肥料として使えて、色々なものを一瞬で成長させることができます! + + + クリーパーは近づくと爆発します! + + + {*CONTROLLER_VK_B*} を押すと、手に持っているアイテムを落とします! + + + 目的にあった道具を使いましょう! + + + たいまつに使う石炭が見つからないときには、かまどを使って木から木炭を作ることができます + + + 豚肉は生で食べるよりも、調理したほうが HP を多く回復します + + + 難易度を「ピース」に設定すると、HP が自動的に回復し、夜間にモンスターが出現しなくなります! + + + オオカミに骨を与えて、手なずけましょう。おすわりさせたり、あなたについてこさせたりできます + + + 持ち物メニューで、カーソルをメニュー外に動かして、{*CONTROLLER_VK_A*} を押すと、アイテムを落とすことができます + + + 新しいダウンロード コンテンツが追加されました! メイン メニューの [Minecraft ストア] からアクセスできます + + + Minecraft ストアのスキン パックを使えば、あなたのキャラクターの外見を変えられます。メイン メニューの [Minecraft ストア] から品ぞろえを確認してくださいね + + + ガンマ設定を変更すると、ゲームの明るさを調整できます + + + 夜間にベッドで寝ると、朝まで時間をスキップすることができます。マルチプレイヤー ゲームでは、すべてのプレイヤーが寝ている必要があります + + + くわを使って、土地を耕しましょう + + + クモは日中は、こちらから攻撃しない限り攻撃してきません + + + 手で地面や砂を掘るよりも、シャベルを使ったほうが速く掘れます + + + 豚から取れる豚肉を調理して食べると HP が回復します + + + 牛から取った革を使用して防具を作りましょう + + + 空のバケツがあれば、牛のミルクを搾ったり、水を汲んだり、溶岩を入れたりできます + + + 溶岩の源のブロックに水が触れると、黒曜石ができます + + + 柵を積み重ね可能としました + + + 動物の中には、小麦を持っているとついてくるものがいます + + + いずれかの方向に 20 ブロック以上動けない動物は消滅しません + + + 手なずけたオオカミの HP は尻尾の状態で分かります。回復するには、肉を与えましょう + + + 緑色の染料を作るには、サボテンをかまどで調理します + + + [遊び方] の [最新情報] に、最新のアップデートに関する情報があります + + + BGM 制作: C418 + + + Notch って誰? + + + Mojang はスタッフの数より受けた賞の数の方が多かったりします + + + 有名人も Minecraft をプレイ中! + + + Notch の Twitter には 100 万人以上のフォロワーがいます! + + + スウェーデン人みんなが金髪というわけではありません。たとえば、Mojang の Jens は赤毛です + + + アップデートも予定中です。お楽しみに! + + + チェスト 2 つを並べて配置すれば、1 つの大きなチェストになります + + + 屋外にウールで建物を建てる場合には、注意しましょう。雷が当たると燃えてしまいます + + + バケツ 1 杯の溶岩があれば、かまどで 100 個のブロックを精錬できます + + + 音ブロックで演奏される楽器は、ブロックの下の材質で変化します + + + 溶岩の源のブロックを取り除くと、溶岩はしばらくして完全に消えてしまいます + + + 丸石はガストの火の玉を防いでくれます。ポータルを守るのに使えます + + + 光源に使用できるブロックは、雪や氷を溶かすことができます。たいまつ、光石、カボチャ ランタンなどのブロックです + + + ゾンビやガイコツは、水の中では太陽の光に当たっても大丈夫です + + + ニワトリは 5~10 分ごとにタマゴを生みます + + + 黒曜石を掘り出すには、ダイヤモンドのツルハシが必要です + + + クリーパーからは火薬がもっとも簡単に手に入ります + + + オオカミを攻撃すると、近くにいるすべてのオオカミが襲い掛かってきます。ゾンビ ピッグマンも同じ習性を持っています + + + オオカミは暗黒界に入ることができません + + + オオカミはクリーパーを攻撃しません + + + 石でできているブロックと鉱石を掘るのに必要 + + + ケーキの材料の 1 つ。ポーションを調合する際の原材料としても使われる + + + オン/オフを切り替えて、電気を送れる。もう一度押すまでオンまたはオフの状態が保たれる + + + ブロックの横に取り付けて、常に電気を送ったり、送受信機として使える。 +弱い明かりとしても使用可能 + + + 2{*ICON_SHANK_01*} 回復する。金のリンゴの材料となる + + + 2{*ICON_SHANK_01*} 回復し、さらに HP が 4 秒間、自動回復する。リンゴと金の塊から作られる + + + 2{*ICON_SHANK_01*} 回復する。食べると毒にあたる可能性がある + + + 反復装置、遅延装置、ダイオードとして単体で、または組み合わせて、レッドストーンの回路に使われる + + + トロッコを走らせるのに使う + + + 電源が入っている時、上を走るトロッコを加速させる。電源が入っていない時は、上でトロッコが止まる + + + トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る + + + 押すと電気を送れる。約 1 秒間起動した後、自動的にオフになる + + + レッドストーンを電源として使い、ランダムな順番でアイテムを撃ち出す + + + 音を奏でる。叩くと音程を変えられる。種類の違うブロックの上に置くことで、楽器の種類を変えることができる + + + 2.5{*ICON_SHANK_01*} 回復する。かまどで生魚を調理するとできる + + + 1{*ICON_SHANK_01*} 回復する + + + 1{*ICON_SHANK_01*} 回復する + + + 3{*ICON_SHANK_01*} 回復する + + + 弓と組み合わせて、武器として使う + + + 2.5{*ICON_SHANK_01*} 回復する + + + 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*} 回復する。かまどで牛肉を調理するとできる + + + プレイヤーや動物、モンスターを乗せて、レールの上を移動できる + + + 空色のウールを作るのに使う染料 + + + 水色のウールを作るのに使う染料 + + + 紫のウールを作るのに使う染料 + + + 黄緑のウールを作るのに使う染料 + + + 灰色のウールを作るのに使う染料 + + + 薄灰色のウールを作るのに使う染料 +(注意: 薄灰色の染料は灰色の染料と骨粉を混ぜて作るれば、 1 つの墨袋から 3 つではなく 4 つの薄灰色の染料を作ることができる) + + + 赤紫のウールを作るのに使う染料 + + + たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + + + 本や地図を作るのに使う + + + 本棚を作るのに使う。エンチャントするとエンチャントの本になる。 + + + 青のウールを作るのに使う染料 + + + 音楽ディスクを聞ける + + + 強力な道具、武器や防具を作ることができる + + + オレンジのウールを作るのに使う染料 + + + 羊から採れる。染料を使って色を変えることができる + + + 建築用素材。染料で色を変えることができる。ウールは羊から簡単に入手できるので、この作り方はあまりお勧めできない + + + 黒のウールを作るのに使う染料 + + + 物を載せて、レール上を移動できる + + + レールの上を移動する。石炭を使うことで他のトロッコを押すことができる + + + 泳ぐよりも速く水上を移動できる + + + 緑のウールを作るのに使う染料 + + + 赤のウールを作るのに使う染料 + + + 即座に作物や木、背の高い草、巨大なきのこ、花などを育てるのに使う。染料の材料にもなる + + + ピンクのウールを作るのに使う染料 + + + 茶色のウールを作るのに使う染料。クッキーの材料や、カカオの実を育てるのにも使われる + + + 銀のウールを作るのに使う染料 + + + 黄色のウールを作るのに使う染料 + + + 矢を射る攻撃ができる + + + 装備するとアーマーポイント +5 + + + 装備するとアーマーポイント +3 + + + 装備するとアーマーポイント +1 + + + 装備するとアーマーポイント +5 + + + 装備するとアーマーポイント +2 + + + 装備するとアーマーポイント +2 + + + 装備するとアーマーポイント +3 + + + 光沢を放つ延べ棒。道具を作る材料として使う。かまどで鉱石を精錬して作る + + + 延べ棒、宝石、染料などを、世界に置くことができるブロックに変えられる。高級な建築用ブロックや、鉱石の保管用として使うことができる + + + プレイヤーや動物、モンスターなどが上を通ると電気を送り出す。木の重量感知板は、物を上に置くことでも作動する + + + 装備するとアーマーポイント +8 + + + 装備するとアーマーポイント +6 + + + 装備するとアーマーポイント +3 + + + 装備するとアーマーポイント +6 + + + 鉄のドアを開くには、レッドストーンや、ボタン、スイッチを使う必要がある + + + 装備するとアーマーポイント +1 + + + 装備するとアーマーポイント +3 + + + 木でできているブロックを切り出すのに使う。手で切り出すより速い + + + 土や草のブロックを耕して作物を育てられるようにする + + + 木のドアは、使用したり、叩いたり、レッドストーンを使うことで開く + + + 装備するとアーマーポイント +2 + + + 装備するとアーマーポイント +4 + + + 装備するとアーマーポイント +1 + + + 装備するとアーマーポイント +2 + + + 装備するとアーマーポイント +1 + + + 装備するとアーマーポイント +2 + + + 装備するとアーマーポイント +5 + + + 小さな階段を作るのに使う + + + きのこシチューを入れるのに使う。シチューを食べてしまっても、おわんは残る + + + 水や溶岩、ミルクを貯めて移動するのに使う + + + 水を入れて運ぶのに使う + + + 自分や他のプレイヤーの入力したテキストを表示できる + + + たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + + + 爆発を起こすのに使う。置いてから火打ち石と打ち金を使ったり、電気を通すことで起爆する + + + 溶岩を入れて運ぶのに使う + + + 太陽と月の位置を表示する + + + 自分のスタート地点を示す + + + 手に持っていると、探索済みのエリアの地図を表示する。道を確認するのに使う + + + ミルクを入れて運ぶのに使う + + + 火を起こしたり、TNT を起爆したり、建築済みのポータルを開くのに使う + + + 魚を獲るのに使う + + + 使用したり、叩いたり、レッドストーンで開く。普通のドアとして機能するが、ブロック 1 個分であり、平らな床面として置ける + + + 建築用素材。様々な物の材料になる。どんな形の木からでも切り出せる + + + 建築用素材。通常の砂のように重力の影響を受けない + + + 建築用素材 + + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + + 明かりを照らすのに使う。たいまつは、雪や氷も溶かすことができる + + + たいまつ、矢、看板、はしご、柵の材料や、道具や武器の握り部分として使う + + + 中にブロックやアイテムを保管できる。2 つのチェストを横に並べることで、2 倍の容量のチェスト (大) ができる + + + 「障害物」として機能し、ジャンプで飛び越えることができない。プレイヤーや動物、モンスターに対しては、高さ 1.5 ブロックとして機能し、他のブロックに対しては高さ 1 ブロックとして機能する + + + 垂直方向に登るのに使う + + + ゲーム内の全てのプレイヤーがベッドで寝ている時に使うと、夜から朝へ時間を早回しすることができる。そして、使用したプレイヤーの復活地点が変わる。 +ベッドの色は使われたウールの色に関係なく、常に同じ + + + 通常の工作よりも、さらに多くの種類のアイテムを作ることができる + + + 鉱石を精錬して木炭やガラスを作ったり、魚や豚肉を調理することができる + + + 鉄の斧 + + + レッドストーン ランプ + + + ジャングルの木の階段 + + + 樺の階段 + + + 現在の操作方法 + + + スカル + + + ココア + + + トウヒの階段 + + + ドラゴンの卵 + + + 果ての石 + + + 果てのポータルの枠 + + + 砂岩の階段 + + + シダ + + + 低木 + + + レイアウト + + + 工作 + + + 使う + + + アクション + + + しのび足/下降 (飛行時) + + + しのび足 + + + 落とす + + + 手持ちアイテムの切り替え + + + 止まる + + + 見る + + + 動く/ダッシュ + + + 持ち物 + + + ジャンプ/上昇 (飛行時) + + + ジャンプ + + + 果てのポータル + + + カボチャの茎 + + + スイカ + + + ガラス板 + + + フェンスゲート + + + つた + + + スイカの茎 + + + 鉄格子 + + + ひび割れた石レンガ + + + 苔の生えた石レンガ + + + 石レンガ + + + きのこ + + + きのこ + + + 模様入り石レンガ + + + レンガ階段 + + + 暗黒茸 + + + 暗黒レンガ階段 + + + 暗黒レンガの柵 + + + 大釜 + + + 調合台 + + + エンチャントテーブル + + + 暗黒レンガ + + + シルバーフィッシュの丸石 + + + シルバーフィッシュの石 + + + 石レンガ階段 + + + スイレンの葉 + + + 菌糸 + + + シルバーフィッシュの石レンガ + + + カメラ モードの変更 + + + 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*} で周囲を見回せます + + + {*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 は自由な発想でブロックを積み上げて、いろいろな物を作るゲームです。 +夜になるとモンスターが現れるので、その前に必ず安全な場所を作っておかなければなりません + + + + + + + + + + + + + + + + + + + + + + + + レイアウト 1 + + + 移動 (飛行時) + + + プレイヤー/招待 + + + + + + レイアウト 3 + + + レイアウト 2 + + + + + + + + + + + + + + + {*B*}チュートリアルを始める: {*CONTROLLER_VK_A*}{*B*} + チュートリアルを飛ばす: {*CONTROLLER_VK_B*} + + + {*B*}続けるには {*CONTROLLER_VK_A*} を押してください + + + + + + + + + + + + + + + + + + + + + + + + + + + シルバーフィッシュ ブロック + + + 石の厚板 + + + 鉄を省スペースに保管できる + + + 鉄のブロック + + + 樫の厚板 + + + 砂岩の厚板 + + + 石の厚板 + + + 金を省スペースに保管できる + + + + + + 白のウール + + + オレンジのウール + + + 金のブロック + + + きのこ + + + バラ + + + 丸石の厚板 + + + 本棚 + + + TNT 火薬 + + + レンガ + + + たいまつ + + + 黒曜石 + + + コケ石 + + + 暗黒レンガの厚板 + + + 樫の厚板 + + + 石レンガの厚板 + + + レンガの厚板 + + + ジャングルの木の厚板 + + + 樺の厚板 + + + トウヒの厚板 + + + 赤紫のウール + + + 樺の葉 + + + トウヒの葉 + + + 樫の葉 + + + ガラス + + + スポンジ + + + ジャングルの木の葉 + + + 葉っぱ + + + + + + トウヒ + + + + + + トウヒの木 + + + 樺の木 + + + ジャングルの木 + + + ウール + + + ピンクのウール + + + 灰色のウール + + + 薄灰色のウール + + + 空色のウール + + + 黄色のウール + + + 黄緑のウール + + + 水色のウール + + + 緑のウール + + + 赤のウール + + + 黒のウール + + + 紫のウール + + + 青のウール + + + 茶色のウール + + + たいまつ (石炭) + + + 光石 + + + ソウルサンド + + + 暗黒石 + + + ラピスラズリのブロック + + + ラピスラズリ鉱石 + + + ポータル + + + カボチャ ランタン + + + サトウキビ + + + 粘土 + + + サボテン + + + カボチャ + + + + + + ジュークボックス + + + ラピスラズリを省スペースに保管できる + + + トラップドア + + + 鍵つきチェスト + + + ダイオード + + + 吸着ピストン + + + ピストン + + + ウール (すべての色) + + + 枯れた茂み + + + ケーキ + + + 音ブロック + + + 分配装置 + + + 背の高い草 + + + クモの巣 + + + ベッド + + + + + + 作業台 + + + ダイヤモンドを省スペースに保管できる + + + ダイヤモンドのブロック + + + かまど + + + 農地 + + + 作物 + + + ダイヤモンド鉱石 + + + モンスター発生器 + + + + + + たいまつ (木炭) + + + レッドストーンの粉 + + + チェスト + + + 樫の階段 + + + 看板 + + + レッドストーン鉱石 + + + 鉄のドア + + + 重量感知板 + + + + + + ボタン + + + レッドストーンのたいまつ + + + レバー + + + レール + + + はしご + + + 木のドア + + + 石の階段 + + + 感知レール + + + 加速レール + + + かまどを作るのに必要な数の丸石が集まりました。作業台を使って、かまどを作りましょう + + + 釣り竿 + + + 時計 + + + 光石の粉 + + + かまどつきトロッコ + + + タマゴ + + + コンパス + + + 生魚 + + + ローズ レッド + + + サボテン グリーン + + + ココア ビーンズ + + + 調理した魚 + + + 染色粉 + + + 墨袋 + + + チェストつきトロッコ + + + 雪玉 + + + ボート + + + + + + トロッコ + + + + + + レッドストーン + + + ミルク バケツ + + + + + + + + + スライムボール + + + レンガ + + + 粘土 + + + サトウキビ + + + ラピスラズリ + + + 地図 + + + 音楽ディスク: 13 + + + 音楽ディスク: cat + + + ベッド + + + レッドストーン反復装置 + + + クッキー + + + 音楽ディスク: blocks + + + 音楽ディスク: mellohi + + + 音楽ディスク: stal + + + 音楽ディスク: strad + + + 音楽ディスク: chirp + + + 音楽ディスク: far + + + 音楽ディスク: mall + + + ケーキ + + + 灰色の染料 + + + ピンクの染料 + + + 黄緑の染料 + + + 紫の染料 + + + 水色の染料 + + + 薄灰色の染料 + + + たんぽぽイエロー + + + 骨粉 + + + + + + 砂糖 + + + 空色の染料 + + + 赤紫の染料 + + + オレンジの染料 + + + 看板 + + + 革の服 + + + 鉄のチェストプレート + + + ダイヤモンドの鎧 + + + 鉄のヘルメット + + + ダイヤモンドのヘルメット + + + 金のヘルメット + + + 金のチェストプレート + + + 金のレギンス + + + 革のブーツ + + + 鉄のブーツ + + + 革のパンツ + + + 鉄のレギンス + + + ダイヤモンドのレギンス + + + 革の帽子 + + + 石のくわ + + + 鉄のくわ + + + ダイヤモンドのくわ + + + ダイヤモンドの斧 + + + 金の斧 + + + 木のくわ + + + 金のくわ + + + 鎖のチェストプレート + + + 鎖のレギンス + + + 鎖のブーツ + + + 木のドア + + + 鉄のドア + + + 鎖のヘルメット + + + ダイヤモンドのブーツ + + + 羽根 + + + 火薬 + + + 小麦の種 + + + おわん + + + きのこシチュー + + + + + + 小麦 + + + 調理した豚肉 + + + + + + 金のリンゴ + + + パン + + + 火打ち石 + + + 生の豚肉 + + + + + + バケツ + + + 水バケツ + + + 溶岩バケツ + + + 金のブーツ + + + 鉄の延べ棒 + + + 金の延べ棒 + + + 火打ち石と打ち金 + + + 石炭 + + + 木炭 + + + ダイヤモンド + + + リンゴ + + + + + + + + + 音楽ディスク: 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*} + + + これがかまどの画面です。かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます + + + 完成したかまどをゲームの世界に置きましょう。小屋の中に置くとよいかもしれません。{*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*} + + + 発酵したクモの目 + + + 大釜 + + + エンダーアイ + + + 輝くスイカ + + + ブレイズの粉 + + + マグマクリーム + + + 調合台 + + + ガストの涙 + + + カボチャの種 + + + スイカの種 + + + 鶏肉 + + + 音楽ディスク: 11 + + + 音楽ディスク: where are we now + + + ハサミ + + + 焼き鳥 + + + エンダーパール + + + 切ったスイカ + + + ブレイズ ロッド + + + 牛肉 + + + ステーキ + + + 腐肉 + + + エンチャントのビン + + + 樫の板 + + + トウヒの板 + + + 樺の板 + + + 草ブロック + + + + + + 丸石 + + + ジャングルの木の板 + + + 樺の苗木 + + + ジャングルの木の苗木 + + + 岩盤 + + + 苗木 + + + 樫の苗木 + + + トウヒの苗木 + + + + + + 額縁 + + + {*CREATURE*}出現 + + + 暗黒レンガ + + + 発火剤 + + + 発火剤 (木炭) + + + 発火剤 (石炭) + + + スカル + + + ヘッド + + + %sのヘッド + + + クリーパー ヘッド + + + ガイコツ スカル + + + ウィザー ガイコツ スカル + + + ゾンビ ヘッド + + + 石炭を省スペースに保管できる。かまどの燃料として使う - - スピードの + + 空腹 鈍化の - - 勤勉の + + スピードの - - 疲労の + + 不可視 - - 力の + + 水中呼吸 - - 弱体化の + + 暗視 - - 回復の + + 盲目 ダメージの - - 跳躍の + + 回復の 目まいの @@ -5001,29 +5824,38 @@ OK を選択すると、この世界でのプレイを終了します 再生の + + 疲労の + + + 勤勉の + + + 弱体化の + + + 力の + + + 耐火 + + + 飽和 + 耐性の - - 耐火の + + 跳躍の - - 水中呼吸の + + ウィザー - - 不可視の + + HP ブースト - - 盲目の - - - 暗視の - - - 空腹の - - - 毒の + + 吸収 @@ -5034,9 +5866,78 @@ OK を選択すると、この世界でのプレイを終了します III + + 不可視の + IV + + 水中呼吸の + + + 耐火の + + + 暗視の + + + 毒の + + + 空腹の + + + 吸収の + + + 飽和の + + + HP ブーストの + + + 盲目の + + + 腐敗の + + + 素朴な + + + 薄い + + + 拡散した + + + クリアな + + + ミルキーな + + + 不完全な + + + バター風味の + + + なめらかな + + + 無様な + + + 気の抜けた + + + かさばる + + + 無個性な + (スプラッシュ) @@ -5046,50 +5947,14 @@ OK を選択すると、この世界でのプレイを終了します 退屈な - - 無個性な + + 粋な - - クリアな + + 真心の - - ミルキーな - - - 拡散した - - - 素朴な - - - 薄い - - - 不完全な - - - 気の抜けた - - - かさばる - - - 無様な - - - バター風味の - - - なめらかな - - - 上品な - - - 小粋な - - - 濃厚な + + チャーミングな エレガントな @@ -5097,149 +5962,152 @@ OK を選択すると、この世界でのプレイを終了します ファンシーな - - チャーミングな - - - 粋な - - - 洗練された - - - 真心の - きらめく - - 強力な - - - よどんだ - - - 無臭の - 悪臭の 刺激のある + + 無臭の + + + 強力な + + + よどんだ + + + 上品な + + + 洗練された + + + 濃厚な + + + 小粋な + + + プレイヤー、動物、モンスターの HP を時間とともに回復させます + + + プレイヤー、動物、モンスターの 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*} 回復する。金のニンジンの材料になる。農地に植えられる + + 装飾として使われる。花、苗木、サボテン、きのこを植えられる + + + 丸石でできた壁 + 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 - 高すぎます! - - 名前変更 + + エンチャントの費用: %d 手持ちのアイテム: - - 取引に必要なアイテム + + 名前変更 {*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,37 +1,124 @@  - + + "PSN" にサインインしますか? + + + ホストプレイヤーと異なる"PlayStation Vita"本体を使用しているプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じ"PlayStation Vita"本体を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません + + + SELECT + + + このオプションでは、プレイ中およびこのオプションを有効にしてセーブ後に再びロードした際に、この世界に対するトロフィーおよびランキング更新が無効になります。 + + + "PlayStation Vita" + + + アドホックネットワークを選択して近くにある他の"PlayStation Vita"本体と通信するか、"PSN"を選択して世界中のフレンドとつながりましょう + + + アドホックネットワーク + + + ネットワークモードの変更 + + + ネットワークモードの選択 + + + 分割画面でオンラインIDを表示 + + + トロフィー + + + このゲームではオートセーブ機能を利用できます。オートセーブの実行中は上のオートセーブ アイコンが表示されます。 +オートセーブ アイコンの表示中に"PlayStation Vita"本体の電源を切らないでください + + + + 有効にすると、ホストが飛行能力、疲労無効、不可視の設定をゲーム内メニューから切り替えられます。トロフィーおよびランキング更新は無効になります + + + オンラインID: + + + 現在お使いのテクスチャ パックは試用版です。テクスチャ パックのコンテンツをすべて利用できますが、途中経過はセーブできません。 +試用版を使用中にセーブしようとすると、完全版を購入するか尋ねるメッセージが表示されます + + + パッチ 1.04 (タイトル アップデート 14) + + + ゲーム内でオンラインIDを表示 + + + Minecraft: "PlayStation Vita" Editionで作ったよ! + + + ダウンロードできませんでした。後でもう一度お試しください + + + NATタイプが制限されているためゲームに参加できませんでした。ネットワーク設定をご確認ください + + + アップロードできませんでした。後でもう一度お試しください + + + ダウンロード完了! + + + 現在、転送ストレージにセーブデータがありません。 +Minecraft: "PlayStation 3" Edition でセーブデータを転送ストレージにアップロードしたあと、Minecraft: "PlayStation Vita" Edition でダウンロードしてください。 + + + セーブは完了していません + + + Minecraft: "PlayStation Vita" Edition はデータを保存するための容量が足りません。容量を確保するには、ほかの Minecraft: "PlayStation Vita" Edition のセーブデータを削除してください。 + + + + アップロードがキャンセルされました + + + 転送ストレージへのデータのアップロードをキャンセルしました + + + PS3™/PS4™の本体のセーブデータをアップロード + + + データをアップロード中: %d%% + + + "PSN" + + + PS3™セーブをダウンロード + + + データをダウンロード中: %d%% + + + 保存中 + + + アップロード完了! + + + このセーブデータをアップロードして、セーブデータ転送先に保存されている現在のセーブデータを上書きしていいですか? + + + + データを変換中 + + NOT USED - - PlayStation(R)Vita本体のタッチスクリーンでメニューを操作できます - - - minecraftforum には、PlayStation(R)Vita Edition専用セクションがあります - - - ゲームの最新情報は Twitter の @4JStudios と @Kappische でゲット! - - - エンダーマンの目を見てはいけません! - - - 4J Studios の PlayStation(R)Vita 向け超ホラー大作「Herobrine」はまさかのキャンセル... というウワサ - - - 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 は表示されません + + NOT USED {*T3*}遊び方: クリエイティブ モード{*ETW*}{*B*}{*B*} @@ -45,58 +132,59 @@ PlayStation(R)Vita本体のMinecraftは、初期設定でマルチプレイヤ {*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押すと飛行できます。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回倒します。 飛行モードでは、{*CONTROLLER_ACTION_JUMP*} 長押しで上昇、{*CONTROLLER_ACTION_SNEAK*} 長押しで下降できます。または、方向キーで上下左右に飛びましょう - - NOT USED - - - NOT USED - ゲーマー カードを見る - - ゲーマー プロフィールを見る - - - フレンドを招待 - クリエイティブ モードで作成、ロード、セーブした世界は、後でサバイバル モードでロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? - - この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。 + + ゲーマー プロフィールを見る - - ホスト特権を有効にして作成、ロード、セーブした世界は、後でオプションをオフにしてロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + フレンドを招待 - - "PSN" との接続が切断されました。メイン メニューに戻ります + + minecraftforum には、"PlayStation Vita" Edition専用セクションがあります - - "PSN" との接続が切断されました + + ゲームの最新情報は Twitter の @4JStudios と @Kappische でゲット! - - これはMinecraft: PlayStation(R)Vita Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! -完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: PlayStation(R)Vita Editionの楽しさを体験してください。 -完全版を購入しますか? + + NOT USED - - これは Minecraft: PlayStation(R)Vita Editionのお試し版です。完全版であれば、今すぐ獲得できるテーマがあります! -完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: PlayStation(R)Vita Editionの楽しさを体験してください。 -完全版を購入しますか? + + "PlayStation Vita"本体のタッチスクリーンでメニューを操作できます - - これはMinecraft: PlayStation(R)Vita Editionのお試し版です。この招待を受けるには完全版が必要です。 -完全版を今すぐ購入しますか? + + エンダーマンの目を見てはいけません! - - ゲスト プレイヤーでは完全版を購入することはできません。Sony Entertainment Network のアカウントでサインインしてください + + {*T3*}遊び方: マルチプレイヤー{*ETW*}{*B*}{*B*} +"PlayStation Vita"本体のMinecraftは、初期設定でマルチプレイヤー ゲームになっています。{*B*}{*B*} +あなたがオンラインゲームを開始または参加すると、フレンドリスト内のフレンドにそのことが通知されます (ホストとしてゲームを開始するときに [招待者のみ] を選択した場合を除きます)。フレンドが参加するとフレンドのフレンドリスト内のフレンドにも通知されます (オプションで [フレンドのフレンドを許可] を選択している場合)。{*B*} +ゲーム中にSELECTボタンを押すと、参加中のプレイヤーのリストを開いて、プレイヤーを追放できます - - オンラインID + + {*T3*}遊び方: スクリーンショットの公開{*ETW*}{*B*}{*B*} +ポーズ メニューで {*CONTROLLER_VK_Y*} を押してスクリーンショットを撮影し、Facebook で公開することができます。投稿の前に、撮影したスクリーンショットの縮小版が表示され、投稿に添えるメッセージを編集できます。{*B*}{*B*} +スクリーンショット撮影に適したカメラ モードも用意されています。キャラクターの正面からのショットを撮影して公開するには、{*CONTROLLER_ACTION_CAMERA*} を何度か押して正面からのカメラに切り替え、{*CONTROLLER_VK_Y*} を押します。{*B*}{*B*} +スクリーンショットにオンライン ID は表示されません + + + 4J Studios の "PlayStation Vita" 向け超ホラー大作「Herobrine」はまさかのキャンセル... というウワサ + + + Minecraft: "PlayStation Vita" Editionはさまざまな記録を更新しています! + + + Minecraft: "PlayStation Vita" Edition のお試し版をプレイできる制限時間が過ぎてしまいました! 完全版を購入して、ゲームを続けますか? + + + Minecraft: "PlayStation Vita" Editionのロードに失敗しました。続行できません 調合 @@ -104,140 +192,54 @@ PlayStation(R)Vita本体のMinecraftは、初期設定でマルチプレイヤ "PSN" からサインアウトしました。タイトル画面に戻ります - - Minecraft: PlayStation(R)Vita Edition のお試し版をプレイできる制限時間が過ぎてしまいました! 完全版を購入して、ゲームを続けますか? - - - Minecraft: PlayStation(R)Vita Editionのロードに失敗しました。続行できません - Sony Entertainment Network のチャット制限によりマルチプレイを制限されているプレイヤーがいます。ゲームに参加できません - - Sony Entertainment Network のチャット制限により、オンラインプレイを制限されているプレイヤーがいます。オンライン ゲームは作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます - - - チャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているため、ゲームに参加できません - ローカル プレイヤーの中にチャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているプレイヤーがいるため、ゲームに参加できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます ローカル プレイヤーの中にチャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているプレイヤーがいるため、ゲームを作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます - - このゲームではオートセーブ機能を利用できます。オートセーブの実行中は上のオートセーブ アイコンが表示されます。 -オートセーブ アイコンの表示中にPlayStation(R)Vita本体の電源を切らないでください - + + Sony Entertainment Network のチャット制限により、オンラインプレイを制限されているプレイヤーがいます。オンライン ゲームは作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます - - 有効にすると、ホストが飛行能力、疲労無効、不可視の設定をゲーム内メニューから切り替えられます。トロフィーおよびランキング更新は無効になります + + チャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているため、ゲームに参加できません - - 分割画面でオンラインIDを表示 + + "PSN" との接続が切断されました。メイン メニューに戻ります - - トロフィー + + "PSN" との接続が切断されました - - オンラインID: + + この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。 - - ゲーム内でオンラインIDを表示 + + ホスト特権を有効にして作成、ロード、セーブした世界は、後でオプションをオフにしてロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? - - Minecraft: PlayStation(R)Vita Editionで作ったよ! + + これはMinecraft: "PlayStation Vita" Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation Vita" Editionの楽しさを体験してください。 +完全版を購入しますか? - - 現在お使いのテクスチャ パックは試用版です。テクスチャ パックのコンテンツをすべて利用できますが、途中経過はセーブできません。 -試用版を使用中にセーブしようとすると、完全版を購入するか尋ねるメッセージが表示されます + + ゲスト プレイヤーでは完全版を購入することはできません。Sony Entertainment Network のアカウントでサインインしてください - - パッチ 1.04 (タイトル アップデート 14) + + オンラインID - - SELECT + + これは Minecraft: "PlayStation Vita" Editionのお試し版です。完全版であれば、今すぐ獲得できるテーマがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation Vita" Editionの楽しさを体験してください。 +完全版を購入しますか? - - このオプションでは、プレイ中およびこのオプションを有効にしてセーブ後に再びロードした際に、この世界に対するトロフィーおよびランキング更新が無効になります。 + + これはMinecraft: "PlayStation Vita" Editionのお試し版です。この招待を受けるには完全版が必要です。 +完全版を今すぐ購入しますか? - - "PSN" にサインインしますか? - - - ホストプレイヤーと異なるPlayStation(R)Vita本体を使用しているプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じPlayStation(R)Vita本体を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません - - - PlayStation(R)Vita - - - ネットワークモードの変更 - - - ネットワークモードの選択 - - - アドホックネットワークを選択して近くにある他のPlayStation(R)Vita本体と通信するか、"PSN"を選択して世界中のフレンドとつながりましょう - - - アドホックネットワーク - - - "PSN" - - - PlayStation(R)3 セーブをダウンロード - - - PlayStation(R)3/PlayStation(R)4 本体のセーブデータをアップロード - - - アップロードがキャンセルされました - - - 転送ストレージへのデータのアップロードをキャンセルしました - - - データをアップロード中: %d%% - - - データをダウンロード中: %d%% - - - このセーブデータをアップロードして、セーブデータ転送先に保存されている現在のセーブデータを上書きしていいですか? - - - - データを変換中 - - - 保存中 - - - アップロード完了! - - - アップロードできませんでした。後でもう一度お試しください - - - ダウンロード完了! - - - ダウンロードできませんでした。後でもう一度お試しください - - - NATタイプが制限されているためゲームに参加できませんでした。ネットワーク設定をご確認ください - - - -現在、転送ストレージにセーブデータがありません。 -Minecraft: PlayStation(R)3 Edition でセーブデータを転送ストレージにアップロードしたあと、Minecraft: PlayStation(R)Vita Edition でダウンロードしてください。 - - - セーブは完了していません - - - Minecraft: PlayStation(R)Vita Edition はデータを保存するための容量が足りません。容量を確保するには、ほかの Minecraft: PlayStation(R)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"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. - - - "PSN"에서 로그아웃했으므로 매치가 종료됐습니다. - - - 현재 오프라인 상태입니다. - - - 이 게임 기능 중 일부는 "PSN"에 로그인해야 이용할 수 있습니다. 현재는 오프라인 상태입니다. - - - 애드혹 네트워크 오프라인 - - - 이 게임에는 애드혹 네트워크 연결이 필요한 기능이 있지만 현재 오프라인 상태입니다. - - - 이 기능을 이용하려면 "PSN"에 로그인해야 합니다. - - - "PSN" 연결 - - - 애드혹 네트워크에 연결 - - - 트로피 문제 - - - 플레이어의 Sony Entertainment Network 계정에 접속하는 중에 문제가 발생했습니다. 트로피가 지급되지 않습니다. + + Sony Entertainment Network 계정에 설정을 저장하지 못했습니다. Sony Entertainment Network 계정 문제 - - Sony Entertainment Network 계정에 설정을 저장하지 못했습니다. + + 플레이어의 Sony Entertainment Network 계정에 접속하는 중에 문제가 발생했습니다. 트로피가 지급되지 않습니다. - 이 Minecraft: PlayStation(R)3 Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. -정식 버전 게임을 구매하면 Minecraft: PlayStation(R)3 Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. + 이 Minecraft: "PlayStation 3" Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft: "PlayStation 3" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. 정식 버전 게임을 구매하시겠습니까? + + 애드혹 네트워크에 연결 + + + 이 게임에는 애드혹 네트워크 연결이 필요한 기능이 있지만 현재 오프라인 상태입니다. + + + 애드혹 네트워크 오프라인 + + + 트로피 문제 + + + "PSN"에서 로그아웃했으므로 매치가 종료됐습니다. + + + "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,252 +1,3610 @@  - - 새 다운로드 콘텐츠가 준비되었습니다! 주 메뉴의 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 상점 + + + 회전 + + + 숨기기 + + + 모든 슬롯 선택 취소 + + + 진행 중인 게임을 종료하고 새 게임에 참가하시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + + + 현재 월드에서 이전에 저장한 내용을 현재 버전으로 덮어쓰시겠습니까? + + + 저장하지 않고 나가시겠습니까? 이 월드의 진행 상황이 모두 사라집니다! + + + 게임 시작 + + + 게임 나가기 + + + 게임 저장 + + + 저장하지 않고 나가기 + + + START를 눌러 게임에 참가하세요. + + + 만세! Minecraft의 Steve가 그려진 게이머 사진을 획득했습니다! + + + 만세! Creeper가 그려진 게이머 사진을 획득했습니다! + + + 정식 버전 게임 구매 + + + 참가하려는 플레이어가 이 게임의 다음 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. + + + 새 월드 + + + 상품을 획득했습니다! + + + 현재 게임은 평가판 버전입니다. 게임을 저장하려면 정식 버전이 필요합니다. +지금 정식 버전 게임을 구매하시겠습니까? + + + 친구 + + + 내 점수 + + + 전체 + + + 잠시 기다려 주십시오. + + + 결과 없음 + + + 필터: + + + 참가하려는 플레이어가 이 게임의 이전 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. + + + 연결 끊어짐 + + + 서버 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. + + + 서버 연결 끊김 + + + 게임에서 나가는 중 + + + 오류가 발생했습니다. 주 메뉴로 돌아갑니다. + + + 연결 실패 + + + 게임에서 추방되었습니다. + + + 호스트가 게임에서 나갔습니다. + + + 이 게임에 참가한 친구가 없으므로 게임에 참가할 수 없습니다. + + + 예전에 호스트가 자신을 추방했기 때문에 게임에 참가할 수 없습니다. + + + 비행으로 인해 게임에서 추방되었습니다. + + + 연결 시도 시간이 초과했습니다. + + + 서버가 꽉 찼습니다. + + + 이 모드에서는 적이 나타나며, 플레이어에게 큰 피해를 입힙니다. Creeper는 플레이어가 거리를 벌려도 폭발을 취소하지 않으므로 조심해야 합니다! + + + 테마 + + + 캐릭터 팩 + + + 친구의 친구도 참가 가능 + + + 플레이어 추방 + + + 이 플레이어를 게임에서 추방하시겠습니까? 추방당한 플레이어는 월드를 다시 시작하기 전까지 참가할 수 없습니다. + + + 게이머 사진 팩 + + + 이 게임은 호스트의 친구만 플레이할 수 있도록 제한되어서 참가할 수 없습니다. + + + 손상된 다운로드 콘텐츠 + + + 이 다운로드 콘텐츠는 손상되어서 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. + + + 일부 다운로드 콘텐츠가 손상되어 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. + + + 게임에 참가할 수 없음 + + + 선택됨 + + + 선택된 캐릭터: + + + 정식 버전 받기 + + + 텍스처 팩 잠금 해제 + + + 이 텍스처 팩을 사용하려면 먼저 잠금을 해제해야 합니다. +지금 잠금 해제하시겠습니까? + + + 텍스처 팩 평가판 + + + 시드 + + + 캐릭터 팩 획득 + + + 선택한 캐릭터를 사용하려면 캐릭터 팩을 획득해야 합니다. +지금 캐릭터 팩을 획득하시겠습니까? + + + 텍스처 팩의 평가판을 사용 중입니다. 정식 버전을 구입하기 전에는 이 월드를 저장할 수 없습니다. +텍스처 팩 정식 버전을 구입하시겠습니까? + + + 정식 버전 다운로드 + + + 여기에는 텍스처 팩 또는 매시업 팩이 필요하며 현재 가지고 있지 않습니다! +지금 텍스처 팩 또는 매시업 팩을 설치하시겠습니까? + + + 평가판 받기 + + + 텍스처 팩 없음 + + + 정식 버전 구입 + + + 평가판 다운로드 + + + 게임 모드가 변경되었습니다. + + + 이 옵션을 켜면 초대받은 플레이어만 게임에 참가할 수 있습니다. + + + 이 옵션을 켜면 친구 리스트에 있는 사람의 친구가 게임에 참가할 수 있습니다. + + + 이 옵션을 켜면 플레이어끼리 서로 피해를 입힐 수 있습니다. 생존 모드에만 적용됩니다. + + + 일반 + + + 완전평면 + + + 이 옵션을 켜면 온라인 게임으로 플레이합니다. + + + 이 옵션을 끄면 게임에 참가한 플레이어는 인증을 받기 전까지 건물을 짓거나 채굴할 수 없습니다. + + + 이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다. + + + 이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다. + + + 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다. + + + 이 옵션을 켜면 불이 근처의 가연성 블록으로 번집니다. + + + 이 옵션을 켜면 TNT가 작동할 때 폭발합니다. + + + 이 옵션을 켜면 지하 월드가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다. + + + 꺼짐 + + + 게임 모드: 창작 + + + 생존 + + + 창작 + + + 월드 이름 바꾸기 + + + 월드의 새 이름을 입력하십시오. + + + 게임 모드: 생존 + + + 생존 모드에서 생성 + + + 저장된 게임 이름 바꾸기 + + + %d초 후에 자동 저장 실행… + + + 켜짐 + + + 창작 모드에서 생성 + + + 구름 렌더링 + + + 이 저장된 게임을 어떻게 하시겠습니까? + + + HUD 크기 (분할 화면) + + + 재료 + + + 연료 + + + 디스펜서 + + + 상자 + + + 효과부여 + + + 화로 + + + 현재 이 게임에서 구매할 수 있는 해당 유형의 다운로드 콘텐츠가 없습니다. + + + 저장한 게임을 삭제하시겠습니까? + + + 승인을 기다리는 중 + + + 확인됨 + + + %s님이 게임에 참가했습니다. + + + %s님이 게임을 떠났습니다. + + + %s님을 게임에서 추방했습니다. + + + 양조대 + + + 서명 입력 + + + 서명으로 사용할 텍스트를 입력하십시오. + + + 제목 입력 + + + 평가판 시간 만료 + + + 인원 초과 + + + 빈자리가 없어서 게임에 참가하지 못했습니다. + + + 게시물 제목을 입력하십시오. + + + 게시물 내용을 입력하십시오. + + + 소지품 + + + 재료 + + + 설명문 입력 + + + 게시물 설명문을 입력하십시오. + + + 내용 입력 + + + 플레이 중: + + + 이 레벨을 차단 레벨 목록에 추가하시겠습니까? +확인을 선택하면 동시에 게임에서 나가게 됩니다. + + + 차단 목록에서 제거 + + + 자동 저장 간격 + + + 차단 레벨 + + + 참가하려는 게임은 차단 레벨 목록에 들어 있습니다. +게임 참가를 선택하면 해당 레벨이 차단 레벨 목록에서 제거됩니다. + + + 이 레벨을 차단하시겠습니까? + + + 자동 저장 간격: 꺼짐 + + + 인터페이스 투명도 + + + 레벨 자동 저장 준비 중 + + + HUD 크기 + + + + + + 여기에 놓을 수 없습니다! + + + 용암을 레벨 출현 지점 근처에 놓을 수 없습니다. 플레이어가 시작 지점에서 바로 죽을 수 있기 때문입니다. + + + 즐겨찾는 캐릭터 + + + %s님의 게임 + + + 알 수 없는 호스트 게임 + + + 손님이 로그아웃됨 + + + 설정 초기화 + + + 설정을 기본값으로 초기화하시겠습니까? + + + 불러오기 오류 + + + 모든 손님 플레이어가 게임에서 제거되었기 때문에 손님 플레이어가 로그아웃되었습니다. + + + 게임을 생성하지 못했습니다. + + + 자동 선택 + + + 팩 없음: 기본 캐릭터 + + + 로그인 + + + 로그인하지 않았습니다. 이 게임을 플레이하려면 로그인해야 합니다. 지금 로그인하시겠습니까? + + + 멀티 플레이 허용되지 않음 + + + 마시기 + + + 이 지역에는 농장이 있습니다. 농장에서 작물을 재배하면 음식 및 기타 아이템의 재료를 얻을 수 있습니다. + + + {*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개의 철 블록을 놓고 가운데 블록 위에 호박을 놓아 만들 수 있습니다. 철 골렘은 적을 공격합니다. + + + 소, Mooshroom, 양에게는 밀을, 돼지에게는 당근을 먹이고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 동물은 근처에 사랑 모드 상태이며 종류가 같은 동물이 있는지 찾아다니게 됩니다. + + + 사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 잠시 부모 동물을 따라다닙니다. + + + 사랑 모드가 끝난 동물은 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병을 동시에 양조할 수 있습니다. 조합 조건이 갖추어지면 양조가 시작되고 잠시 후 물약이 완성됩니다. + + + 물약을 만들기 위해서는 우선 물병이 있어야 만들 수 있습니다. 그 후 지하 사마귀를 추가해 '이상한 물약'을 만든 다음, 하나 이상의 다른 재료를 넣는 방식으로 물약 대부분을 만들 수 있습니다. + + + 물약을 만든 다음에도 물약의 효과를 바꿀 수 있습니다. 레드스톤 가루를 넣으면 효과 지속 시간이 길어지고, 발광석 가루를 넣으면 효과가 더욱 강해집니다. + + + 부여할 효과를 선택하고 {*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*} 버튼을 누르십시오. + + + 효과부여대를 사용하면 무기, 방어구 및 일부 도구에 특별한 효과를 부여할 수 있습니다. 예를 들어 블록을 채굴할 때 더 많은 아이템을 얻을 수 있는 효과나 방어력이 더 강해지는 효과 등이 있습니다. + + + 효과부여대 주변에 책장을 놓으면 효과부여대가 강화되어 더 높은 수준의 효과를 부여할 수 있습니다. + + + 아이템에 효과를 부여하려면 경험치가 필요합니다. 괴물 및 동물을 처치하면 나오는 경험치 구체를 모으거나, 광석을 채굴하거나, 동물을 교배하거나, 낚시를 하거나, 화로에서 특정 아이템을 녹이거나 요리하면 경험치를 얻을 수 있습니다. + + + 효과는 무작위로 부여되지만, 성능이 더 좋은 효과 몇 종류는 더 많은 경험치를 지불하는 것은 물론 효과부여대 주위를 책장으로 둘러싸 강화해야 얻을 수 있습니다. + + + 여기에는 효과부여대와 효과부여에 사용할 수 있는 아이템이 있습니다. + + + {*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*} 버튼을 누르십시오. + + + 아이템을 옮기는 중에 포인터가 인터페이스를 벗어나면 아이템을 버릴 수 있습니다. + + + 읽기 + + + 매달기 + + + 던지기 + + + 열기 + + + 높낮이 변경 + + + 폭파 + + + 심기 + + + 정식 버전 게임 구매 + + + 저장 게임 삭제 + + + 삭제 + + + 경작 + + + 수확 + + + 계속 + + + 수면으로 헤엄치기 + + + 때리기 + + + 젖 짜기 + + + 수집 + + + 비우기 + + + 안장 + + + 놓기 + + + 먹기 + + + 타기 + + + 배 타기 + + + 성장 + + + 잠자기 + + + 일어나기 + + + 재생 + + + 옵션 + + + 방어구 이동 + + + 무기 이동 + + + 장비하기 + + + 재료 이동 + + + 연료 이동 + + + 도구 움직이기 + + + 당기기 + + + 페이지 위로 + + + 페이지 아래로 + + + 사랑 모드 + + + 놓기 + + + 특권 + + + 막기 + + + 창작 + + + 레벨 차단 + + + 캐릭터 선택 + + + 점화 + + + 친구 초대 + + + 수락 + + + 털 깎기 + + + 캐릭터 찾기 + + + 재설치 + + + 저장 옵션 + + + 명령 실행 + + + 정식 버전 설치 + + + 평가판 설치 + + + 설치 + + + 꺼내기 + + + 온라인 게임 목록 새로 고침 + + + 파티 게임 + + + 모든 게임 + + + 나가기 + + + 취소 + + + 참가 취소 + + + 그룹 변경 + + + 제작 + + + 만들기 + + + 획득/놓기 + + + 소지품 표시 + + + 설명 표시 + + + 재료 표시 + + + 뒤로 + + + 알림: + + + + + + 최신 버전에는 튜토리얼 월드에서 갈 수 있는 새로운 지역 등의 다양한 새 기능이 추가되었습니다. + + + 이 아이템을 만들 재료가 부족합니다. 왼쪽 아래의 상자에는 이 아이템을 만드는 데 필요한 재료가 표시됩니다. + + + 축하합니다. 튜토리얼을 마쳤습니다. 이제 게임 시간이 정상적으로 흐르며, 괴물이 출몰하는 밤이 오기까지 시간이 얼마 남지 않았습니다! 피신처를 완성하십시오! + + + {*EXIT_PICTURE*} 먼 곳을 탐험할 때, 작은 성으로 연결된 계단을 이용하십시오. 계단은 광부의 피신처 근처에 있습니다. + + + + {*B*}튜토리얼을 플레이하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 튜토리얼을 건너뛰려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + {*B*} + 음식 막대와 음식 먹는 법에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 음식 막대와 음식 먹는 법에 대해 이미 알고 있다면{*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + 선택 + + + 사용 + + + 이곳에는 낚시, 배, 피스톤, 레드스톤에 대해 알려주는 지역이 있습니다. + + + 이 지역 바깥에는 건설, 재배, 광물 수레와 궤도, 효과부여, 양조, 교환, 단조 등의 예시가 있습니다! + + + 음식 막대가 다 떨어지면 체력이 회복하지 않습니다. + + + 획득 + + + 다음 + + + 이전 + + + 플레이어 추방 + + + 친구 요청 보내기 + + + 페이지 내림 + + + 페이지 올림 + + + 염색 + + + 치료하기 + + + 앉기 + + + 나를 따르라 + + + 채굴 + + + 먹이기 + + + 길들이기 + + + 필터 변경 + + + 모두 놓기 + + + 하나 놓기 + + + 버리기 + + + 모두 획득 + + + 절반 획득 + + + 놓기 + + + 모두 버리기 + + + 빠른 선택 취소 + + + 이것은 무엇입니까? + + + Facebook에 공유 + + + 하나 버리기 + + + 교체 + + + 빠른 이동 + + + 캐릭터 팩 + + + 빨간색 스테인드글라스 판유리 + + + 초록색 스테인드글라스 판유리 + + + 갈색 스테인드글라스 판유리 + + + 흰색 스테인드글라스 + + + 스테인드글라스 판유리 + + + 검은색 스테인드글라스 판유리 + + + 파란색 스테인드글라스 판유리 + + + 회색 스테인드글라스 판유리 + + + 분홍색 스테인드글라스 판유리 + + + 라임색 스테인드글라스 판유리 + + + 보라색 스테인드글라스 판유리 + + + 청록색 스테인드글라스 판유리 + + + 밝은 회색 스테인드글라스 판유리 + + + 주황색 스테인드글라스 + + + 파란색 스테인드글라스 + + + 보라색 스테인드글라스 + + + 청록색 스테인드글라스 + + + 빨간색 스테인드글라스 + + + 초록색 스테인드글라스 + + + 갈색 스테인드글라스 + + + 밝은 회색 스테인드글라스 + + + 노란색 스테인드글라스 + + + 밝은 파란색 스테인드글라스 + + + 자주색 스테인드글라스 + + + 회색 스테인드글라스 + + + 분홍색 스테인드글라스 + + + 라임색 스테인드글라스 + + + 노란색 스테인드글라스 판유리 + + + 밝은 회색 + + + 회색 + + + 분홍색 + + + 파란색 + + + 보라색 + + + 청록색 + + + 라임색 + + + 주황색 + + + 흰색 + + + 사용자 지정 + + + 노란색 + + + 밝은 파란색 + + + 자주색 + + + 갈색 + + + 흰색 스테인드글라스 판유리 + + + 작은 공 + + + 큰 공 + + + 밝은 파란색 스테인드글라스 판유리 + + + 자주색 스테인드글라스 판유리 + + + 주황색 스테인드글라스 판유리 + + + 별 형태 + + + 검은색 + + + 빨간색 + + + 초록색 + + + Creeper 형태 + + + 섬광 + + + 알 수 없는 형태 + + + 검은색 스테인드글라스 + + + 철제 말 방어구 + + + 황금 말 방어구 + + + 다이아몬드 말 방어구 + + + 레드스톤 비교 측정기 + + + TNT가 담긴 광물 수레 + + + 호퍼가 담긴 광물 수레 + + + + + + 조명등 + + + 첩첩 상자 + + + 가중 압력판(경량) + + + 이름표 + + + 목재 판자(모든 유형) + + + 명령 블록 + + + 폭죽 스타 + + + 이 동물들은 길들일 수 있으며 길들인 후에 탈 수도 있습니다. 상자를 장착할 수 있습니다. + + + 노새 + + + 말과 당나귀를 교배하면 태어납니다. 이 동물들은 길을 들인 후 탈 수 있으며 상자를 운반할 수 있습니다. + + + + + + 이 동물들은 길들일 수 있으며 길들인 후에 탈 수도 있습니다. + + + 당나귀 + + + 좀비 말 + + + 빈 지도 + + + 지하의 별 + + + 폭죽 로켓 + + + 해골 말 + + + 위더 + + + 위더 두개골과 영혼 모래로 만듭니다. 플레이어에게 폭파하는 두개골을 발사합니다. + + + 가중 압력판(중량) + + + 밝은 회색 찰흙 + + + 회색 찰흙 + + + 분홍색 찰흙 + + + 파란색 찰흙 + + + 보라색 찰흙 + + + 청록색 찰흙 + + + 라임색 찰흙 + + + 주황색 찰흙 + + + 흰색 찰흙 + + + 스테인드글라스 + + + 노란색 찰흙 + + + 밝은 파란색 찰흙 + + + 자주색 찰흙 + + + 갈색 찰흙 + + + 호퍼 + + + 작동기 레일 + + + 드로퍼 + + + 레드스톤 비교 측정기 + + + 일광 센서 + + + 레드스톤 블록 + + + 색 찰흙 + + + 검은색 찰흙 + + + 빨간색 찰흙 + + + 초록색 찰흙 + + + 건초 더미 + + + 단단한 찰흙 + + + 석탄 블록 + + + 페이드 + + + 이 옵션을 끄면 괴물과 동물이 블록을 바꾸거나 아이템을 집어 들 수 없게 됩니다. 예를 들어 Creeper의 폭발이 블록을 파괴하지 못하고 양이 잡초를 제거할 수 없습니다. + + + 이 옵션을 켜면 플레이어가 죽을 때 소지품을 지킬 수 있습니다. + + + 이 옵션을 끄면 괴물 및 동물이 자연적으로 생성되지 않습니다. + + + 게임 모드: 모험 + + + 모험 + + + 같은 지형을 다시 생성하려면 시드를 입력하십시오. 공백으로 남겨두면 무작위로 월드가 생성됩니다. + + + 이 옵션을 끄면 괴물과 동물들이 전리품을 떨어뜨리지 않습니다. 예를 들어 Creeper는 화약을 떨어뜨리지 않습니다. + + + {*PLAYER*} 사다리에서 떨어짐 + + + {*PLAYER*} 덩굴에서 떨어짐 + + + {*PLAYER*} 물 밖으로 떨어짐 + + + 이 옵션을 끄면 블록이 파괴돼도 아이템을 떨어뜨리지 않습니다. 예를 들어 돌 블록이 조약돌을 떨어뜨리지 않습니다. + + + 이 옵션을 끄면 플레이어의 건강이 자연적으로 회복되지 않습니다. + + + 이 옵션을 끄면 시간이 바뀌지 않습니다. + + + 광물 수레 + + + 가죽끈 + + + 놓기 + + + 붙이기 + + + 내리기 + + + 상자 장착 + + + 발사 + + + 이름 + + + 조명등 + + + 1차 파워 + + + 2차 파워 + + + + + + 드로퍼 + + + 호퍼 + + + {*PLAYER*} 높은 곳에서 떨어짐 + + + 생성 알을 사용할 수 없습니다. 박쥐의 수가 최대치에 도달했습니다. + + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 말의 수가 최대치에 도달했습니다. + + + 게임 옵션 + + + {*PLAYER*} {*SOURCE*}의 {*ITEM*} 화염구 공격에 의해 사망 + + + {*PLAYER*} {*SOURCE*}의 {*ITEM*} 타격에 의해 사망 + + + {*PLAYER*} {*SOURCE*}의 {*ITEM*}에 의해 사망 + + + 괴물과 동물의 난동 + + + 블록 드롭 + + + 자연 재생 + + + 일광 주기 + + + 소지품 지키기 + + + 괴물 및 동물 생성 + + + 괴물 및 동물 전리품 + + + {*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*} 버튼을 누르십시오. + + + + +호퍼는 위에 있는 보관함에서 계속 아이템을 빼내려고 합니다. 또 보관되어 있는 아이템을 출력 보관함에 삽입하려고 합니다. + + + + +하지만 레드스톤으로 동력을 공급받는 경우 호퍼는 비활성화되어 아이템을 빼내지도 삽입하지도 않게 됩니다. + + + + +호퍼는 아이템을 출력하려는 방향으로 향하고 있습니다. 호퍼를 특정 블록으로 향하게 하려면 호퍼를 원하는 블록 맞은편에 살금살금 걸어가 놓습니다. + + + + 이 적은 늪에서 발견되며 물약을 던져 공격합니다. 죽을 때 물약을 떨어뜨립니다. + + + 그림 액자/아이템 외형의 수가 최대치에 도달했습니다. + + + 낙원 모드에서는 적을 생성할 수 없습니다. + + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. + + + 생성 알을 사용할 수 없습니다. 오징어의 수가 최대치에 도달했습니다. + + + 생성 알을 사용할 수 없습니다. 적의 수가 최대치에 도달했습니다. + + + 생성 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. + + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 늑대의 수가 최대치에 도달했습니다. + + + 괴물 머리의 수가 최대치에 도달했습니다. + + + 시야 반전 + + + 왼손잡이 + + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 닭의 수가 최대치에 도달했습니다. + + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 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 표시 + + + 손 표시 + + + {*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차 파워를 하나 고를 수 있습니다. 피라미드 단의 수가 많아질수록 선택할 수 있는 파워가 많아집니다.{*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 + + + 회복 + + + 피해 + + + 점프 강화 + + + 채굴 속도 저하 + + + 피해 강화 + + + 피해 약화 + + + 혼란 + + + NOT USED + + + NOT USED + + + NOT USED + + + 재생 + + + 저항 + + + 월드 생성을 위한 시드를 찾고 있습니다 + + + 활성화하면 다채로운 폭발이 일어납니다. 색, 효과, 형태 및 페이드는 폭죽을 만들 때 폭죽 스타로 결정할 수 있습니다. + + + 호퍼가 담긴 광물 수레를 움직이거나 움직이지 않게 하고 TNT가 담긴 광물 수레를 작동시킬 수 있는 레일입니다. + + + 드로퍼는 레드스톤으로 동력을 공급받을 때 아이템을 잡거나 떨어뜨리고 다른 보관함으로 밀기 위해 사용됩니다. + + + 단단한 찰흙을 염색해 만든 다양한 색의 블록입니다. + + + 레드스톤 동력을 제공합니다. 판에 아이템이 많을수록 동력이 강해집니다. 경량 압력판보다 무게가 더 필요합니다. + + + 레드스톤 동력원으로 사용됩니다. 다시 레드스톤으로 만들 수 있습니다. + + + 아이템을 잡거나 보관함 안으로 또는 밖으로 아이템을 이동하기 위해 사용됩니다. + + + 말, 당나귀, 노새에게 먹일 수 있으며 하트가 10개 회복됩니다. 망아지의 성장 속도가 빨라집니다. + + + 박쥐 + + + 이 하늘을 나는 생명체는 동굴이나 밀폐된 넓은 공간에서 찾아볼 수 있습니다. + + + 마녀 + + + 화로에서 찰흙으로 만듭니다. + + + 유리와 염료로 만듭니다. + + + 스테인드글라스로 만듭니다 + + + 레드스톤 동력을 제공합니다. 판에 아이템이 많을수록 동력이 강해집니다. + + + 일광의 정도에 따라 레드스톤 신호를 출력하는 블록입니다. + + + 호퍼와 비슷하게 행동하는 특별한 종류의 광물 수레입니다. 궤도에 놓여 있는 아이템과 위에 있는 보관함에서 아이템을 수집합니다. + + + 말이 착용할 수 있는 특별한 방어구입니다. 5의 방어력을 제공합니다. + + + 폭죽의 색, 효과 및 형태를 결정하는 데 사용됩니다. + + + 레드스톤 회로에서 신호 세기를 유지하거나 비교하거나 감산하는 데 사용하거나 특정 블록 상태를 측정하기 위해 사용합니다. + + + TNT 블록을 옮기는 데 사용되는 광물 수레입니다. + + + 말이 착용할 수 있는 특별한 방어구입니다. 7의 방어력을 제공합니다. + + + 명령을 실행하는 데 사용됩니다. + + + 하늘을 향해 광선을 비추며 근처에 있는 플레이어에게 등급 효과를 제공할 수 있습니다. + + + 안에 블록과 아이템을 보관할 수 있습니다. 상자 두 개를 나란히 놓으면 용량이 두 배가 되는 커다란 상자를 만들 수 있습니다. 첩첩 상자는 열었을 때 레드스톤 동력을 만들어내기도 합니다. + + + 말이 착용할 수 있는 특별한 방어구입니다. 11의 방어력을 제공합니다. + + + 괴물 및 동물을 플레이어나 울타리 말뚝에 매기 위해 사용됩니다. + + + 월드에서 괴물 및 동물에게 이름을 지어주기 위해 사용됩니다. + + + 채굴 속도 향상 + + + 정식 버전 게임 구매 + + + 게임 재개 + + + 게임 저장 + + + 게임 플레이 + + + 순위표 + + + 도움말 및 옵션 + + + 난이도: + + + 플레이어 대 플레이어: + + + 플레이어 신뢰: + + + TNT: + + + 게임 유형: + + + 건물: + + + 레벨 유형: + + + 게임 없음 + + + 초대한 사람만 참가 가능 + + + 추가 옵션 + + + 불러오기 + + + 호스트 옵션 + + + 플레이어/초대 + + + 온라인 게임 + + + 새 월드 + + + 플레이어 + + + 게임 참가 + + + 게임 시작 + + + 월드 이름 + + + 월드 생성 시드 + + + 공백(무작위 시드) + + + 불 확산: + + + 서명 메시지 편집: + + + 스크린샷과 함께 게시할 설명을 입력하십시오. + + + 설명문 + + + 게임 내 툴팁 + + + 2 플레이어 수직 분할 화면 + + + 완료 + + + 게임 스크린샷 + + + 효과 없음 + + + 속도 + + + 속도 저하 + + + 서명 메시지 편집: + + + 고전적인 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 드래곤 + + + 마그마 큐브 + + + 정글에서 찾을 수 있으며 날생선을 먹여서 조련이 가능합니다. 이때 갑자기 움직이면 오셀롯이 겁을 먹고 도망치기 때문에, 오셀롯이 다가오게 만들어야 합니다. + + + 철 골렘 + + + 마을을 보호하기 위해 나타납니다. 철 블록과 호박으로 만들 수 있습니다. + + + 지하에서 찾아볼 수 있습니다. 슬라임처럼 죽으면 분열하여 여러 개의 조그만 큐브가 됩니다. + + + 마을 사람 + + + 오셀롯 + + + 효과부여대 근처에 놓으면 더욱 강력한 효과를 만들어낼 수 있습니다. {*T3*}플레이 방법: 화로{*ETW*}{*B*}{*B*} @@ -283,6 +3641,23 @@ HUD는 체력이나 산소(물속에 있을 때), 배고픔 레벨(배고픔을 * {*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*} @@ -293,26 +3668,6 @@ HUD는 체력이나 산소(물속에 있을 때), 배고픔 레벨(배고픔을 효과부여대가 한 블록 간격을 두고 책장에 둘러싸여 있으면(최대 책장 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*} @@ -341,6 +3696,27 @@ 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*} @@ -404,60 +3780,92 @@ Minecraft에서는 동물을 교배해 새끼 동물을 얻을 수 있습니다! 다음 페이지 + + {*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()는 최고였습니다! + + + 뜬소문은 모두 거짓이라고 생각하는 것이 진실이라고 생각하는 것보다 좋습니다! + 이전 페이지 - - 기본 - - - HUD - - - 소지품 - - - 상자 - - - 제작 - - - 화로 - - - 디스펜서 - - - 동물 농장 - - - 동물 교배 - - - 양조 - - - 효과부여 - - - 지하 차원문 - - - 멀티 플레이 - - - 스크린샷 공유 - - - 레벨 차단 - - - 창작 모드 - - - 호스트 및 플레이어 옵션 - 교환 @@ -467,6 +3875,15 @@ Minecraft에서는 동물을 교배해 새끼 동물을 얻을 수 있습니다! Ender + + 레벨 차단 + + + 창작 모드 + + + 호스트 및 플레이어 옵션 + {*T3*}플레이 방법: Ender{*ETW*}{*B*}{*B*} Ender는 Ender 차원문을 통해 갈 수 있는 게임의 다른 차원입니다. Ender 차원문은 지상의 깊은 지하에 있는 요새에서 찾을 수 있습니다.{*B*} @@ -479,69 +3896,14 @@ 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*} + {*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*} +{*T1*}새로운 아이템{*ETB*} - 단단한 찰흙, 색 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 담긴 광물 수레, TNT가 담긴 광물 수레, 레드스톤 비교 측정기, 가중 압력판, 조명등, 첩첩 상자, 폭죽 로켓, 폭죽 스타, 지하의 별, 목끈, 말 방어구, 이름표, 말 생성 알{*B*}{*B*} +{*T1*}새로운 괴물 및 동물{*ETB*} - 위더, 위더 해골, 마녀, 박쥐, 말, 당나귀와 노새{*B*}{*B*} +{*T1*}새로운 기능{*ETB*} - 말 길들이고 타기, 폭죽을 만들어 쇼 펼치기, 동물과 괴물들에게 이름표로 이름 짓기, 좀 더 발달된 레드스톤 회로 만들기, 새 호스트 옵션으로 월드의 손님이 할 수 있는 일을 제어하기!{*B*}{*B*} +{*T1*}새로운 미니 튜토리얼{*ETB*} - 튜토리얼 월드에서 예전 기능과 새로운 기능을 사용하는 방법을 확인할 수 있습니다. 월드에 숨겨져 있는 비밀 음악 디스크를 모두 찾아보세요!{*B*}{*B*} 맨손 공격보다 위력이 강합니다. @@ -549,241 +3911,247 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 손을 사용하는 것보다 흙, 잡초, 모래, 자갈, 눈을 더 빨리 파냅니다. 눈덩이를 파내려면 삽이 필요합니다. + + 질주 + + + 업데이트 정보 + + + {*T3*}변경 및 추가 사항{*ETW*}{*B*}{*B*} +- 새 아이템이 추가되었습니다 - 단단한 찰흙, 색 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 담긴 광물 수레, TNT가 담긴 광물 수레, 레드스톤 비교 측정기, 가중 압력판, 조명등, 첩첩 상자, 폭죽 로켓, 폭죽 스타, 지하의 별, 목끈, 말 방어구, 이름표, 말 생성 알{*B*} +- 괴물과 동물이 새로 추가되었습니다 - 위더, 위더 해골, 마녀, 박쥐, 말, 당나귀와 노새{*B*} +- 지역 생성 기능이 새로 추가되었습니다 - 마녀 오두막.{*B*} +- 조명등 인터페이스가 추가되었습니다.{*B*} +- 말 인터페이스가 추가되었습니다.{*B*} +- 호퍼 인터페이스가 추가되었습니다.{*B*} +- 폭죽이 추가되었습니다 - 폭죽 인터페이스는 폭죽 스타나 폭죽 로켓을 만들 재료가 있을 때 작업대에서 사용할 수 있습니다.{*B*} +- '모험 모드'가 추가되었습니다 - 적절한 도구가 있어야지만 블록을 깨트릴 수 있습니다.{*B*} +- 다양한 새 사운드가 추가되었습니다.{*B*} +- 괴물과 동물, 아이템, 발사체는 이제 차원문을 통과할 수 있습니다.{*B*} +- 중계장치는 이제 다른 중계장치와 같이 측면에 동력을 공급해 잠길 수 있습니다.{*B*} +- 좀비와 해골은 이제 다른 무기와 방어구와 같이 생성할 수 있습니다.{*B*} +- 새로운 사망 메시지가 있습니다.{*B*} +- 괴물과 동물에게 이름표로 이름을 지어주고 보관함의 이름을 바꿔 메뉴가 열렸을 때 제목을 바꿀 수 있습니다.{*B*} +- 뼛가루는 더 이상 작물을 즉시 자라게 하지 않고, 대신 무작위로 단계별 성장을 촉진합니다.{*B*} +- 상자, 양조대, 디스펜서, 주크박스의 내용물을 묘사하는 레드스톤 신호는 레드스톤 비교 측정기를 바로 맞은 편에 놓아 탐지할 수 있습니다.{*B*} +- 디스펜서는 어떤 방향으로 놓을 수 있습니다.{*B*} +- 플레이어가 황금 사과를 먹으면 잠시 동안 추가로 '흡수' 체력이 주어집니다.{*B*} +- 한 지역에 오래 머무를수록 그 지역에서 생성하는 괴물은 더 힘들어집니다.{*B*} + + + 스크린샷 공유 + + + 상자 + + + 제작 + + + 화로 + + + 기본 + + + HUD + + + 소지품 + + + 디스펜서 + + + 효과부여 + + + 지하 차원문 + + + 멀티 플레이 + + + 동물 농장 + + + 동물 교배 + + + 양조 + + + deadmau5는 Minecraft를 좋아합니다! + + + Pigman은 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. + + + 플레이어는 게임 시작 지점을 변경할 수 있으며 침대에서 취침하여 시간을 새벽으로 건너뛸 수 있습니다. + + + Ghast가 쏘는 불덩이를 되받아치십시오! + + + 밤에 불을 밝히려면 횃불을 만드십시오. 괴물들은 횃불 근처 지역에는 접근하지 않습니다. + + + 광물 수레와 레일을 사용해서 목적지까지 더 빠르게 이동하십시오. + + + 묘목을 심으면 자라서 나무가 됩니다. + + + 차원문을 지으면 다른 차원의 세계인 지하로 여행을 떠날 수 있습니다. + + + 땅을 계속 위로 파거나 계속 아래로 파는 것은 그리 좋지 않습니다. + + + 해골 뼈에서 얻을 수 있는 뼛가루는 작물을 즉시 자라게 하는 비료로 쓸 수 있습니다. + + + Creeper는 접근하면 폭발합니다. + + + {*CONTROLLER_VK_B*} 버튼을 누르면 지금 손에 들고 있는 아이템을 버립니다. + + + 상황에 맞는 도구를 사용하십시오! + + + 횃불에 쓸 석탄이 없을 때는 화로 안의 나무에서 숯을 만들 수 있습니다. + + + 돼지고기를 날로 먹는 것보다 요리해서 먹을 때 체력이 더 많이 회복됩니다. + + + 낙원 난이도를 선택하면 체력이 자동으로 회복되고 밤에 괴물이 출몰하지 않습니다! + + + 늑대를 길들이려면 뼈를 먹이십시오. 길들인 늑대는 앉게 하거나 플레이어를 따르게 할 수 있습니다. + + + 소지품 메뉴 밖으로 포인터를 옮기고 {*CONTROLLER_VK_A*} 버튼을 눌러 아이템을 버릴 수 있습니다. + + + 새 다운로드 콘텐츠가 준비되었습니다! 주 메뉴의 Minecraft 상점에서 이용할 수 있습니다. + + + Minecraft 상점의 캐릭터 팩으로 캐릭터의 외형을 바꿀 수 있습니다. 주 메뉴의 'Minecraft 상점'을 선택해 확인해 보십시오. + + + 게임의 밝기를 높이거나 낮추려면 감마 설정을 변경하십시오. + + + 밤에 침대에서 자면 시간을 새벽으로 건너뛸 수 있습니다. 멀티 플레이 게임에서는 동시에 모든 플레이어가 잠들어야 합니다. + + + 식물을 심을 땅을 준비하려면 괭이를 사용하십시오. + + + 거미는 낮에 한해 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. + + + 삽으로 흙이나 모래를 파는 것이 손으로 파는 것보다 빠릅니다! + + + 돼지에서 돼지고기를 수확하고 요리하여 먹으면 체력이 회복됩니다. + + + 소에서 가죽을 수확하고 그 가죽을 사용해 방어구를 만드십시오. + + + 빈 양동이를 사용하면 소에서 짜낸 우유, 물, 또는 용암을 담을 수 있습니다! + + + 흑요석은 물과 용암 재료 블록이 부딪쳐서 만들어진 것입니다. + + + 이제 울타리를 쌓을 수 있습니다! + + + 플레이어가 손에 밀을 들고 있으면 일부 동물이 플레이어를 따라다닙니다. + + + 동물이 어떤 방향이든 20블록 이상 움직일 수 없으면 사라지지 않습니다. + + + 길들인 늑대는 꼬리를 보면 체력 상태를 알 수 있습니다. 기운을 회복시키려면 고기를 먹이십시오. + + + 화로를 이용하면 선인장을 초록 선인장 염료로 만들 수 있습니다. + + + 플레이 방법 메뉴의 업데이트 정보 섹션에서 게임의 최신 업데이트 정보를 확인할 수 있습니다. + + + 음악은 C418이 만들었습니다! + + + Notch가 누구인지 아십니까? + + + Mojang의 직원 수보다 Mojang이 받은 상의 수가 많습니다! + + + 유명인들도 Minecraft를 즐깁니다! + + + Notch의 Twitter를 팔로우하는 사람은 100만 명이 넘습니다! + + + 스웨덴 사람들이 모두 금발은 아닙니다. Mojang 소속의 Jens 같이 붉은 머리도 있습니다! + + + 언젠가는 업데이트가 있을 예정입니다! + + + 두 개의 상자를 나란히 놓으면 큰 상자 하나를 만들 수 있습니다. + + + 양털로 만든 건축 구조물이 야외에 있으면 번개 때문에 불이 붙을 수도 있으므로 조심해야 합니다. + + + 용암 한 양동이로 화로에서 블록 100개를 녹일 수 있습니다. + + + 연주 음은 소리 블록 아래 재질에 따라 달라집니다. + + + 용암은 재료 블록이 제거되어도 완전히 사라지는 데 시간이 걸립니다. + + + Ghast가 쏘는 불덩이에 내성을 가지는 조약돌은 경계 관문을 만드는 데 적합합니다. + + + 횃불, 발광석, 호박등과 같이 광원으로 사용 가능한 블록은 눈과 얼음을 녹입니다. + + + 좀비와 해골은 물속에 있으면 대낮에도 살아 움직입니다. + + + 닭은 5분에서 10분마다 달걀을 낳습니다. + + + 흑요석은 다이아몬드 곡괭이로만 채굴할 수 있습니다. + + + Creeper를 처치하면 손쉽게 화약을 얻을 수 있습니다. + + + 늑대를 공격하면 근처에 있는 늑대들이 적대적으로 변해 플레이어를 공격합니다. Pigman 좀비도 같은 특성을 가집니다. + + + 늑대는 지하로 내려갈 수 없습니다. + + + 늑대는 Creeper를 공격하지 않습니다. + 돌로 된 블록이나 광석을 채굴할 때 쓰입니다. - - 나무로 된 블록을 손을 사용할 때보다 더 빨리 잘라냅니다. - - - 흙과 잡초 블록을 갈아엎어서 작물을 기를 수 있게 만듭니다. - - - 나무문은 사용하거나 때려서 또는 레드스톤으로 열 수 있습니다. - - - 철문은 레드스톤, 버튼 또는 스위치로만 열 수 있습니다. - - - 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배 큰 상자가 만들어집니다. - - - 뛰어넘을 수 없는 방어벽으로 사용됩니다. 플레이어나 동물, 괴물에 대해서는 1.5배 높이의 블록으로 간주되지만 다른 블록에 대해서는 높이가 같은 것으로 간주됩니다. - - - 수직 경사를 오를 때 사용합니다. - - - 사용하거나 때리거나 레드스톤을 이용해 작동시킵니다. 작동 방식은 일반 문과 같지만 개별적 블록으로 간주되며, 땅과 수평인 형태로 열립니다. - - - 자신이나 다른 플레이어가 입력한 텍스트를 표시합니다. - - - 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. - - - 폭발을 일으킵니다. 설치한 다음, 부싯돌과 부시를 사용하거나 전기를 이용해 폭파할 수 있습니다. - - - 버섯죽을 담아두는 데 사용합니다. 죽을 먹어도 그릇은 남습니다. - - - 물이나 용암, 우유를 담아두거나 운반하는 데 쓰입니다. - - - 물을 저장하고 옮기는 데 사용합니다. - - - 용암을 저장하고 옮기는 데 사용합니다. - - - 우유를 저장하고 옮기는 데 사용합니다. - - - 불꽃을 일으키고, TNT를 폭파하고, 차원문을 여는 데 사용합니다. - - - 물고기를 잡을 수 있습니다. - - - 태양과 달의 위치를 표시합니다. - - - 시작 지점을 표시합니다. - - - 지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. - - - 화살과 함께 사용하여 원거리 공격을 합니다. - - - 활에 장전하여 사용합니다. - - - {*ICON_SHANK_01*}를 2.5만큼 회복합니다. - - - {*ICON_SHANK_01*}를 1만큼 회복합니다. 6번까지 사용할 수 있습니다. - - - {*ICON_SHANK_01*}를 1만큼 회복합니다. - - - {*ICON_SHANK_01*}를 1만큼 회복합니다. - - - {*ICON_SHANK_01*}를 3만큼 회복합니다. - - - 그대로 먹으면 {*ICON_SHANK_01*}를 1만큼 회복하지만 병에 걸릴 수 있습니다. 화로에서 조리할 수 있습니다. - - - {*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 닭 날고기를 조리해서 만듭니다. - - - 그대로 먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. - - - {*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 소 날고기를 조리해서 만듭니다. - - - 그대로 먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. - - - {*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 돼지 날고기를 조리해서 만듭니다. - - - 그대로 먹어서 {*ICON_SHANK_01*}를 1만큼 회복하거나 화로에서 조리할 수 있습니다. 오셀롯을 길들이기 위한 먹이로 사용할 수도 있습니다. - - - {*ICON_SHANK_01*}를 2.5만큼 회복합니다. 화로에서 날생선을 조리해서 만듭니다. - - - {*ICON_SHANK_01*}를 2만큼 회복하며 황금 사과를 만드는 데 사용합니다. - - - {*ICON_SHANK_01*}를 2만큼 회복하며 4초 동안 체력이 회복됩니다. 사과와 금덩이로 만듭니다. - - - 그대로 먹으면 {*ICON_SHANK_01*}를 2만큼 회복하지만 병에 걸릴 수 있습니다. - 케이크 제조법에 사용되며 물약을 양조하는 재료로 사용됩니다. @@ -794,9 +4162,27 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 주기적으로 전기를 보내거나, 블록 옆에 연결하면 송/수신기 역할을 합니다. 약한 조명으로 사용할 수도 있습니다. + + {*ICON_SHANK_01*}를 2만큼 회복하며 황금 사과를 만드는 데 사용합니다. + + + {*ICON_SHANK_01*}를 2만큼 회복하며 4초 동안 체력이 회복됩니다. 사과와 금덩이로 만듭니다. + + + 그대로 먹으면 {*ICON_SHANK_01*}를 2만큼 회복하지만 병에 걸릴 수 있습니다. + 레드스톤 회로에서 중계장치, 지연장치 또는 다이오드 역할을 합니다. + + 광물 수레가 가는 길에 사용됩니다. + + + 동력을 공급하면 그 위를 지나가는 광물 수레의 속도를 올려줍니다. 동력이 끊기면 광물 수레를 멈춰 세웁니다. + + + 압력판처럼 사용되지만 광물 수레로만 작동시킬 수 있습니다. 동력이 공급되면 레드스톤 신호를 보냅니다. + 누르면 전기를 보냅니다. 버튼을 떼면 1초 정도 작동하다가 닫힙니다. @@ -806,59 +4192,59 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 작동시키면 음을 연주합니다. 때리면 음의 높낮이가 바뀝니다. 다른 블록 위에 올려놓으면 연주 음의 종류가 변경됩니다. - - 광물 수레가 가는 길에 사용됩니다. + + {*ICON_SHANK_01*}를 2.5만큼 회복합니다. 화로에서 날생선을 조리해서 만듭니다. - - 동력을 공급하면 그 위를 지나가는 광물 수레의 속도를 올려줍니다. 동력이 끊기면 광물 수레를 멈춰 세웁니다. + + {*ICON_SHANK_01*}를 1만큼 회복합니다. - - 압력 발판처럼 사용되지만 광물 수레로만 작동시킬 수 있습니다. 동력이 공급되면 레드스톤 신호를 보냅니다. + + {*ICON_SHANK_01*}를 1만큼 회복합니다. + + + {*ICON_SHANK_01*}를 3만큼 회복합니다. + + + 활에 장전하여 사용합니다. + + + {*ICON_SHANK_01*}를 2.5만큼 회복합니다. + + + {*ICON_SHANK_01*}를 1만큼 회복합니다. 6번까지 사용할 수 있습니다. + + + 그대로 먹으면 {*ICON_SHANK_01*}를 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만큼 회복합니다. 화로에서 소 날고기를 조리해서 만듭니다. 레일을 따라서 플레이어나 동물, 괴물을 이동시킵니다. - - 레일을 따라서 물건을 이동시킵니다. + + 양털을 밝은 파란색으로 염색합니다. - - 석탄을 안에 넣으면 레일을 따라 움직이며 다른 광물 수레를 밀어줍니다. + + 양털을 청록색으로 염색합니다. - - 헤엄치는 것보다 물에서 빨리 이동할 수 있습니다. - - - 양에게서 얻어냅니다. 염료로 색을 바꿀 수 있습니다. - - - 건설 재료로 쓰입니다. 염료로 색을 바꿀 수 있지만, 양털은 양에게서 쉽게 얻을 수 있으므로 권장하지는 않습니다. - - - 양털을 검은색으로 염색합니다. - - - 양털을 초록색으로 염색합니다. - - - 양털을 갈색으로 염색하는 데, 쿠키의 재료로도 사용되며 코코아 콩을 재배하는 데 사용됩니다. - - - 양털을 은색으로 염색합니다. - - - 양털을 노란색으로 염색합니다. - - - 양털을 빨간색으로 염색합니다. - - - 작물이나 나무, 긴 잡초, 거대 버섯, 꽃을 즉시 성장시킵니다. 염료 재료로도 사용합니다. - - - 양털을 분홍색으로 염색합니다. - - - 양털을 주황색으로 염색합니다. + + 양털을 보라색으로 염색합니다. 양털을 라임색으로 염색합니다. @@ -870,27 +4256,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 양털을 밝은 회색으로 염색합니다. (참고: 밝은 회색 염료는 회색 염료와 뼛가루를 섞어도 만들 수 있습니다. 이 방법을 쓰면 먹물 주머니 하나로 회색 염료를 3개가 아니라 4개 만들 수 있습니다.) - - 양털을 밝은 파란색으로 염색합니다. - - - 양털을 청록색으로 염색합니다. - - - 양털을 보라색으로 염색합니다. - 양털을 자주색으로 염색합니다. - - 양털을 파란색으로 염색합니다. - - - 음악 디스크를 재생합니다. - - - 매우 강력한 도구나 무기, 방어구를 만드는 데 사용합니다. - 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. @@ -900,1220 +4268,678 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 책장을 만들거나 효과가 부여된 책에 효과를 부여하는 데 사용됩니다. - - 효과부여대 근처에 놓으면 더욱 강력한 효과를 만들어낼 수 있습니다. + + 양털을 파란색으로 염색합니다. - - 장식으로 사용됩니다. + + 음악 디스크를 재생합니다. - - 철제 곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 황금 주괴로 만듭니다. + + 매우 강력한 도구나 무기, 방어구를 만드는 데 사용합니다. - - 돌곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 철 주괴로 만듭니다. + + 양털을 주황색으로 염색합니다. - - 곡괭이로 채굴하여 석탄을 얻어냅니다. + + 양에게서 얻어냅니다. 염료로 색을 바꿀 수 있습니다. - - 돌곡괭이 이상으로 채굴하면 청금석이 나옵니다. + + 건설 재료로 쓰입니다. 염료로 색을 바꿀 수 있지만, 양털은 양에게서 쉽게 얻을 수 있으므로 권장하지는 않습니다. - - 철제 곡괭이 이상으로 채굴하면 다이아몬드를 얻습니다. + + 양털을 검은색으로 염색합니다. - - 철제 곡괭이 이상으로 채굴하면 레드스톤 가루를 얻습니다. + + 레일을 따라서 물건을 이동시킵니다. - - 곡괭이로 채굴하여 조약돌을 얻습니다. + + 석탄을 안에 넣으면 레일을 따라 움직이며 다른 광물 수레를 밀어줍니다. - - 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + + 헤엄치는 것보다 물에서 빨리 이동할 수 있습니다. - - 땅에 심을 수 있으며 나무로 자라납니다. + + 양털을 초록색으로 염색합니다. - - 부술 수 없습니다. + + 양털을 빨간색으로 염색합니다. - - 접촉하는 모든 것에 불을 붙입니다. 양동이에 담을 수 있습니다. + + 작물이나 나무, 긴 잡초, 거대 버섯, 꽃을 즉시 성장시킵니다. 염료 재료로도 사용합니다. - - 삽을 이용해서 얻을 수 있으며 화로에서 녹이면 유리가 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + + 양털을 분홍색으로 염색합니다. - - 삽을 이용해서 얻을 수 있으며, 파낼 때 가끔 부싯돌이 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + + 양털을 갈색으로 염색하는 데, 쿠키의 재료로도 사용되며 코코아 콩을 재배하는 데 사용됩니다. - - 도끼를 사용해서 벤 다음 판자 제작이나 땔감으로 쓰입니다. + + 양털을 은색으로 염색합니다. - - 화로에서 모래를 녹여 만듭니다. 건물을 짓는 데 사용할 수 있지만, 채굴하려고 하면 깨져버립니다. + + 양털을 노란색으로 염색합니다. - - 곡괭이로 돌을 채굴하면 얻을 수 있습니다. 화로를 만들거나 돌로 된 도구의 재료로 쓰입니다. + + 화살과 함께 사용하여 원거리 공격을 합니다. - - 화로에서 찰흙을 구워 만듭니다. + + 착용 시 5의 방어력을 얻습니다. - - 화로에 넣어 벽돌로 구워냅니다. + + 착용 시 3의 방어력을 얻습니다. - - 부수면 찰흙 덩이가 나옵니다. 찰흙을 화로에 넣어 구워내면 벽돌이 됩니다. + + 착용 시 1의 방어력을 얻습니다. - - 눈덩이를 보관하는 좋은 방법입니다. + + 착용 시 5의 방어력을 얻습니다. - - 삽으로 파서 눈덩이를 만들 수 있습니다. + + 착용 시 2의 방어력을 얻습니다. - - 부수면 가끔 밀 씨앗이 나옵니다. + + 착용 시 2의 방어력을 얻습니다. - - 염료의 재료입니다. + + 착용 시 3의 방어력을 얻습니다. - - 그릇을 사용하여 죽으로 만들 수 있습니다. + + 빛나는 주괴입니다. 주괴로 도구를 만들면 주괴와 재질이 같은 도구가 제작됩니다. 화로에서 광석을 녹여 만듭니다. - - 다이아몬드 곡괭이로만 얻을 수 있습니다. 물과 용암을 섞어 만들어내며, 차원문의 재료가 됩니다. + + 주괴, 보석, 염료를 설치 가능한 블록으로 만들 수 있게 해줍니다. 값비싼 건설용 블록으로 쓰거나 광물을 간편하게 보관하는 데 사용됩니다. - - 괴물을 소환합니다. + + 플레이어나 동물 또는 괴물이 밟으면 전기를 보냅니다. 나무 압력판은 위쪽에 물체를 떨어뜨려도 작동합니다. - - 땅 위에 놓아 전기를 흐르게 합니다. 물약과 함께 양조하면 효과 시간을 증가시킬 수 있습니다. + + 착용 시 8의 방어력을 얻습니다. - - 다 자란 작물을 수확하면 밀을 얻습니다. + + 착용 시 6의 방어력을 얻습니다. - - 씨앗을 심을 수 있게 준비된 땅입니다. + + 착용 시 3의 방어력을 얻습니다. - - 화로를 사용하여 초록 선인장 염료를 만들 수 있습니다. + + 착용 시 6의 방어력을 얻습니다. - - 설탕을 만드는 데 사용합니다. + + 철문은 레드스톤, 버튼 또는 스위치로만 열 수 있습니다. - - 투구처럼 머리에 쓰거나 횃불과 조합하여 호박등으로 만들 수 있습니다. 호박 파이의 주재료이기도 합니다. + + 착용 시 1의 방어력을 얻습니다. - - 불이 붙으면 영원히 타오릅니다. + + 착용 시 3의 방어력을 얻습니다. - - 위를 지나가는 것들의 속도를 늦춥니다. + + 나무로 된 블록을 손을 사용할 때보다 더 빨리 잘라냅니다. - - 차원문을 통해서 지상과 지하를 오갈 수 있습니다. + + 흙과 잡초 블록을 갈아엎어서 작물을 기를 수 있게 만듭니다. - - 화로의 연료, 혹은 횃불 제작의 재료로 사용됩니다. + + 나무문은 사용하거나 때려서 또는 레드스톤으로 열 수 있습니다. - - 거미를 잡으면 얻을 수 있으며 활 또는 낚싯대의 재료로 쓰입니다. 땅에 놓아 철사로 만들 수도 있습니다. + + 착용 시 2의 방어력을 얻습니다. - - 닭을 잡으면 얻을 수 있습니다. 화살의 재료입니다. + + 착용 시 4의 방어력을 얻습니다. - - Creeper를 처치하여 얻습니다. TNT를 만들거나 물약을 양조하는 재료로 사용할 수 있습니다. + + 착용 시 1의 방어력을 얻습니다. - - 농지에 심어 작물로 가꿔냅니다. 씨앗을 기르려면 충분한 빛이 있어야 합니다. + + 착용 시 2의 방어력을 얻습니다. - - 작물을 수확하여 얻습니다. 식량으로 만들 수 있습니다. + + 착용 시 1의 방어력을 얻습니다. - - 자갈을 파내서 얻을 수 있습니다. 부싯돌과 부시를 만드는 재료입니다. + + 착용 시 2의 방어력을 얻습니다. - - 돼지에 사용하면 돼지를 타고 다닐 수 있습니다. 당근 꼬치를 이용해 돼지의 방향을 조정할 수 있습니다. + + 착용 시 5의 방어력을 얻습니다. - - 눈을 파헤쳐서 획득하며, 집어던질 수 있습니다. + + 작은 계단을 만드는 데 사용됩니다. - - 소를 잡으면 얻을 수 있으며 방어구의 재료로 쓰거나 책을 만들 수 있습니다. + + 버섯죽을 담아두는 데 사용합니다. 죽을 먹어도 그릇은 남습니다. - - 슬라임을 처치하여 얻습니다. 물약을 양조하는 재료로 사용하거나 끈끈이 피스톤을 만드는 데 사용할 수 있습니다. + + 물이나 용암, 우유를 담아두거나 운반하는 데 쓰입니다. - - 닭이 무작위로 낳습니다. 식량으로 만들 수 있습니다. + + 물을 저장하고 옮기는 데 사용합니다. - - 발광석을 채굴해서 얻습니다. 제작을 거쳐 다시 발광석 블록으로 만들거나 물약과 함께 양조해 효과를 증가시킬 수 있습니다. + + 자신이나 다른 플레이어가 입력한 텍스트를 표시합니다. - - 해골을 처치하여 얻습니다. 뼛가루로 만들 수 있습니다. 늑대에게 먹이면 길들일 수 있습니다. + + 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. - - 해골이 Creeper를 처치하도록 유도해서 얻습니다. 주크박스에서 재생이 가능합니다. + + 폭발을 일으킵니다. 설치한 다음, 부싯돌과 부시를 사용하거나 전기를 이용해 폭파할 수 있습니다. - - 불을 꺼뜨리고 작물의 성장을 돕습니다. 양동이에 담을 수 있습니다. + + 용암을 저장하고 옮기는 데 사용합니다. - - 부수면 일정 확률로 묘목이 나옵니다. 묘목을 심어 나무로 가꿀 수 있습니다. + + 태양과 달의 위치를 표시합니다. - - 던전에서 찾을 수 있으며 건설과 장식에 사용됩니다. + + 시작 지점을 표시합니다. - - 양에게서 양털을 얻거나 나뭇잎 블록을 수확하는 데 사용합니다. + + 지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. - - 동력을 공급(버튼, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. + + 우유를 저장하고 옮기는 데 사용합니다. - - 동력을 공급(버튼, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. 피스톤이 줄어들면 다시 블록을 끌어옵니다. + + 불꽃을 일으키고, TNT를 폭파하고, 차원문을 여는 데 사용합니다. - - 돌로 된 블록으로 만들며 주로 요새에서 볼 수 있습니다. + + 물고기를 잡을 수 있습니다. - - 울타리처럼 방어벽으로 사용됩니다. + + 사용하거나 때리거나 레드스톤을 이용해 작동시킵니다. 작동 방식은 일반 문과 같지만 개별적 블록으로 간주되며, 땅과 수평인 형태로 열립니다. - - 문과 비슷하지만 울타리와 함께 사용됩니다. + + 건설 재료로 쓰거나 다양한 물건의 재료로 사용됩니다. 어떤 형태의 나무로부터 만들어질 수 있습니다. - - 수박 조각의 재료입니다. + + 건설 재료로 사용됩니다. 일반 모래와 달리 중력의 영향을 받지 않습니다. - - 유리 대신 사용할 수 있는 투명 판자입니다. + + 건설 재료로 사용됩니다. - - 땅에 심어 호박으로 가꿔냅니다. - - - 땅에 심어 수박으로 가꿔냅니다. - - - Enderman이 죽을 때 떨어뜨립니다. Ender 진주를 던지면 진주가 떨어진 위치로 플레이어가 이동하며 체력을 잃습니다. - - - 흙 블록 위에 잡초가 자랐습니다. 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. - - - 건물을 짓거나 장식으로 사용됩니다. - - - 통과할 때 움직임이 느려집니다. 가위로 잘라 실을 얻을 수 있습니다. - - - 파괴될 때 Silverfish를 소환합니다. 근처에 있는 Silverfish가 공격을 받아도 Silverfish를 소환합니다. - - - 놓은 후 시간이 지나면 자라납니다. 가위를 사용하여 수확할 수 있습니다. 사다리처럼 타고 올라갈 수 있습니다. - - - 얼음 위를 걸어가면 미끄러집니다. 파괴되었을 때 아래에 다른 블록이 있으면 물로 변합니다. 광원이나 지하 가까이 있으면 녹습니다. - - - 장식으로 사용할 수 있습니다. - - - 물약 양조와 요새 위치 탐색에 사용합니다. 지하 요새 근처나 내부에 주로 서식하는 Blaze가 떨어뜨립니다. - - - 물약 양조에 사용합니다. Ghast가 죽을 때 떨어뜨립니다. - - - 좀비 Pigman이 죽을 때 떨어뜨립니다. 좀비 Pigman은 지하에서 찾아볼 수 있습니다. 물약을 양조하는 재료로 사용됩니다. - - - 물약 양조에 사용합니다. 이것은 지하 요새에서 자연 상태로 자라는 것을 찾을 수 있습니다. 또한 영혼 모래에 심을 수 있습니다. - - - 사용하면 재료에 따라 다양한 효과를 얻을 수 있습니다. - - - 물을 채울 수 있으며 양조대에서 물약을 만드는 기본 재료로 사용할 수 있습니다. - - - 독이 든 음식이자 양조용 아이템입니다. 플레이어가 거미나 동굴 거미를 죽일 때 떨어뜨립니다. - - - 물약 양조에 사용합니다. 주로 해로운 효과의 물약을 만드는 데 사용합니다. - - - 물약 양조에 사용합니다. 다른 아이템과 조합하여 Ender의 눈이나 마그마 크림으로 만들 수 있습니다. - - - 물약 양조에 사용합니다. - - - 물약과 폭발 물약을 만드는 데 사용합니다. - - - 물 양동이를 사용하거나 빗물로 채울 수 있습니다. 가마솥에 유리병을 사용하면 유리병에 물을 채울 수 있습니다. - - - 던지면 Ender 관문으로 가는 방향을 표시합니다. 열두 개를 Ender 관문 외형에 올려놓으면 Ender 관문이 열립니다. - - - 물약 양조에 사용합니다. - - - 잡초 블록과 비슷하나 버섯을 키우기에 좋습니다. - - - 물에 뜹니다. 수련잎 위로 걸어 다닐 수도 있습니다. - - - 지하 요새 건설에 쓰입니다. Ghast의 불덩이에 피해를 받지 않습니다. - - - 지하 요새에 쓰입니다. - - - 지하 요새에서 찾을 수 있습니다. 부서지면 지하 사마귀를 떨어뜨립니다. - - - 플레이어의 경험치를 사용해 검, 곡괭이, 도끼, 삽, 활 및 방어구에 효과를 부여할 수 있습니다. - - - Ender의 눈 열두 개를 사용하면 열립니다. 플레이어를 Ender 차원으로 보냅니다. - - - Ender 관문을 형성하는 데 쓰입니다. - - - Ender에서 찾을 수 있는 블록 유형입니다. 폭발에 견디는 능력이 매우 강해 건물을 짓는 데 적합합니다. - - - Ender 드래곤을 처치하면 생성되는 블록입니다. - - - 이 아이템을 던지면, 플레이어에게 경험치를 주는 경험치 구체를 떨어뜨립니다. - - - 불을 붙이는 데 유용합니다. 장비를 사용하면 무차별적으로 불을 지를 수 있습니다. - - - 진열장과 비슷하며 진열장에 있는 아이템이나 블록을 보여줍니다. - - - 던지면 지정된 생물 유형이 생성될 수 있습니다. - - + 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. - - 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + 긴 계단을 만드는 데 사용됩니다. 각 계단의 꼭대기에 있는 두 개의 발판은 보통 크기의 발판 블록을 만들어냅니다. - - 화로에서 지하 바위를 녹여 만듭니다. 지하 벽돌의 재료입니다. + + 빛을 만드는 데 사용합니다. 눈과 얼음도 녹일 수 있습니다. - - 동력을 공급하면 빛을 냅니다. + + 횃불, 화살, 표지판, 사다리, 울타리를 만들거나 무기 또는 도구의 손잡이로 사용됩니다. - - 재배하여 코코아 콩을 얻을 수 있습니다. + + 블록과 아이템을 넣어 보관합니다. 상자 2개를 나란히 놓으면 용량이 2배 큰 상자가 만들어집니다. - - 괴물 머리는 장식용으로 놓아둘 수도 있고, 투구 슬롯에 놓아 마스크로 쓸 수도 있습니다. + + 뛰어넘을 수 없는 방어벽으로 사용됩니다. 플레이어나 동물, 괴물에 대해서는 1.5배 높이의 블록으로 간주되지만 다른 블록에 대해서는 높이가 같은 것으로 간주됩니다. - - 오징어 + + 수직 경사를 오를 때 사용합니다. - - 잡으면 먹물 주머니를 얻을 수 있습니다. + + 밤에 모든 플레이어가 침대에 들면 시간을 앞당겨서 아침으로 만들며, 플레이어 생성 지점을 바꿉니다. +침대 제작에 사용된 양털의 색과 상관없이, 침대의 색상은 모두 같습니다. - - + + 일반적인 제작보다 더 다양한 아이템을 선택해 제작할 수 있게 해줍니다. - - 잡으면 가죽을 얻을 수 있습니다. 또한 우유를 짜서 양동이에 담을 수 있습니다. - - - - - - 가위를 사용하면 양털을 얻을 수 있습니다. 이미 털을 깎았다면 양털이 나오지 않습니다. 털을 염색하여 색을 바꿀 수 있습니다. - - - - - - 잡으면 깃털이 나옵니다. 가끔 알을 낳습니다. - - - 돼지 - - - 잡으면 돼지고기를 얻을 수 있습니다. 안장을 사용하면 타고 다닐 수 있습니다. - - - 늑대 - - - 공격받기 전까지는 위협적이지 않으며, 공격하면 뒤를 습격합니다. 뼈를 이용해서 길들이면 데리고 다닐 수 있으며, 플레이어를 공격하는 대상을 공격합니다. - - - 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 - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kagstrom - - - Tobias Mollstam - - - Rise Lugo - - - 목검 - - - 돌 검 - - - 철제 검 - - - 다이아몬드 검 - - - 황금 검 - - - 나무 삽 - - - 돌 삽 - - - 철제 삽 - - - 다이아몬드 삽 - - - 황금 삽 - - - 나무 곡괭이 - - - 돌 곡괭이 - - - 철제 곡괭이 - - - 다이아몬드 곡괭이 - - - 황금 곡괭이 - - - 나무 도끼 - - - 돌 도끼 + + 광석을 녹이고 숯과 유리를 만들며, 생선과 돼지고기를 요리하는 데 사용합니다. 철제 도끼 - - 다이아몬드 도끼 + + 레드스톤 램프 - - 황금 도끼 + + 정글 나무 계단 - - 나무 괭이 + + 자작나무 계단 - - 돌 괭이 + + 현재 컨트롤 - - 철제 괭이 - - - 다이아몬드 괭이 - - - 황금 괭이 - - - 나무문 - - - 철문 - - - 사슬 투구 - - - 사슬 가슴보호구 - - - 사슬 다리보호구 - - - 사슬 장화 - - - 가죽 모자 - - - 철제 투구 - - - 다이아몬드 투구 - - - 황금 투구 - - - 가죽 조끼 - - - 철제 흉갑 - - - 다이아몬드 흉갑 - - - 황금 흉갑 - - - 가죽 바지 - - - 철제 다리보호구 - - - 다이아몬드 다리보호구 - - - 황금 다리보호구 - - - 가죽 장화 - - - 철제 장화 - - - 다이아몬드 장화 - - - 황금 장화 - - - 철 주괴 - - - 황금 주괴 - - - 양동이 - - - 물 양동이 - - - 용암 양동이 - - - 부싯돌과 부시 - - - 사과 - - - - - - 화살 - - - 석탄 - - - - - - 다이아몬드 - - - 막대 - - - 그릇 - - - 버섯죽 - - - - - - 깃털 - - - 화약 - - - 밀 씨앗 - - - - - - - - - 부싯돌 - - - 돼지 날고기 - - - 구운 돼지고기 - - - 그림 액자 - - - 황금 사과 - - - 표지판 - - - 광물 수레 - - - 안장 - - - 레드스톤 - - - 눈덩이 - - - - - - 가죽 - - - 우유 양동이 - - - 벽돌 - - - 찰흙 - - - 사탕수수 - - - 종이 - - - - - - 슬라임 볼 - - - 상자가 담긴 광물 수레 - - - 화로가 달린 광물 수레 - - - 달걀 - - - 나침반 - - - 낚싯대 - - - 시계 - - - 발광석 가루 - - - 날생선 - - - 요리한 생선 - - - 염료 가루 - - - 먹물 주머니 - - - 붉은 장미 염료 - - - 초록 선인장 염료 - - - 코코아 열매 - - - 청금석 - - - 보라색 염료 - - - 청록색 염료 - - - 밝은 회색 염료 - - - 회색 염료 - - - 분홍색 염료 - - - 라임색 염료 - - - 노란색 염료 - - - 밝은 파란색 염료 - - - 자주색 염료 - - - 주황색 염료 - - - 뼛가루 - - - - - - 설탕 - - - 케이크 - - - 침대 - - - 레드스톤 탐지기 - - - 쿠키 - - - 지도 - - - 음악 디스크 - "13" - - - 음악 디스크 - "cat" - - - 음악 디스크 - "blocks" - - - 음악 디스크 - "chirp" - - - 음악 디스크 - "far" - - - 음악 디스크 - "mall" - - - 음악 디스크 - "mellohi" - - - 음악 디스크 - "stal" - - - 음악 디스크 - "strad" - - - 음악 디스크 - "ward" - - - 음악 디스크 - "11" - - - 음악 디스크 - "where are we now" - - - 가위 - - - 호박씨 - - - 수박씨 - - - 닭 날고기 - - - 구운 닭고기 - - - 소 날고기 - - - 스테이크 - - - 썩은 살점 - - - Ender 진주 - - - 수박 조각 - - - Blaze 막대 - - - Ghast의 눈물 - - - 금덩이 - - - 지하 사마귀 - - - {*splash*}{*prefix*}물약 {*postfix*} - - - 유리병 - - - 물병 - - - 거미 눈 - - - 발효 거미 눈 - - - Blaze 가루 - - - 마그마 크림 - - - 양조대 - - - 가마솥 - - - Ender의 눈 - - - 빛나는 수박 - - - 경험치 병 - - - 불쏘시개 - - - 불쏘시개 (숯) - - - 불쏘시개 (석탄) - - - 아이템 외형 - - - {*CREATURE*} 생성 - - - 지하 벽돌 - - + 두개골 - - 해골 두개골 + + 코코아 - - 말라비틀어진 해골 두개골 + + 전나무 계단 - - 좀비 머리 + + 용의 알 - - 머리 + + Ender 돌 - - %s의 머리 + + Ender 차원문 외형 - - Creeper 머리 + + 사암 계단 - - + + 양치식물 - - 잡초 블록 + + 관목 - - + + 배치 - - 조약돌 + + 제작 - - 참나무 목재 판자 + + 사용 - - 전나무 목재 판자 + + 행동 - - 자작나무 목재 판자 + + 살금살금 걷기/아래로 비행 - - 정글 나무 판자 + + 살금살금 걷기 - - 묘목 + + 버리기 - - 참나무 묘목 + + 아이템 교체 - - 전나무 묘목 + + 일시 중지 - - 자작나무 묘목 + + 보기 - - 정글 묘목 + + 이동/질주 - - 기반암 + + 소지품 - - + + 점프/위로 비행 - - 용암 + + 점프 - - 모래 + + Ender 차원문 - - 사암 + + 호박 줄기 - - 자갈 + + 수박 - - 황금 광석 + + 유리 판자 - - 철광석 + + 울타리 문 - - 석탄 광석 + + 덩굴 - - 나무 + + 수박 줄기 - - 참나무 목재 + + 철 막대 - - 전나무 목재 + + 금이 간 돌 벽돌 - - 자작나무 목재 + + 이끼 낀 돌 벽돌 - - 정글 나무 + + 돌 벽돌 + + + 버섯 + + + 버섯 + + + 깎아놓은 돌 벽돌 + + + 벽돌 계단 + + + 지하 사마귀 + + + 지하 벽돌 계단 + + + 지하 벽돌 울타리 + + + 가마솥 + + + 양조대 + + + 효과부여대 + + + 지하 벽돌 + + + 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*}를 누르고 있으면 손이나 도구를 사용해 땅을 파거나 나무를 벱니다. 특정 블록은 도구를 만들어야 파낼 수 있습니다. + + + {*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는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있는 게임입니다. +밤에는 괴물이 출몰하므로, 그에 대비하여 피신처를 준비해둬야 합니다. + + + + + + + + + + + + + + + + + + + + + + + + 배치 1 + + + 이동(비행 시) + + + 플레이어/초대 + + + + + + 배치 3 + + + 배치 2 + + + + + + + + + + + + + + + {*B*}{*CONTROLLER_VK_A*} 버튼을 누르면 튜토리얼을 시작합니다.{*B*} + 게임을 시작할 준비가 되었으면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + {*B*}{*CONTROLLER_VK_A*} 버튼을 누르면 계속합니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + Silverfish 블록 + + + 돌 발판 + + + 철을 저장하는 간편한 방법입니다. + + + 철 블록 + + + 참나무 발판 + + + 사암 발판 + + + 돌 발판 + + + 황금을 저장하는 간편한 방법입니다. + + + + + + 흰색 양털 + + + 주황색 양털 + + + 황금 블록 + + + 버섯 + + + 장미 + + + 조약돌 발판 + + + 책장 + + + TNT + + + 벽돌 + + + 횃불 + + + 흑요석 + + + 이끼 낀 돌 + + + 지하 벽돌 발판 + + + 참나무 발판 + + + 돌 벽돌 발판 + + + 벽돌 발판 + + + 정글 나무 발판 + + + 자작나무 발판 + + + 전나무 발판 + + + 자주색 양털 + + + 자작나무 나뭇잎 + + + 전나무 나뭇잎 + + + 참나무 나뭇잎 + + + 유리 + + + 스펀지 + + + 정글 잎사귀 + + + 나뭇잎 참나무 @@ -2124,709 +4950,676 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 자작나무 - - 나뭇잎 + + 전나무 목재 - - 참나무 나뭇잎 + + 자작나무 목재 - - 전나무 나뭇잎 - - - 자작나무 나뭇잎 - - - 정글 잎사귀 - - - 스펀지 - - - 유리 + + 정글 나무 양털 - - 검은색 양털 - - - 빨간색 양털 - - - 초록색 양털 - - - 갈색 양털 - - - 파란색 양털 - - - 보라색 양털 - - - 청록색 양털 - - - 밝은 회색 양털 + + 분홍색 양털 회색 양털 - - 분홍색 양털 - - - 라임색 양털 - - - 노란색 양털 + + 밝은 회색 양털 밝은 파란색 양털 - - 자주색 양털 + + 노란색 양털 - - 주황색 양털 + + 라임색 양털 - - 흰색 양털 + + 청록색 양털 - - + + 초록색 양털 - - 장미 + + 빨간색 양털 - - 버섯 + + 검은색 양털 - - 황금 블록 + + 보라색 양털 - - 황금을 저장하는 간편한 방법입니다. + + 파란색 양털 - - 철 블록 - - - 철을 저장하는 간편한 방법입니다. - - - 돌 발판 - - - 돌 발판 - - - 사암 발판 - - - 참나무 발판 - - - 조약돌 발판 - - - 벽돌 발판 - - - 돌 벽돌 발판 - - - 참나무 발판 - - - 전나무 발판 - - - 자작나무 발판 - - - 정글 나무 발판 - - - 지하 벽돌 발판 - - - 벽돌 - - - TNT - - - 책장 - - - 이끼 낀 돌 - - - 흑요석 - - - 횃불 + + 갈색 양털 횃불(석탄) - - 횃불(숯) - - - - - - 괴물 출입문 - - - 참나무 계단 - - - 상자 - - - 레드스톤 가루 - - - 다이아몬드 광석 - - - 다이아몬드 블록 - - - 다이아몬드를 저장하는 간편한 방법입니다. - - - 작업대 - - - 작물 - - - 농지 - - - 화로 - - - 표지판 - - - 나무문 - - - 사다리 - - - 레일 - - - 동력 레일 - - - 탐지 레일 - - - 돌 계단 - - - 손잡이 - - - 압력판 - - - 철문 - - - 레드스톤 광석 - - - 레드스톤 횃불 - - - 버튼 - - - - - - 얼음 - - - 선인장 - - - 찰흙 - - - 사탕수수 - - - 주크박스 - - - 울타리 - - - 호박 - - - 호박등 - - - 지하 바위 + + 발광석 영혼 모래 - - 발광석 - - - 차원문 - - - 청금석 광석 + + 지하 바위 청금석 블록 + + 청금석 광석 + + + 차원문 + + + 호박등 + + + 사탕수수 + + + 찰흙 + + + 선인장 + + + 호박 + + + 울타리 + + + 주크박스 + 청금석을 저장하는 간편한 방법입니다. - - 디스펜서 - - - 소리 블록 - - - 케이크 - - - 침대 - - - 거미줄 - - - 긴 잡초 - - - 마른 덤불 - - - 다이오드 - - - 잠긴 상자 - 들창 - - 양털(모든 색상) + + 잠긴 상자 - - 피스톤 + + 다이오드 끈끈이 피스톤 - - Silverfish 블록 + + 피스톤 - - 돌 벽돌 + + 양털(모든 색상) - - 이끼 낀 돌 벽돌 + + 마른 덤불 - - 금이 간 돌 벽돌 + + 케이크 - - 깎아놓은 돌 벽돌 + + 소리 블록 - - 버섯 + + 디스펜서 - - 버섯 + + 긴 잡초 - - 철 막대 + + 거미줄 - - 유리 판자 + + 침대 - - 수박 + + 얼음 - - 호박 줄기 + + 작업대 - - 수박 줄기 + + 다이아몬드를 저장하는 간편한 방법입니다. - - 덩굴 + + 다이아몬드 블록 - - 울타리 문 + + 화로 - - 벽돌 계단 + + 농지 - - 돌 벽돌 계단 + + 작물 - - Silverfish 돌 + + 다이아몬드 광석 - - Silverfish 조약돌 + + 괴물 출입문 - - Silverfish 돌 벽돌 + + - - 균사체 + + 횃불(숯) - - 수련잎 + + 레드스톤 가루 - - 지하 벽돌 + + 상자 - - 지하 벽돌 울타리 + + 참나무 계단 - - 지하 벽돌 계단 + + 표지판 - - 지하 사마귀 + + 레드스톤 광석 - - 효과부여대 + + 철문 - - 양조대 + + 압력판 - - 가마솥 + + - - Ender 차원문 + + 버튼 - - Ender 차원문 외형 + + 레드스톤 횃불 - - Ender 돌 + + 손잡이 - - 용의 알 + + 레일 - - 관목 + + 사다리 - - 양치식물 + + 나무문 - - 사암 계단 + + 돌 계단 - - 전나무 계단 + + 탐지 레일 - - 자작나무 계단 - - - 정글 나무 계단 - - - 레드스톤 램프 - - - 코코아 - - - 두개골 - - - 현재 컨트롤 - - - 배치 - - - 이동/질주 - - - 보기 - - - 일시 중지 - - - 점프 - - - 점프/위로 비행 - - - 소지품 - - - 아이템 교체 - - - 행동 - - - 사용 - - - 제작 - - - 버리기 - - - 살금살금 걷기 - - - 살금살금 걷기/아래로 비행 - - - 카메라 모드 변경 - - - 플레이어/초대 - - - 이동(비행 시) - - - 배치 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;]]> - - - <![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*} 버튼을 누르면 계속합니다. - - - {*B*}{*CONTROLLER_VK_A*} 버튼을 누르면 튜토리얼을 시작합니다.{*B*} - 게임을 시작할 준비가 되었으면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - Minecraft는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있는 게임입니다. -밤에는 괴물이 출몰하므로, 그에 대비하여 피신처를 준비해둬야 합니다. - - - {*CONTROLLER_ACTION_LOOK*}로 위와 아래, 주변을 둘러봅니다. - - - {*CONTROLLER_ACTION_MOVE*}으로 이동합니다. - - - 질주하려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. {*CONTROLLER_ACTION_MOVE*}을 계속 누르고 있으면 캐릭터의 질주 시간이나 음식이 다 떨어질 때까지 계속 질주합니다. - - - {*CONTROLLER_ACTION_JUMP*}를 눌러 점프합니다. - - - {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손이나 도구를 사용해 땅을 파거나 나무를 벱니다. 특정 블록은 도구를 만들어야 파낼 수 있습니다. - - - {*CONTROLLER_ACTION_ACTION*}를 길게 눌러서 나무 블록 4개(나무둥치)를 베어보십시오. {*B*}블록이 파괴되고 공중에 뜬 형태로 아이템이 나타나면, 다가가서 집을 수 있습니다. 집은 아이템은 소지품에 표시됩니다. - - - {*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 인터페이스를 엽니다. - - - 아이템을 수집하고 제작하면 소지품이 찹니다.{*B*} - 소지품을 열려면 {*CONTROLLER_ACTION_INVENTORY*}을 누르십시오. - - - 이동, 채광 및 공격을 하면 음식 막대 {*ICON_SHANK_01*}를 소비합니다. 질주하거나 질주 점프를 하면 일반적으로 걷거나 달리는 것보다 더 많이 음식 막대를 소비합니다. - - - 음식 막대가 9칸 이상{*ICON_SHANK_01*}일 때는 체력을 잃어도 자동으로 다시 회복됩니다. 음식을 먹으면 음식 막대가 다시 차오릅니다. - - - 손에 음식 아이템을 들고 있을 때 {*CONTROLLER_ACTION_USE*}를 길게 누르면 음식을 먹어서 음식 막대를 채웁니다. 음식 막대가 가득 찬 상태에서는 음식을 먹을 수 없습니다. - - - 음식 막대가 낮고 체력을 잃은 상태입니다. 소지품에 있는 스테이크를 먹으면 음식 막대가 차오르고 체력이 회복되기 시작합니다.{*ICON*}364{*/ICON*} - - - 게임에서 획득한 나무는 판자로 만들 수 있습니다. 판자를 만들려면 제작 인터페이스를 여십시오.{*PlanksIcon*} - - - 많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. 작업대를 만들어 보십시오.{*CraftingTableIcon*} - - - 블록에서 아이템을 더 빨리 얻으려면 해당 작업에 맞는 도구를 만들어야 합니다. 일부 도구는 막대로 된 손잡이가 달려 있습니다. 막대를 몇 개 만들어 보십시오.{*SticksIcon*} - - - {*CONTROLLER_ACTION_LEFT_SCROLL*} 과{*CONTROLLER_ACTION_RIGHT_SCROLL*}로 손에 들고 있는 아이템을 다른 아이템으로 바꿀 수 있습니다. - - - 아이템을 사용하거나, 조작하거나, 내려놓으려면 {*CONTROLLER_ACTION_USE*}를 누르십시오. 내려놓은 아이템에 올바른 도구를 사용하여 채굴 동작을 취하면 아이템을 다시 집을 수 있습니다. - - - 작업대를 선택했으면 포인터를 원하는 곳에 둔 다음 {*CONTROLLER_ACTION_USE*}를 눌러 작업대를 놓으십시오. - - - 포인터를 작업대에 맞추고 {*CONTROLLER_ACTION_USE*}를 눌러 여십시오. - - - 삽을 사용하면 흙이나 눈처럼 부드러운 블록을 더 빨리 파냅니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있습니다. 나무 삽을 만드십시오.{*WoodenShovelIcon*} - - - 도끼를 사용하면 나무와 나무 블록을 더 빨리 벱니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있습니다. 나무 도끼를 만드십시오.{*WoodenHatchetIcon*} - - - 곡괭이는 돌이나 광물처럼 단단한 블록을 더 빨리 파게 해줍니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있으며, 더 단단한 재료도 파낼 수 있습니다. 나무 곡괭이를 만드십시오.{*WoodenPickaxeIcon*} - - - 보관함 열기 - - - - 밤은 순식간에 찾아오며, 준비하지 않은 상태로 밖에 나가면 위험합니다. 방어구와 무기를 만들어 사용할 수 있지만, 안전한 피신처를 찾는 것이 더 좋습니다. - - - - - 근처에 버려진 광부의 피신처가 있습니다. 이곳이라면 밤을 안전하게 보낼 수 있습니다. - - - - - 피신처를 세울 자원을 모아야 합니다. 벽과 지붕은 아무 블록이나 사용해도 되지만 문과 창문, 조명을 설치하려면 특정 재료가 필요합니다. - - - - 곡괭이를 사용해서 돌 블록을 채굴하십시오. 돌 블록을 채굴하면 조약돌이 나옵니다. 조약돌 8개를 모으면 화로를 만들 수 있습니다. 돌 블록에 도달하려면 흙을 파야 할 수도 있으며, 이때는 삽을 사용하십시오.{*StoneIcon*} + + 동력 레일 화로를 만들 수 있을 만큼 조약돌을 모았습니다. 작업대에서 화로를 만드십시오. - - {*CONTROLLER_ACTION_USE*}를 눌러 화로를 설치한 다음 화로를 여십시오. + + 낚싯대 - - 화로를 사용해서 숯을 만드십시오. 숯이 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? + + 시계 - - 화로를 사용해서 유리를 만드십시오. 유리가 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? + + 발광석 가루 - - 좋은 피신처를 만들려면, 출입할 때마다 벽을 허물고 다시 쌓을 필요가 없도록 문을 달아야 합니다. 나무문을 만들어 보십시오.{*WoodenDoorIcon*} + + 화로가 달린 광물 수레 - - {*CONTROLLER_ACTION_USE*}를 눌러 문을 설치하십시오. {*CONTROLLER_ACTION_USE*}로 나무문을 열거나 닫아 월드로 출입할 수 있습니다. + + 달걀 - - 밤에는 매우 어두워지므로, 피신처 안에서 잘 볼 수 있도록 조명이 있어야 합니다. 제작 인터페이스에서 막대와 숯을 이용해 횃불을 만드십시오.{*TorchIcon*} + + 나침반 - - 튜토리얼 1장을 마쳤습니다. + + 날생선 - - {*B*} - 튜토리얼을 계속 진행하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 게임을 시작할 준비가 됐다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 붉은 장미 염료 - + + 초록 선인장 염료 + + + 코코아 열매 + + + 요리한 생선 + + + 염료 가루 + + + 먹물 주머니 + + + 상자가 담긴 광물 수레 + + + 눈덩이 + + + + + + 가죽 + + + 광물 수레 + + + 안장 + + + 레드스톤 + + + 우유 양동이 + + + 종이 + + + + + + 슬라임 볼 + + + 벽돌 + + + 찰흙 + + + 사탕수수 + + + 청금석 + + + 지도 + + + 음악 디스크 - "13" + + + 음악 디스크 - "cat" + + + 침대 + + + 레드스톤 탐지기 + + + 쿠키 + + + 음악 디스크 - "blocks" + + + 음악 디스크 - "mellohi" + + + 음악 디스크 - "stal" + + + 음악 디스크 - "strad" + + + 음악 디스크 - "chirp" + + + 음악 디스크 - "far" + + + 음악 디스크 - "mall" + + + 케이크 + + + 회색 염료 + + + 분홍색 염료 + + + 라임색 염료 + + + 보라색 염료 + + + 청록색 염료 + + + 밝은 회색 염료 + + + 노란색 염료 + + + 뼛가루 + + + + + + 설탕 + + + 밝은 파란색 염료 + + + 자주색 염료 + + + 주황색 염료 + + + 표지판 + + + 가죽 조끼 + + + 철제 흉갑 + + + 다이아몬드 흉갑 + + + 철제 투구 + + + 다이아몬드 투구 + + + 황금 투구 + + + 황금 흉갑 + + + 황금 다리보호구 + + + 가죽 장화 + + + 철제 장화 + + + 가죽 바지 + + + 철제 다리보호구 + + + 다이아몬드 다리보호구 + + + 가죽 모자 + + + 돌 괭이 + + + 철제 괭이 + + + 다이아몬드 괭이 + + + 다이아몬드 도끼 + + + 황금 도끼 + + + 나무 괭이 + + + 황금 괭이 + + + 사슬 가슴보호구 + + + 사슬 다리보호구 + + + 사슬 장화 + + + 나무문 + + + 철문 + + + 사슬 투구 + + + 다이아몬드 장화 + + + 깃털 + + + 화약 + + + 밀 씨앗 + + + 그릇 + + + 버섯죽 + + + + + + + + + 구운 돼지고기 + + + 그림 액자 + + + 황금 사과 + + + + + + 부싯돌 + + + 돼지 날고기 + + + 막대 + + + 양동이 + + + 물 양동이 + + + 용암 양동이 + + + 황금 장화 + + + 철 주괴 + + + 황금 주괴 + + + 부싯돌과 부시 + + + 석탄 + + + + + + 다이아몬드 + + + 사과 + + + + + + 화살 + + + 음악 디스크 - "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*} 버튼을 누르십시오. + + + 이 화면은 화로 인터페이스입니다. 화로에서는 아이템에 열을 가하여 다른 아이템으로 바꿀 수 있습니다. 예를 들어, 화로에서 철광석을 가열하면 철 주괴가 만들어집니다. + + + 완성한 화로를 설치하십시오. 피신처 안에 설치하는 것이 좋습니다.{*B*} + {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. + + + 나무 + + + 참나무 목재 + + + 화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 변경할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작되며, 결과물은 오른쪽 슬롯에 들어옵니다. + + + {*B*} + {*CONTROLLER_VK_X*} 버튼을 눌러 소지품을 다시 여십시오. {*B*} 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + - {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. - 수량이 2개 이상일 때는 아이템을 전부 집으며, {*CONTROLLER_VK_X*} 버튼을 누르면 반만 집을 수 있습니다. + 이곳에서는 소지품을 확인할 수 있습니다. 이 화면에는 손에 들고 쓸 수 있는 아이템과 가지고 다닐 수 있는 아이템이 모두 표시됩니다. 방어구 또한 이곳에서 확인할 수 있습니다. + + + + {*B*} + 튜토리얼을 계속 진행하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 게임을 시작할 준비가 됐다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 떨어뜨릴 수 있습니다. @@ -2835,29 +5628,82 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 포인터로 집은 아이템이 여러 개일 때 {*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_VK_BACK*}를 누르십시오. + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}를 누르십시오. + - - 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + 이것은 제작 인터페이스입니다. 여기서 아이템을 조합하여 새 아이템을 만들 수 있습니다. + - - 이것은 창작 소지품입니다. 이 화면에는 손에 들고 쓸 수 있는 아이템 외에도 선택할 수 있는 모든 아이템이 함께 표시됩니다. + + 창작 모드 소지품을 닫으려면 {*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_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. - 아이템 목록에서 {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. {*CONTROLLER_VK_Y*} 버튼을 누르면 해당 아이템을 전부 집을 수 있습니다. + 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 월드에 떨어뜨릴 수 있습니다. 빠른 선택 막대에 있는 아이템을 모두 선택 취소하려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. @@ -2865,2167 +5711,212 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 포인터는 자동으로 사용 줄에서 칸 단위로 움직입니다. {*CONTROLLER_VK_A*} 버튼으로 아이템을 놓을 수 있습니다. 아이템을 놓으면 포인터가 아이템 목록으로 돌아가고 다른 아이템을 선택할 수 있습니다. - + - 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 월드에 떨어뜨릴 수 있습니다. 빠른 선택 막대에 있는 아이템을 모두 선택 취소하려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. + 아이템 목록에서 {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. {*CONTROLLER_VK_Y*} 버튼을 누르면 해당 아이템을 전부 집을 수 있습니다. - - - 상단의 그룹 유형 탭을 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 스크롤하여 획득하고 싶은 아이템의 그룹 유형을 선택하십시오. - + + - - 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_VK_BACK*}를 누르십시오. + + 유리병 - - 창작 모드 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + + 물병 - - - 이것은 제작 인터페이스입니다. 여기서 아이템을 조합하여 새 아이템을 만들 수 있습니다. - + + 거미 눈 - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 제작 방법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 금덩이 - - {*B*} - 아이템 설명을 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + 지하 사마귀 - - {*B*} - 현재 아이템을 만드는 데 필요한 재료를 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + {*splash*}{*prefix*}물약 {*postfix*} - - {*B*} - {*CONTROLLER_VK_X*} 버튼을 눌러 소지품을 다시 여십시오. + + 발효 거미 눈 - - - 화면 위쪽의 그룹 유형 탭에서 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}를 사용하여 제작할 아이템 종류를 선택한 다음, {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 선택하십시오. - + + 가마솥 - - - 작업 구역에는 새 아이템을 만드는 데 필요한 재료가 표시됩니다. {*CONTROLLER_VK_A*} 버튼을 눌러 아이템을 만든 다음 소지품에 넣으십시오. - + + Ender의 눈 - - 작업대를 사용하면 제작할 아이템을 더 다양하게 선택할 수 있습니다. 작업대에서도 제작 방법은 기본 제작과 같지만 작업 구역이 넓어지므로, 재료를 더 다양하게 조합할 수 있습니다. + + 빛나는 수박 - - 제작 인터페이스 오른쪽 아래에는 소지품이 표시됩니다. 여기에는 현재 선택한 아이템의 설명과, 해당 아이템을 만드는 데 필요한 재료가 표시됩니다. + + Blaze 가루 - - 현재 선택한 아이템의 설명이 표시되었습니다. 설명을 보면 아이템을 어디에 사용하는지 알 수 있습니다. + + 마그마 크림 - - 선택한 아이템을 만드는 데 필요한 재료 목록이 표시되었습니다. - - - 모아둔 나무를 이용해서 판자를 만들 수 있습니다. 판자 아이콘을 선택한 다음 {*CONTROLLER_VK_A*} 버튼을 눌러 판자를 만드십시오.{*PlanksIcon*} - - - 작업대가 완성됐습니다. 작업대를 월드에 설치해야 더 다양한 아이템을 만들 수 있습니다.{*B*} - {*CONTROLLER_VK_B*} 버튼을 눌러 작업 인터페이스를 닫으십시오. - - - {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 도구 그룹을 선택하십시오.{*ToolsIcon*} - - - {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 구조물 그룹을 선택하십시오.{*StructuresIcon*} - - - {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 바꿀 수 있습니다. 일부 아이템은 제작 재료에 따라 완성품이 달라집니다. 나무 삽을 선택하십시오.{*WoodenShovelIcon*} - - - 많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. {*CONTROLLER_MENU_NAVIGATE*}를 사용하면 제작할 아이템을 바꿀 수 있습니다. 작업대를 선택하십시오.{*CraftingTableIcon*} - - - 지금까지 만든 도구가 있으면 순조로운 출발을 할 수 있으며, 여러 자원을 더 효과적으로 확보하게 됩니다.{*B*} - {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. - - - 일부 아이템은 작업대가 아니라 화로에서 만들어야 합니다. 이제 화로를 만들어 보십시오.{*FurnaceIcon*} - - - 완성한 화로를 설치하십시오. 피신처 안에 설치하는 것이 좋습니다.{*B*} - {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. - - - 이 화면은 화로 인터페이스입니다. 화로에서는 아이템에 열을 가하여 다른 아이템으로 바꿀 수 있습니다. 예를 들어, 화로에서 철광석을 가열하면 철 주괴가 만들어집니다. - - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} - 화로 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 변경할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작되며, 결과물은 오른쪽 슬롯에 들어옵니다. - - - 나무로 된 아이템은 종종 땔감으로 쓸 수 있지만, 타는 시간은 아이템마다 다릅니다. 또한 주변에서도 연료로 사용할 아이템들을 찾을 수 있습니다. - - - 아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다. 다양한 재료를 실험해서 어떤 아이템이 만들어지는지 파악하십시오. - - - 나무를 재료로 사용하면 숯이 만들어집니다. 화로에 연료를 넣은 다음 재료 슬롯에 나무를 넣으십시오. 화로에서 숯이 완성될 때까지는 다소 시간이 필요하므로, 자유롭게 다른 일을 하다가 나중에 돌아와서 진행 상태를 확인하십시오. - - - 숯은 막대와 결합하여 횃불을 만들 수 있으며, 숯 자체로도 연료로 사용됩니다. - - - 재료 슬롯에 모래를 넣으면 유리가 만들어집니다. 피신처에 창문을 달려면 유리를 만드십시오. - - - 이것은 양조 인터페이스입니다. 여기서 다양한 효과를 지닌 물약을 만들 수 있습니다. - - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} - 양조대 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 위 슬롯에 재료를 넣고 아래 슬롯에 물병을 넣어 물약을 양조합니다. 한 번에 3병을 동시에 양조할 수 있습니다. 조합 조건이 갖추어지면 양조가 시작되고 잠시 후 물약이 완성됩니다. - - - 물약을 만들기 위해서는 우선 물병이 있어야 만들 수 있습니다. 그 후 지하 사마귀를 추가해 '이상한 물약'을 만든 다음, 하나 이상의 다른 재료를 넣는 방식으로 물약 대부분을 만들 수 있습니다. - - - 물약을 만든 다음에도 물약의 효과를 바꿀 수 있습니다. 레드스톤 가루를 넣으면 효과 지속 시간이 길어지고, 발광석 가루를 넣으면 효과가 더욱 강해집니다. - - - 발효 거미 눈을 넣으면 물약이 부패하여 반대 효과를 지니게 됩니다. 화약을 넣으면 던져서 주변에 효과를 적용할 수 있는 폭발 물약이 됩니다. - - - 물병에 지하 사마귀를 넣고 그다음 마그마 크림을 넣어 '물약 - 화염 저항'을 만드십시오. - - - {*CONTROLLER_VK_B*} 버튼을 누르면 양조 인터페이스에서 나갑니다. - - - 이곳에는 양조대와 가마솥, 그리고 양조용 아이템이 들어 있는 상자가 있습니다. - - - {*B*} - 양조와 물약에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 양조와 물약에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 물약 양조의 첫 번째 단계는 물병을 만드는 것입니다. 상자에서 유리병을 꺼내십시오. - - - 가마솥에 들어 있는 물이나 물 블록을 사용해 유리병에 물을 채우십시오. 수원을 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 물을 채웁니다. - - - 가마솥의 물이 떨어지면 물 양동이로 다시 채울 수 있습니다. - - - 양조대를 사용하여 '물약 - 화염 저항'을 만드십시오. 물병, 지하 사마귀와 마그마 크림이 필요합니다. - - - - 물약을 손에 든 상태에서 {*CONTROLLER_ACTION_USE*}를 길게 누르면 물약을 사용합니다. 일반 물약을 사용할 경우 물약을 마시면 효과가 자신에게 나타납니다. 폭발 물약을 사용할 경우 물약을 던지면 효과가 물약이 떨어진 곳 근처의 생물에게 나타납니다. - 일반 물약에 화약을 넣으면 폭발 물약을 만들 수 있습니다. - - - - '물약 - 화염 저항'을 자신에게 사용하십시오. - - - 이제 화염과 용암에 대한 저항력이 생겼습니다. 지금까지 통과할 수 없었던 장소도 통과할 수 있습니다. - - - 이것은 효과부여 인터페이스입니다. 무기, 방어구 및 일부 도구에 효과를 부여할 수 있습니다. - - - {*B*} - 효과부여 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 효과부여 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼를 누르십시오. - - - 아이템에 효과를 부여하려면 우선 아이템을 효과부여 슬롯에 넣으십시오. 무기, 방어구 및 일부 도구에 효과를 부여하면 특별한 효과를 얻을 수 있습니다. 예를 들어 방어력이 더 강해지거나, 블록을 채굴할 때 더 많은 아이템을 얻을 수 있게 됩니다. - - - 효과부여 슬롯에 아이템을 넣으면 오른쪽 버튼에 무작위로 부여할 효과가 표시됩니다. - - - 버튼에 쓰인 숫자는 아이템에 해당 효과를 부여할 때 필요한 경험치입니다. 경험치가 부족할 때는 단추를 선택할 수 없습니다. - - - 부여할 효과를 선택하고 {*CONTROLLER_VK_A*} 버튼을 누르면 아이템에 효과를 부여합니다. 부여할 효과 비용만큼 경험치가 줄어듭니다. - - - 효과는 무작위로 부여되지만, 성능이 더 좋은 효과 몇 종류는 더 많은 경험치를 지불하는 것은 물론 효과부여대 주위를 책장으로 둘러싸 강화해야 얻을 수 있습니다. - - - 여기에는 효과부여대와 효과부여에 사용할 수 있는 아이템이 있습니다. - - - {*B*} - 효과부여에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 효과부여에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - - 효과부여대를 사용하면 무기, 방어구 및 일부 도구에 특별한 효과를 부여할 수 있습니다. 예를 들어 블록을 채굴할 때 더 많은 아이템을 얻을 수 있는 효과나 방어력이 더 강해지는 효과 등이 있습니다. - - - 효과부여대 주변에 책장을 놓으면 효과부여대가 강화되어 더 높은 수준의 효과를 부여할 수 있습니다. - - - 아이템에 효과를 부여하려면 경험치가 필요합니다. 괴물 및 동물을 처치하면 나오는 경험치 구체를 모으거나, 광석을 채굴하거나, 동물을 교배하거나, 낚시를 하거나, 화로에서 특정 아이템을 녹이거나 요리하면 경험치를 얻을 수 있습니다. - - - 경험치 병을 사용해서도 경험치를 얻을 수 있습니다. 경험치 병을 던지면 병이 떨어진 곳에 경험치 구체가 나타납니다. - - - 이곳에 있는 상자에는 효과가 부여된 아이템과 경험치 병, 그리고 효과부여대를 시험해 볼 수 있는 아이템이 들어 있습니다. - - - 광물 수레에 탑승했습니다. 수레에서 나가려면 포인터를 수레에 맞춘 다음 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*MinecartIcon*} - - - {*B*} - 광물 수레에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 광물 수레에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 광물 수레는 레일을 따라 이동합니다. 화로를 동력으로 사용하여 움직이는 광물 수레나 상자가 담긴 광물 수레를 만들 수도 있습니다. - {*RailIcon*} - - - 레드스톤 횃불과 회로로 동력을 공급받아 광물 수레의 속도를 높여주는 동력 레일도 만들 수 있습니다. 스위치와 레버, 압력판으로 이러한 장치를 연결해 장치를 만드십시오. - {*PoweredRailIcon*} - - - 배를 타고 이동 중입니다. 배에서 내리려면 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*BoatIcon*} - - - {*B*} - 배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 배를 이용하면 물에서 더 빨리 이동할 수 있습니다. {*CONTROLLER_ACTION_MOVE*}과 {*CONTROLLER_ACTION_LOOK*}로 방향을 조정하십시오. - {*BoatIcon*} - - - 낚싯대를 사용하고 있습니다. 사용하려면 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*FishingRodIcon*} - - - {*B*} - 낚시에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 낚시에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - {*CONTROLLER_ACTION_USE*}를 누르면 찌를 던지고 낚시를 시작합니다. {*CONTROLLER_ACTION_USE*}를 한 번 더 누르면 낚싯줄을 감습니다. - {*FishingRodIcon*} - - - 물고기를 낚으려면 물에 던져놓은 찌가 수면 아래로 가라앉기를 기다려서 줄을 감아올립니다. 물고기는 날것으로 먹거나 화로에서 요리해 먹을 수 있으며, 먹으면 체력이 회복됩니다. - {*FishIcon*} - - - 다른 도구들과 마찬가지로, 낚싯대도 정해진 횟수만큼만 사용할 수 있습니다. 하지만 물고기 이외의 물건을 낚아도 사용 횟수는 줄어듭니다. 낚싯대를 사용해서 어떤 물건을 낚을 수 있는지, 또는 어떤 일이 일어나는지 확인해 보십시오. - {*FishingRodIcon*} - - - 이것은 침대입니다. 밤에 침대를 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 침대에서 잠을 자고 아침에 일어납니다.{*ICON*}355{*/ICON*} - - - {*B*} - 침대에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 침대에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 자는 도중에 괴물의 습격을 받지 않으려면 침대를 안전하고 조명이 충분한 곳에 두어야 합니다. 침대를 한 번 사용하면 게임 중에 사망했을 때 침대에서 부활합니다. - {*ICON*}355{*/ICON*} - - - 게임 내에 다른 플레이어가 있을 때는 모든 플레이어가 동시에 침대에 들어야 잠을 잘 수 있습니다. - {*ICON*}355{*/ICON*} - - - 이곳에는 레드스톤과 피스톤으로 이루어진 간단한 회로가 있고, 회로를 연장할 수 있는 아이템이 든 상자가 있습니다. - - - {*B*} - 레드스톤 회로와 피스톤에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 레드스톤 회로와 피스톤에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 레버, 버튼, 압력판, 레드스톤 횃불로 회로에 동력을 공급할 수 있습니다. 작동할 아이템에 직접 붙이거나 레드스톤 가루로 연결하십시오. - - - 동력원을 설치한 위치와 방향에 따라 주변 블록에 주는 영향이 달라집니다. 예를 들면 블록 옆에 설치한 레드스톤 횃불은 해당 블록이 다른 동력원에서 동력을 공급받는다면 꺼질 수 있습니다. - - - - 철제, 다이아몬드, 황금 곡괭이로 레드스톤을 채굴하면 레드스톤 가루를 얻을 수 있습니다. 레드스톤 가루를 사용하면 옆으로 15블록, 아래위로 1블록까지 동력을 운반할 수 있습니다. - {*ICON*}331{*/ICON*} - - - - - 레드스톤 탐지기는 동력 운반 거리를 늘리거나 회로에 지연 기능을 부여할 수 있습니다. - {*ICON*}356{*/ICON*} - - - - - 동력이 공급되면 피스톤이 늘어나 최대 12블록까지 밀어냅니다. 끈끈이 피스톤은 줄어들 때 거의 모든 종류의 블록 1개를 다시 끌어옵니다. - {*ICON*}33{*/ICON*} - - - - 이곳의 상자에는 피스톤으로 회로를 만들 수 있는 부품이 들어 있습니다. 이곳에 있는 회로를 완성하거나 자신만의 회로를 만드십시오. 튜토리얼 지역 밖에는 더 많은 예시가 있습니다. - - - 이곳에는 지하로 통하는 차원문이 있습니다! - - - {*B*} - 지하 차원문에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 지하 차원문에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 차원문은 흑요석 블록을 4블록 길이에 5블록 높이로 쌓아서 만듭니다. 모서리 블록은 없어도 됩니다. - - - 지하 차원문을 작동하려면 부싯돌과 부시를 사용하여 외형 안쪽의 흑요석 블록에 불을 붙여야 합니다. 차원문 외형이 무너지거나, 근처에서 폭발이 일어나거나, 차원문 안에 액체가 들어가면 차원문 작동이 멈출 수 있습니다. - - - 지하 차원문을 사용하려면 안으로 들어가십시오. 화면이 보라색으로 변하며 소리가 날 것입니다. 잠시 후 다른 차원으로 이동하게 됩니다. - - - 용암으로 가득찬 지하 세계는 위험한 곳입니다. 하지만 불을 붙이면 영원히 타는 지하 바위와 빛을 뿜는 발광석을 얻을 수 있습니다. - - - 지하의 1블록 거리는 지상의 3블록 거리와 같으므로, 지하 월드에서는 지상에서보다 더 빨리 이동할 수 있습니다. - - - 현재 창작 모드 상태입니다. - - - {*B*} - 창작 모드에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 창작 모드에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 창작 모드에서는 모든 아이템과 블록을 무한정 사용할 수 있습니다. 도구를 사용하지 않아도 클릭 한 번만으로 블록을 파괴할 수 있으며, 무적 상태인데다 날 수도 있습니다. - - - {*CONTROLLER_ACTION_CRAFTING*}를 눌러 창작 소지품 인터페이스를 엽니다. - - - 구멍 반대쪽으로 나가면 계속합니다. - - - 창작 모드 튜토리얼을 완료했습니다. - - - 이 지역에는 농장이 있습니다. 농장에서 작물을 재배하면 음식 및 기타 아이템의 재료를 얻을 수 있습니다. - - - {*B*} - 재배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 재배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 밀, 호박, 수박은 씨앗을 심어서 재배합니다. 길게 자란 풀을 자르거나 밀을 수확하면 밀 씨앗을 얻을 수 있습니다. 호박 및 수박을 가공하면 호박씨 및 수박씨를 얻을 수 있습니다. - - - 씨를 심으려면 쟁기를 사용해서 흙 블록을 농지로 만들어야 합니다. 주변에 수원이 있으면 농지에 계속 수분을 공급하므로 작물이 빨리 자라며, 해당 지역에 불이 켜진 상태를 유지합니다. - - - 밀은 자라는 동안 여러 단계를 거칩니다. 수확할 준비가 되었을 때는 어둡게 변합니다.{*ICON*}59:7{*/ICON*} - - - 호박 및 수박은 씨를 심은 블록 옆에 또 다른 블록 하나가 필요합니다. 줄기가 다 자란 후 옆의 빈 블록에 열매를 맺게 됩니다. - - - 사탕수수는 물 블록 옆에 있는 풀, 흙 또는 모래 블록에 심어야 합니다. 사탕수수 블록을 자르면 사탕수수 위에 놓인 블록이 모두 떨어지게 됩니다.{*ICON*}83{*/ICON*} - - - 선인장은 모래에 심어야 하며 최대 세 블록 높이까지 자랍니다. 사탕수수와 마찬가지로 맨 아래 블록을 파괴하면 그 위의 블록이 떨어져 획득할 수 있습니다.{*ICON*}81{*/ICON*} - - - 버섯은 희미하게 불이 켜진 지역에 심어야 합니다. 버섯을 심으면 주변의 희미하게 불이 켜진 블록으로 퍼져 나갑니다.{*ICON*}39{*/ICON*} - - - 뼛가루를 사용하면 작물을 완전히 자란 상태로 만들거나 버섯을 거대 버섯으로 만들 수 있습니다.{*ICON*}351:15{*/ICON*} - - - 재배 튜토리얼을 완료했습니다. - - - 이곳에는 동물이 우리 안에 들어 있습니다. 동물을 교배하면 새끼 동물을 얻을 수 있습니다. - - - - {*B*} - 교배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 교배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - - 동물을 교배시키려면 각 동물에 적합한 먹이를 먹여 '사랑 모드'로 만들어야 합니다. - - - 소, Mooshroom, 양에게는 밀을, 돼지에게는 당근을 먹이고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 동물은 근처에 사랑 모드 상태이며 종류가 같은 동물이 있는지 찾아다니게 됩니다. - - - 사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 잠시 부모 동물을 따라다닙니다. - - - 사랑 모드가 끝난 동물은 5분간 다시 사랑 모드 상태가 될 수 없습니다. - - - 플레이어가 손에 먹이를 들고 있으면 일부 동물은 플레이어를 따라다닙니다. 동물을 한데 모아 교배할 때 편리합니다.{*ICON*}296{*/ICON*} - - - - 야생 늑대에게 뼈를 주면 길들일 수 있습니다. 길이 든 늑대 주위에는 사랑의 하트가 나타납니다. 길들인 늑대는 앉으라고 명령하지 않는 한 플레이어를 따라다니며 보호합니다. - - - - 동물과 교배 튜토리얼을 완료했습니다. - - - 이 지역에서는 호박과 블록으로 눈 골렘과 철 골렘을 만들 수 있습니다. - - - {*B*} - 골렘에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 골렘에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - - 골렘은 여러 개 쌓인 블록 위에 호박을 놓아 만들 수 있습니다. - - - 눈 골렘은 2개의 눈 블록을 위아래로 쌓고 그 위에 호박을 놓아 만들 수 있습니다. 눈 골렘은 적에게 눈덩이를 던집니다. - - - 철 골렘은 보시는 바와 같이 4개의 철 블록을 놓고 가운데 블록 위에 호박을 놓아 만들 수 있습니다. 철 골렘은 적을 공격합니다. - - - 철 골렘은 기본적으로 마을을 보호합니다. 사용자가 마을 사람을 공격하면 철 골렘이 사용자를 공격합니다. - - - 튜토리얼을 완료하기 전에는 이 지역을 벗어날 수 없습니다. - - - 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 흙이나 모래 같이 부드러운 재질의 재료를 얻으려면 삽을 써야 합니다. - - - 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 나무 둥치를 베려면 도끼를 써야 합니다. - - - 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 돌과 광물을 채굴할 때는 곡괭이를 써야 합니다. 특정 블록에서 자원을 채굴하려면 더 좋은 재질의 곡괭이가 필요할 수도 있습니다. - - - 특정 도구는 적을 공격하는 데 유용합니다. 검을 사용해서 공격해 보십시오. - - - 힌트: {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손 또는 손에 든 도구로 채굴하거나 벌목합니다. 일부 블록은 도구를 사용해야 채굴할 수 있습니다. - - - 사용하고 있는 도구가 손상됐습니다. 도구는 사용할 때마다 손상되며, 나중에는 망가집니다. 아이템 아래쪽의 색상 눈금을 보면 현재 손상된 정도를 알 수 있습니다. - - - 수면으로 헤엄치려면 {*CONTROLLER_ACTION_JUMP*}를 길게 누르십시오. - - - 이곳에는 궤도가 있고 그 위에 광물 수레가 있습니다. 광물 수레에 타려면 포인터를 수레에 맞추고 {*CONTROLLER_ACTION_USE*}를 누릅니다. 단추에 포인터를 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 광물 수레가 움직입니다. - - - 강 옆의 상자에는 배가 있습니다. 배를 사용하려면 포인터를 물에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오. 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 배에 탑니다. - - - 연못 옆의 상자에는 낚싯대가 있습니다. 상자에서 낚싯대를 꺼내 손에 든 아이템으로 선택한 다음 사용하십시오. - - - 이 고급 피스톤 기계장치는 자동 수리 기능을 지닌 다리를 만듭니다! 버튼을 눌러 작동시킨 다음 각 부품이 어떻게 사용되었는지 더 알아보십시오. - - - 아이템을 옮기는 중에 포인터가 인터페이스를 벗어나면 아이템을 버릴 수 있습니다. - - - 이 아이템을 만들 재료가 부족합니다. 왼쪽 아래의 상자에는 이 아이템을 만드는 데 필요한 재료가 표시됩니다. - - - 축하합니다. 튜토리얼을 마쳤습니다. 이제 게임 시간이 정상적으로 흐르며, 괴물이 출몰하는 밤이 오기까지 시간이 얼마 남지 않았습니다! 피신처를 완성하십시오! - - - {*EXIT_PICTURE*} 먼 곳을 탐험할 때, 작은 성으로 연결된 계단을 이용하십시오. 계단은 광부의 피신처 근처에 있습니다. - - - - 알림: - - - <![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*} 버튼을 누르십시오. - - - 선택 - - - 사용 - - - 뒤로 - - - 나가기 - - - 취소 - - - 참가 취소 - - - 온라인 게임 목록 새로 고침 - - - 파티 게임 - - - 모든 게임 - - - 그룹 변경 - - - 소지품 표시 - - - 설명 표시 - - - 재료 표시 - - - 제작 - - - 만들기 - - - 획득/놓기 - - - 획득 - - - 모두 획득 - - - 절반 획득 - - - 놓기 - - - 모두 놓기 - - - 하나 놓기 - - - 버리기 - - - 모두 버리기 - - - 하나 버리기 - - - 교체 - - - 빠른 이동 - - - 빠른 선택 취소 - - - 이것은 무엇입니까? - - - Facebook에 공유 - - - 필터 변경 - - - 친구 요청 보내기 - - - 페이지 내림 - - - 페이지 올림 - - - 다음 - - - 이전 - - - 플레이어 추방 - - - 염색 - - - 채굴 - - - 먹이기 - - - 길들이기 - - - 치료하기 - - - 앉기 - - - 나를 따르라 - - - 꺼내기 - - - 비우기 - - - 안장 - - - 놓기 - - - 때리기 - - - 젖 짜기 - - - 수집 - - - 먹기 - - - 잠자기 - - - 일어나기 - - - 재생 - - - 타기 - - - 배 타기 - - - 성장 - - - 수면으로 헤엄치기 - - - 열기 - - - 높낮이 변경 - - - 폭파 - - - 읽기 - - - 매달기 - - - 던지기 - - - 심기 - - - 경작 - - - 수확 - - - 계속 - - - 정식 버전 게임 구매 - - - 저장 게임 삭제 - - - 삭제 - - - 옵션 - - - 친구 초대 - - - 수락 - - - 털 깎기 - - - 레벨 차단 - - - 캐릭터 선택 - - - 점화 - - - 캐릭터 찾기 - - - 정식 버전 설치 - - - 평가판 설치 - - - 설치 - - - 재설치 - - - 저장 옵션 - - - 명령 실행 - - - 창작 - - - 재료 이동 - - - 연료 이동 - - - 도구 움직이기 - - - 방어구 이동 - - - 무기 이동 - - - 장비하기 - - - 당기기 - - - 놓기 - - - 특권 - - - 막기 - - - 페이지 위로 - - - 페이지 아래로 - - - 사랑 모드 - - - 마시기 - - - 회전 - - - 숨기기 - - - 모든 슬롯 선택 취소 - - - 확인 - - - 취소 - - - Minecraft 상점 - - - 진행 중인 게임을 종료하고 새 게임에 참가하시겠습니까? 저장하지 않은 진행 상황은 사라집니다. - - - 게임 나가기 - - - 게임 저장 - - - 저장하지 않고 나가기 - - - 현재 월드에서 이전에 저장한 내용을 현재 버전으로 덮어쓰시겠습니까? - - - 저장하지 않고 나가시겠습니까? 이 월드의 진행 상황이 모두 사라집니다! - - - 게임 시작 - - - 손상된 저장 데이터 - - - 저장 데이터가 손상되었습니다. 삭제하시겠습니까? - - - 게임에 참가한 모든 플레이어의 연결을 끊고, 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. - - - 저장하고 나가기 - - - 저장하지 않고 나가기 - - - 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. - - - 주 메뉴로 나가시겠습니까? 게임 진행 내용을 잃게 됩니다! - - - 새 월드 만들기 - - - 튜토리얼 진행 - - - 튜토리얼 - - - 월드 이름 지정 - - - 월드 이름을 입력하십시오. - - - 월드 생성 시드를 입력하십시오. - - - 저장된 월드 불러오기 - - - START를 눌러 게임에 참가하세요. - - - 게임에서 나가는 중 - - - 오류가 발생했습니다. 주 메뉴로 돌아갑니다. - - - 연결 실패 - - - 연결 끊어짐 - - - 서버 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. - - - 서버 연결 끊김 - - - 게임에서 추방되었습니다. - - - 비행으로 인해 게임에서 추방되었습니다. - - - 연결 시도 시간이 초과했습니다. - - - 서버가 꽉 찼습니다. - - - 호스트가 게임에서 나갔습니다. - - - 이 게임에 참가한 친구가 없으므로 게임에 참가할 수 없습니다. - - - 예전에 호스트가 자신을 추방했기 때문에 게임에 참가할 수 없습니다. - - - 참가하려는 플레이어가 이 게임의 이전 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. - - - 참가하려는 플레이어가 이 게임의 다음 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. - - - 새 월드 - - - 상품을 획득했습니다! - - - 만세! Minecraft의 Steve가 그려진 게이머 사진을 획득했습니다! - - - 만세! Creeper가 그려진 게이머 사진을 획득했습니다! - - - 정식 버전 게임 구매 - - - 현재 게임은 평가판 버전입니다. 게임을 저장하려면 정식 버전이 필요합니다. -지금 정식 버전 게임을 구매하시겠습니까? - - - 잠시 기다려 주십시오. - - - 결과 없음 - - - 필터: - - - 친구 - - - 내 점수 - - - 전체 - - - 명단: - - - 순위 - - - 레벨 저장 준비 중 - - - 이것저것 준비 중… - - - 마무리 중… - - - 지형 구축 중 - - - 월드 시뮬레이션 중 - - - 서버 시동 중 - - - 출현 지역 생성 중 - - - 출현 지역 불러오는 중 - - - 지하 진입 중 - - - 지상 진입 중 - - - 재생성 중 - - - 레벨 생성 중 - - - 레벨 불러오는 중 - - - 플레이어 저장 중 - - - 호스트에 연결 중 - - - 지형 다운로드 중 - - - 오프라인 게임으로 전환하는 중 - - - 호스트가 게임을 저장하는 동안 기다리십시오. - - - Ender에 들어가기 - - - Ender에서 나가기 - - - 이 침대는 주인이 있습니다. - - - 잠은 밤에만 잘 수 있습니다. - - - %s님이 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. - - - 침대가 사라졌거나 장애물이 막고 있습니다. - - - 휴식을 취할 때가 아닙니다. 근처에 괴물이 있습니다. - - - 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. - - - 도구 및 무기 - - - 무기 - - - 식량 - - - 구조물 - - - 방어구 - - - 기계장치 - - - 이동수단 - - - 장식물 - - - 블록 짓기 - - - 레드스톤 및 운송 - - - 기타 - - - 양조 - - - 도구, 무기 및 방어구 - - - 재료 - - - 로그아웃 - - - 난이도 - - - 음악 - - - 사운드 - - - 감마 - - - 게임 감도 - - - 인터페이스 감도 - - - 낙원 - - - 쉬움 - - - 보통 - - - 어려움 - - - 이 모드에서는 플레이어의 체력이 시간에 따라 자동으로 회복되며 적이 등장하지 않습니다. - - - 이 모드에서는 적이 나타나지만 보통 난이도보다 공격력이 약합니다. - - - 이 모드에서는 적이 나타나며, 플레이어에게 일반 수준의 피해를 입힙니다. - - - 이 모드에서는 적이 나타나며, 플레이어에게 큰 피해를 입힙니다. Creeper는 플레이어가 거리를 벌려도 폭발을 취소하지 않으므로 조심해야 합니다! - - - 평가판 시간 만료 - - - 인원 초과 - - - 빈자리가 없어서 게임에 참가하지 못했습니다. - - - 서명 입력 - - - 서명으로 사용할 텍스트를 입력하십시오. - - - 제목 입력 - - - 게시물 제목을 입력하십시오. - - - 설명문 입력 - - - 게시물 설명문을 입력하십시오. - - - 내용 입력 - - - 게시물 내용을 입력하십시오. - - - 소지품 - - - 재료 - - + 양조대 - - 상자 + + Ghast의 눈물 - - 효과부여 + + 호박씨 - - 화로 + + 수박씨 - - 재료 + + 닭 날고기 - - 연료 + + 음악 디스크 - "11" - - 디스펜서 + + 음악 디스크 - "where are we now" - - 현재 이 게임에서 구매할 수 있는 해당 유형의 다운로드 콘텐츠가 없습니다. + + 가위 - - %s님이 게임에 참가했습니다. + + 구운 닭고기 - - %s님이 게임을 떠났습니다. + + Ender 진주 - - %s님을 게임에서 추방했습니다. + + 수박 조각 - - 저장한 게임을 삭제하시겠습니까? + + Blaze 막대 - - 승인을 기다리는 중 + + 소 날고기 - - 확인됨 + + 스테이크 - - 플레이 중: + + 썩은 살점 - - 설정 초기화 + + 경험치 병 - - 설정을 기본값으로 초기화하시겠습니까? + + 참나무 목재 판자 - - 불러오기 오류 + + 전나무 목재 판자 - - %s님의 게임 + + 자작나무 목재 판자 - - 알 수 없는 호스트 게임 + + 잡초 블록 - - 손님이 로그아웃됨 + + - - 모든 손님 플레이어가 게임에서 제거되었기 때문에 손님 플레이어가 로그아웃되었습니다. + + 조약돌 - - 로그인 + + 정글 나무 판자 - - 로그인하지 않았습니다. 이 게임을 플레이하려면 로그인해야 합니다. 지금 로그인하시겠습니까? + + 자작나무 묘목 - - 멀티 플레이 허용되지 않음 + + 정글 묘목 - - 게임을 생성하지 못했습니다. + + 기반암 - - 자동 선택 + + 묘목 - - 팩 없음: 기본 캐릭터 + + 참나무 묘목 - - 즐겨찾는 캐릭터 + + 전나무 묘목 - - 차단 레벨 + + - - 참가하려는 게임은 차단 레벨 목록에 들어 있습니다. -게임 참가를 선택하면 해당 레벨이 차단 레벨 목록에서 제거됩니다. + + 아이템 외형 - - 이 레벨을 차단하시겠습니까? + + {*CREATURE*} 생성 - - 이 레벨을 차단 레벨 목록에 추가하시겠습니까? -확인을 선택하면 동시에 게임에서 나가게 됩니다. + + 지하 벽돌 - - 차단 목록에서 제거 + + 불쏘시개 - - 자동 저장 간격 + + 불쏘시개 (숯) - - 자동 저장 간격: 꺼짐 + + 불쏘시개 (석탄) - - + + 두개골 - - 여기에 놓을 수 없습니다! + + 머리 - - 용암을 레벨 출현 지점 근처에 놓을 수 없습니다. 플레이어가 시작 지점에서 바로 죽을 수 있기 때문입니다. + + %s의 머리 - - 인터페이스 투명도 + + Creeper 머리 - - 레벨 자동 저장 준비 중 + + 해골 두개골 - - HUD 크기 + + 말라비틀어진 해골 두개골 - - HUD 크기 (분할 화면) + + 좀비 머리 - - 시드 - - - 캐릭터 팩 획득 - - - 선택한 캐릭터를 사용하려면 캐릭터 팩을 획득해야 합니다. -지금 캐릭터 팩을 획득하시겠습니까? - - - 텍스처 팩 잠금 해제 - - - 이 텍스처 팩을 사용하려면 먼저 잠금을 해제해야 합니다. -지금 잠금 해제하시겠습니까? - - - 텍스처 팩 평가판 - - - 텍스처 팩의 평가판을 사용 중입니다. 정식 버전을 구입하기 전에는 이 월드를 저장할 수 없습니다. -텍스처 팩 정식 버전을 구입하시겠습니까? - - - 텍스처 팩 없음 - - - 정식 버전 구입 - - - 평가판 다운로드 - - - 정식 버전 다운로드 - - - 여기에는 텍스처 팩 또는 매시업 팩이 필요하며 현재 가지고 있지 않습니다! -지금 텍스처 팩 또는 매시업 팩을 설치하시겠습니까? - - - 평가판 받기 - - - 정식 버전 받기 - - - 플레이어 추방 - - - 이 플레이어를 게임에서 추방하시겠습니까? 추방당한 플레이어는 월드를 다시 시작하기 전까지 참가할 수 없습니다. - - - 게이머 사진 팩 - - - 테마 - - - 캐릭터 팩 - - - 친구의 친구도 참가 가능 - - - 이 게임은 호스트의 친구만 플레이할 수 있도록 제한되어서 참가할 수 없습니다. - - - 게임에 참가할 수 없음 - - - 선택됨 - - - 선택된 캐릭터: - - - 손상된 다운로드 콘텐츠 - - - 이 다운로드 콘텐츠는 손상되어서 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. - - - 일부 다운로드 콘텐츠가 손상되어 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. - - - 게임 모드가 변경되었습니다. - - - 월드 이름 바꾸기 - - - 월드의 새 이름을 입력하십시오. - - - 게임 모드: 생존 - - - 게임 모드: 창작 - - - 생존 - - - 창작 - - - 생존 모드에서 생성 - - - 창작 모드에서 생성 - - - 구름 렌더링 - - - 이 저장된 게임을 어떻게 하시겠습니까? - - - 저장된 게임 이름 바꾸기 - - - %d초 후에 자동 저장 실행… - - - 켜짐 - - - 꺼짐 - - - 일반 - - - 완전평면 - - - 이 옵션을 켜면 온라인 게임으로 플레이합니다. - - - 이 옵션을 켜면 초대받은 플레이어만 게임에 참가할 수 있습니다. - - - 이 옵션을 켜면 친구 리스트에 있는 사람의 친구가 게임에 참가할 수 있습니다. - - - 이 옵션을 켜면 플레이어끼리 서로 피해를 입힐 수 있습니다. 생존 모드에만 적용됩니다. - - - 이 옵션을 끄면 게임에 참가한 플레이어는 인증을 받기 전까지 건물을 짓거나 채굴할 수 없습니다. - - - 이 옵션을 켜면 불이 근처의 가연성 블록으로 번집니다. - - - 이 옵션을 켜면 TNT가 작동할 때 폭발합니다. - - - 이 옵션을 켜면 지하 월드가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다. - - - 이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다. - - - 이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다. - - - 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다. - - - 캐릭터 팩 - - - 테마 - - - 게이머 사진 - - - 아바타 아이템 - - - 텍스처 팩 - - - 매시업 팩 - - - {*PLAYER*} 불꽃에 휩싸여 타오름 - - - {*PLAYER*} 불타서 사망 - - - {*PLAYER*} 용암에서 수영 시도 - - - {*PLAYER*} 벽에 끼어 질식사 - - - {*PLAYER*} 익사 - - - {*PLAYER*} 배고파서 사망 - - - {*PLAYER*} 찔려서 사망 - - - {*PLAYER*} 땅에 너무 세게 충돌 - - - {*PLAYER*} 월드 밖으로 떨어짐 - - - {*PLAYER*} 사망 - - - {*PLAYER*} 폭발 - - - {*PLAYER*} 마법에 의해 사망 - - - {*PLAYER*} Ender 드래곤 브레스에 의해 사망 - - - {*PLAYER*} {*SOURCE*}에 의해 사망 - - - {*PLAYER*} {*SOURCE*}에 의해 사망 - - - {*PLAYER*} {*SOURCE*}의 원거리 공격에 의해 사망 - - - {*PLAYER*} {*SOURCE*}의 화염구에 의해 사망 - - - {*PLAYER*} {*SOURCE*}에 타격에 의해 사망 - - - {*PLAYER*} {*SOURCE*}에 의해 사망 - - - 기반암 안개 - - - HUD 표시 - - - 손 표시 - - - 사망 메시지 - - - 캐릭터 애니메이션 - - - 사용자 지정 캐릭터 애니메이션 - - - 채굴하거나 아이템을 사용할 수 없습니다. - - - 채굴하거나 아이템을 사용할 수 있습니다. - - - 블록을 놓을 수 없습니다. - - - 블록을 놓을 수 있습니다. - - - 문과 스위치를 사용할 수 있습니다. - - - 문과 스위치를 사용할 수 없습니다. - - - 보관함(예; 상자)을 사용할 수 있습니다. - - - 보관함(예; 상자)을 사용할 수 없습니다. - - - 괴물 및 동물을 공격할 수 없습니다. - - - 괴물 및 동물을 공격할 수 있습니다. - - - 플레이어를 공격할 수 없습니다. - - - 플레이어를 공격할 수 있습니다. - - - 동물을 공격할 수 없습니다. - - - 동물을 공격할 수 있습니다. - - - 관리자가 되었습니다. - - - 관리자에서 해임되었습니다. - - - 날 수 있습니다. - - - 날 수 없습니다. - - - 지치지 않습니다. - - - 지치게 됩니다. - - - 투명 상태가 되었습니다. - - - 투명 상태가 해제되었습니다. - - - 무적 상태가 되었습니다. - - - 무적 상태가 해제되었습니다. - - - %d MSP - - - Ender 드래곤 - - - %s님이 Ender에 들어갔습니다. - - - %s님이 Ender에서 나갔습니다. - - - {*C3*}네가 말한 플레이어가 보여.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}그래. 조심해. 이제 더 높은 단계에 도달해서 우리 생각을 읽을 수 있어.{*EF*}{*B*}{*B*} -{*C2*}상관없어. 어차피 우리는 게임의 일부라고 생각할 거야.{*EF*}{*B*}{*B*} -{*C3*}난 이 플레이어가 마음에 들어. 멋진 플레이를 보여줬고 절대 포기하지 않았잖아.{*EF*}{*B*}{*B*} -{*C2*}우리 생각을 마치 게임 속 단어처럼 읽고 있어.{*EF*}{*B*}{*B*} -{*C3*}게임의 꿈에 깊이 빠져있을 때 많은 것들을 상상하기 위해 선택한 방법이야.{*EF*}{*B*}{*B*} -{*C2*}단어는 서로의 생각을 소통하기에 좋은 방법이야. 유연하잖아. 화면 뒤의 현실을 응시하는 것보다 덜 무섭고.{*EF*}{*B*}{*B*} -{*C3*}플레이어가 읽을 수 있기 전까지는 목소리를 들었지. 예전엔 플레이하지 않던 사람들은 플레이어를 마녀나 마법사라고 불렀어. 그리고 플레이어는 악마의 힘이 깃든 빗자루를 타고 하늘을 날아다니는 꿈을 꿨고.{*EF*}{*B*}{*B*} -{*C2*}이 플레이어는 어떤 꿈을 꿨을까?{*EF*}{*B*}{*B*} -{*C3*}이 플레이어는 햇살과 나무 그리고 불과 물에 관한 꿈을 꿨어. 이 모든 것들을 만들어내고 파괴하는 꿈을 꿨지. 그리고 사냥하고 사냥당하는 꿈과 보금자리에 관한 꿈을 꿨어.{*EF*}{*B*}{*B*} -{*C2*}아, 예전 인터페이스 말이구나. 백만 년도 더 됐지만 아직도 작동하지. 그런데 이 플레이어는 화면 뒤의 현실에서 실제로 어떤 것들을 만들었을까?{*EF*}{*B*}{*B*} -{*C3*}수많은 사람들과 {*EF*}{*NOISE*}{*C3*} 사이에 진실된 세상을 만들고 {*EF*}{*NOISE*}{*C3*} 속에서 {*EF*}{*NOISE*}{*C3*}를 위해 {*EF*}{*NOISE*}{*C3*}를 만들었어.{*EF*}{*B*}{*B*} -{*C2*}그 생각은 아직 읽지 못해.{*EF*}{*B*}{*B*} -{*C3*}그래, 아직 가장 높은 단계에는 도달하지 못했으니까. 게임이라는 짧은 꿈에서는 도달할 수 없지만 기나긴 인생의 꿈속에서 도달하게 될 거야.{*EF*}{*B*}{*B*} -{*C2*}우리가 사랑하고 있다는 걸 알고 있을까? 그리고 세상이 아름답고 다정하다는 건?{*EF*}{*B*}{*B*} -{*C3*}생각의 잡음 속에서 간혹 세상의 소리를 들으니 알고 있을 거야.{*EF*}{*B*}{*B*} -{*C2*}하지만 긴 꿈속에서 슬플 때도 있어. 여름이 없는 세상을 만들고 검은 태양 아래에서 두려움에 떨며 현실의 슬픈 창조물을 움켜잡고 있지.{*EF*}{*B*}{*B*} -{*C3*}그의 슬픔을 치유하면 그를 망치게 될 거야. 슬픔은 직접 풀어야 하는 과제이니까. 우리는 그걸 방해하면 안 돼.{*EF*}{*B*}{*B*} -{*C2*}말해주고 싶어. 때로는 그들이 꿈속에 깊은 곳에서 현실 속의 진정한 세상을 만들고 있다는 걸. 또 그들이 세상에서 얼마나 중요한 존재인지 말해주고 싶어. 그들이 진정한 관계를 맺지 못하고 있을 때 그들이 두려워하는 바를 말할 수 있도록 도와주고 싶어.{*EF*}{*B*}{*B*} -{*C3*}우리 생각을 읽고 있어.{*EF*}{*B*}{*B*} -{*C2*}난 신경 쓰지 않아. 그들에게 말해주고 싶어. 세상의 진실은 단지 {*EF*}{*NOISE*}{*C2*}하고 {*EF*}{*NOISE*}{*C2*} 할 뿐이란 걸 말이야. 또 그들은 {*EF*}{*NOISE*}{*C2*}에서 {*EF*}{*NOISE*}{*C2*}하고 있을 뿐이란 것도 말해주고 싶어. 그들은 기나긴 꿈속에서 현실의 아주 작은 부분만을 보고 있어.{*EF*}{*B*}{*B*} -{*C3*}그렇다 하더라도 그들은 게임을 하고 있잖아.{*EF*}{*B*}{*B*} -{*C2*}하지만 그들에게 말을 전하기는 어렵지 않아...{*EF*}{*B*}{*B*} -{*C3*}이 꿈에서는 안 돼. 그들에게 어떻게 살아야 하는지 말해주는 건 그들의 삶을 방해하는 거야.{*EF*}{*B*}{*B*} -{*C2*}플레이어에게 어떻게 살아야 하는지 말하려는 게 아니야.{*EF*}{*B*}{*B*} -{*C3*}플레이어는 끝없이 성장하고 있어.{*EF*}{*B*}{*B*} -{*C2*}플레이어에게 이야기를 들려줄 거야.{*EF*}{*B*}{*B*} -{*C3*}하지만 진실이 아니잖아.{*EF*}{*B*}{*B*} -{*C2*}그래. 이야기에는 단어의 틀에서만 진실을 담고 있겠지. 떨어져 있기 때문에 금방이라도 사라질 수 있는 적나라한 진실은 아니야.{*EF*}{*B*}{*B*} -{*C3*}그에게 다시 육신을 줘.{*EF*}{*B*}{*B*} -{*C2*}그래. 플레이어...{*EF*}{*B*}{*B*} -{*C3*}이제 이름으로 불러.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. 이 게임의 플레이어.{*EF*}{*B*}{*B*} -{*C3*}좋아.{*EF*}{*B*}{*B*} - - - {*C2*}이제 크게 심호흡을 해. 한 번 더. 폐 속 가득한 공기를 느껴봐. 팔다리가 돌아오도록 하는 거야. 그래, 손가락을 움직여봐. 중력 아래서 몸을 다시 갖게 되는 거지. 네가 다른 존재인 것처럼 우리가 다른 존재인 것처럼 네 몸이 다시 세상과 만나는 거야.{*EF*}{*B*}{*B*} -{*C3*}우리가 누구냐고? 한때는 산의 정령으로 불렸지. 아버지 태양, 어머니 달. 고대의 영혼, 동물의 영혼. 정령. 유령. 대자연. 그리고 신, 악마. 천사. 폴터가이스트. 외계인, 우주인. 렙톤, 쿼크. 우리를 부르는 단어는 다양했지만 우리는 변하지 않았어.{*EF*}{*B*}{*B*} -{*C2*}우리가 세상 그 자체야. 네가 생각하는 너 이외의 모든 것이 바로 우리지. 지금 넌 너의 피부와 눈을 통해 우리를 보고 있어. 왜 세상이 너의 피부를 통해 교감하고 네게 빛을 비출까? 플레이어인 널 보기 위해서야. 너에 대해 알고 네가 세상에 대해 알 수 있도록 말이야. 이제 네게 이야기를 하나 들려줄게.{*EF*}{*B*}{*B*} -{*C2*}아주 오래전에 플레이어가 있었어.{*EF*}{*B*}{*B*} -{*C3*}그 플레이어는 바로 {*PLAYER*}, 너야. {*EF*}{*B*}{*B*} -{*C2*}용암으로 이루어진 회전하는 지구의 얇은 표면 위에서 그는 자신을 인간이라고 생각했어. 그 용암 덩어리는 질량이 33만 배 더 무거운 불타는 가스 덩어리를 돌고 있었지. 그 둘 사이의 거리는 빛의 속도로 8분이나 걸리는 먼 거리였어. 빛은 멀리 떨어져 있는 별의 정보였고 1억 5천 킬로미터 거리에서도 네 피부를 태울 수 있지.{*EF*}{*B*}{*B*} -{*C2*}이따금 플레이어는 평평하고 끝이 없는 세상에서 자신이 광부가 되는 꿈을 꿨어. 그곳의 태양은 하얗고 사각형으로 되어 있었어. 하루는 짧았고 해야 할 일은 많았지. 그리고 죽음은 단지 잠깐의 불편함이었어.{*EF*}{*B*}{*B*} -{*C3*}이따금 플레이어는 이야기 속에서 길을 잃는 꿈을 꿨어.{*EF*}{*B*}{*B*} -{*C2*}이따금 플레이어는 다른 곳에서 다른 존재가 되는 꿈을 꿨어. 그리고 가끔 이 꿈들은 방해를 받았어. 가끔은 정말 아름다웠지. 이따금 플레이어는 꿈에서 깨어 다른 꿈으로 들어갔고 또 그 꿈에서 깨어 다른 꿈으로 들어갔어.{*EF*}{*B*}{*B*} -{*C3*}이따금 플레이어는 화면의 단어를 보는 꿈을 꿨지.{*EF*}{*B*}{*B*} -{*C2*}이제 과거로 돌아가 보자.{*EF*}{*B*}{*B*} -{*C2*}플레이어의 원자는 초원에, 강에, 공기에, 땅에 흩어져 있었어. 여자가 그 원자를 모아 마시고 먹고 들이마셔 한대 모아 그녀의 몸 안에서 플레이어를 만든 거야.{*EF*}{*B*}{*B*} -{*C2*}그렇게 플레이어는 아늑하고 어두운 어머니의 몸속에서 깨어나 긴 꿈의 세계로 들어간 거야.{*EF*}{*B*}{*B*} -{*C2*}플레이어는 DNA로 쓰여진 한 번도 들어본 적이 없는 새로운 이야기였어. 플레이어는 수십억 년 된 소스 코드로 생성된 한 번도 실행해본 적이 없는 새로운 프로그램이었어. 플레이어는 무에서 젖과 사랑으로부터 탄생한 한 번도 생명을 가져본 적이 없는 새로운 인간이었어.{*EF*}{*B*}{*B*} -{*C3*}네가 바로 무에서 젖과 사랑으로부터 탄생한 바로 그 플레이어이자 이야기고 프로그램이자 인간이야.{*EF*}{*B*}{*B*} -{*C2*}이제 좀 더 과거로 돌아가 보자.{*EF*}{*B*}{*B*} -{*C2*}플레이어의 수백 수천 수백억 원자는 이 게임이 존재하기 훨씬 이전에 별의 심장 속에서 만들어졌어. 즉, 플레이어도 별에서 온 정보야. 그리고 플레이어는 이야기 속에서 움직이는 데 그 이야기는 쥴리안이라는 사람이 심어놓은 정보야. 그리고 그 이야기는 마르쿠스라는 사람이 창조한 평평하고 끝없는 세상 위에서 펼쳐지지. 그리고 그 세상은 플레이어가 만든 작은 그만의 세상이야. 그리고 그 플레이어가 살고 있는 세상을 창조한 사람은…{*EF*}{*B*}{*B*} -{*C3*}쉿. 이따금 플레이어는 부드럽고 따뜻하며 단순한 그만의 작은 세상을 만들어. 이따금 그 세상은 거칠고 추우며 복잡하기도 해. 이따금 거대한 텅 빈 공간에서 움직이는 에너지 조각으로 머릿속에서 세상을 만들지. 한때 그 조각들을 “전자”와 “양성자”라고 부를 때도 있었어.{*EF*}{*B*}{*B*} - - - {*C2*}한때 조각들을 “행성”과 “별”이라고 부를 때도 있었지.{*EF*}{*B*}{*B*} -{*C2*}이따금 그는 On과 Off로, 0과 1로, 일련의 코드로 이루어진 에너지로 만든 세상에 있다고 믿었어. 이따금 그는 게임 플레이를 하고 있다고 믿었지. 이따금 그는 화면의 단어를 읽고 있다고 믿었어.{*EF*}{*B*}{*B*} -{*C3*}네가 단어를 읽고 있는 그 플레이어야…{*EF*}{*B*}{*B*} -{*C2*}쉿… 가끔 플레이어는 화면의 코드를 읽어. 코드를 단어로 바꾸고, 그 단어를 의미로 해석하고, 그 의미를 느낌, 감정, 이론, 아이디어로 바꿔서 플레이어는 더 빠르고 깊게 호흡하기 시작했고 자신은 살아 있으며 수천 번의 죽음은 진짜가 아니라는 걸 깨달아.{*EF*}{*B*}{*B*} -{*C3*}너. 그래, 너는 살아 있어.{*EF*}{*B*}{*B*} -{*C2*}그리고 이따금 플레이어는 여름 나무의 하늘거리는 잎 사이로 비치는 햇빛을 통해 세상이 그와 소통하고 있다고 믿었어.{*EF*}{*B*}{*B*} -{*C3*}그리고 이따금 플레이어는 어느 추운 겨울 밤하늘에서 볼 수 있는, 아주 먼 우주 저편에서 찰나의 시간 동안 플레이어에게 보이기 위해 태양보다 백만 배 무거운 별이 자신을 불태워 발한 빛을 통해 세상이 그와 소통하고 있다고 믿었어. 그리고 세상과 멀리 떨어져 있는 집으로 걸어가 익숙한 문가에서 나는 음식 냄새를 맡으며 다시 꿈에 빠져들었지.{*EF*}{*B*}{*B*} -{*C2*}그리고 이따금 플레이어는 0과 1, 세상에 퍼져있는 전기, 꿈의 마지막에 화면에 보이는 단어를 통해 세상과 소통한다고 믿었어.{*EF*}{*B*}{*B*} -{*C3*}그리고 세상은 널 사랑한다고 말했어.{*EF*}{*B*}{*B*} -{*C2*}그리고 세상은 네가 멋진 게임 플레이를 보여줬다고 말했어.{*EF*}{*B*}{*B*} -{*C3*}그리고 세상은 네게 필요한 모든 것은 이미 네 안에 있다고 말했어.{*EF*}{*B*}{*B*} -{*C2*}그리고 세상은 네가 생각하는 것보다 넌 더 강하다고 말했어.{*EF*}{*B*}{*B*} -{*C3*}그리고 세상은 네가 낮이라고 말했어.{*EF*}{*B*}{*B*} -{*C2*}그리고 세상은 네가 밤이라고 말했어.{*EF*}{*B*}{*B*} -{*C3*}그리고 세상은 네가 싸우고 있는 어둠이 네 안에 존재한다고 말했어.{*EF*}{*B*}{*B*} -{*C2*}그리고 세상은 네가 찾고 있는 빛이 네 안에 존재한다고 말했어.{*EF*}{*B*}{*B*} -{*C3*}그리고 세상은 네가 혼자가 아니라고 말했어.{*EF*}{*B*}{*B*} -{*C2*}그리고 세상은 네가 다른 모든 것들과 떨어져 있지 않다고 말했어.{*EF*}{*B*}{*B*} -{*C3*}그리고 세상은 네가 스스로 맛을 느끼고 스스로 대화하며 자신의 코드를 읽는 세상 그 자체라고 말했어.{*EF*}{*B*}{*B*} -{*C2*}그리고 세상은 네가 사랑 그 자체니까 널 사랑한다고 말했어.{*EF*}{*B*}{*B*} -{*C3*}그리고 게임이 끝나고 플레이어가 꿈에서 깼어. 그리고 플레이어는 새로운 꿈을 꾸기 시작해. 그리고 다시 꿈을 꾸고, 더 좋은 꿈을 꿔. 그리고 플레이어는 세상 그 자체고 사랑 그 자체야.{*EF*}{*B*}{*B*} -{*C3*}네가 바로 그 플레이어야.{*EF*}{*B*}{*B*} -{*C2*}이제 일어나.{*EF*} - - - 지하 초기화 - - - 지하의 저장 데이터를 초기화해 기본값으로 재설정하시겠습니까? 지하의 진행 상황이 사라집니다. - - - 지하 초기화 - - - 지하 초기화를 하지 않습니다. - - - Mooshroom의 털을 자를 수 없습니다. 돼지, 양, 소, 고양이의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. 돼지, 양, 소, 오셀롯의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. Mooshroom의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. 늑대의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. 닭의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. 오징어의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. 적의 수가 최대치에 도달했습니다. - - - 생성 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. - - - 그림 액자/아이템 외형의 수가 최대치에 도달했습니다. - - - 낙원 모드에서는 적을 생성할 수 없습니다. - - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이의 수가 최대치에 도달했습니다. - - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 늑대의 수가 최대치에 도달했습니다. - - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 닭의 수가 최대치에 도달했습니다. - - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 Mooshroom의 수가 최대치에 도달했습니다. - - - 배의 수가 최대치에 도달했습니다. - - - 괴물 머리의 수가 최대치에 도달했습니다. - - - 시야 반전 - - - 왼손잡이 - - - 사망! - - - 재생성 - - - 다운로드 콘텐츠 판매 - - - 캐릭터 변경 - - - 플레이 방법 - - - 컨트롤 - - - 설정 - - - 제작진 - - - 콘텐츠 재설치 - - - 디버그 설정 - - - 불 확산 - - - TNT 폭발 - - - 플레이어 대 플레이어 - - - 플레이어 신뢰 - - - 호스트 특권 - - - 건물 생성 - - - 완전평면 월드 - - - 보너스 상자 - - - 월드 옵션 - - - 건설 및 채광 가능 - - - 문과 스위치 사용 가능 - - - 보관함을 열 수 있음 - - - 플레이어 공격 가능 - - - 동물 공격 가능 - - - 관리자 - - - 플레이어 추방 - - - 비행 가능 - - - 지치지 않음 - - - 투명화 - - - 호스트 옵션 - - - 플레이어/초대 - - - 온라인 게임 - - - 초대한 사람만 참가 가능 - - - 추가 옵션 - - - 불러오기 - - - 새 월드 - - - 월드 이름 - - - 월드 생성 시드 - - - 공백(무작위 시드) - - - 플레이어 - - - 게임 참가 - - - 게임 시작 - - - 게임 없음 - - - 게임 플레이 - - - 순위표 - - - 도움말 및 옵션 - - - 정식 버전 게임 구매 - - - 게임 재개 - - - 게임 저장 - - - 난이도: - - - 게임 유형: - - - 건물: - - - 레벨 유형: - - - 플레이어 대 플레이어: - - - 플레이어 신뢰: - - - TNT: - - - 불 확산: - - - 테마 재설치 - - - 게이머사진 1 재설치 - - - 게이머사진 2 재설치 - - - 아바타 아이템 1 재설치 - - - 아바타 아이템 2 재설치 - - - 아바타 아이템 3 재설치 - - - 옵션 - - - 오디오 - - - 컨트롤 - - - 그래픽 - - - 사용자 인터페이스 - - - 기본값으로 재설정 - - - 시야 흔들림 - - - 힌트 - - - 게임 내 툴팁 - - - 2 플레이어 수직 분할 화면 - - - 완료 - - - 서명 메시지 편집: - - - 스크린샷과 함께 게시할 설명을 입력하십시오. - - - 설명문 - - - 게임 스크린샷 - - - 서명 메시지 편집: - - - 고전적인 Minecraft 텍스처, 아이콘 및 사용자 인터페이스입니다! - - - 매시업 월드 모두 보이기 - - - 효과 없음 - - - 속도 - - - 속도 저하 - - - 채굴 속도 향상 - - - 채굴 속도 저하 - - - 피해 강화 - - - 피해 약화 - - - 회복 - - - 피해 - - - 점프 강화 - - - 혼란 - - - 재생 - - - 저항 - - - 화염 저항 - - - 수중 호흡 - - - 투명화 - - - 맹목 - - - 야간 시야 - - - 배고픔 + + 석탄을 저장하는 간편한 방법입니다. 화로에서 연료로 사용할 수 있습니다. - - - 신속 + + 배고픔 - 속도 저하 - - - 채굴 속도 향상 + + - 신속 - - - 둔함 + + 투명화 - - - 피해 강화 + + 수중 호흡 - - - 피해 약화 + + 야간 시야 - - - 회복 + + 맹목 - 피해 - - - 도약 + + - 회복 - 혼란 @@ -5033,29 +5924,38 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E - 재생 + + - 둔함 + + + - 채굴 속도 향상 + + + - 피해 약화 + + + - 피해 강화 + + + 화염 저항 + + + 포화 + - 저항 - - - 화염 저항 + + - 도약 - - - 수중 호흡 + + 위더 - - - 투명화 + + 체력 강화 - - - 맹목 - - - - 야간 시야 - - - - 배고픔 - - - - 독 + + 흡수 @@ -5066,9 +5966,78 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E III + + - 투명화 + IV + + - 수중 호흡 + + + - 화염 저항 + + + - 야간 시야 + + + - 독 + + + - 배고픔 + + + - 흡수 + + + - 포화 + + + - 체력 강화 + + + - 맹목 + + + - 쇠퇴 + + + 소박한 + + + 묽은 + + + 뿌연 + + + 맑은 + + + 우유빛 + + + 이상한 + + + 느끼한 + + + 부드러운 + + + 엉터리 + + + 김이 빠진 + + + 투박한 + + + 단조로운 + 폭발 @@ -5078,50 +6047,14 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 시시한 - - 단조로운 + + 근사한 - - 맑은 + + 따스한 - - 우유빛 - - - 뿌연 - - - 소박한 - - - 묽은 - - - 이상한 - - - 김이 빠진 - - - 투박한 - - - 엉터리 - - - 느끼한 - - - 부드러운 - - - 미끈미끈한 - - - 찰랑대는 - - - 짙은 + + 화려한 우아한 @@ -5129,149 +6062,152 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 고급스러운 - - 화려한 - - - 근사한 - - - 정제된 - - - 따스한 - 거품이 이는 - - 강력한 - - - 냄새나는 - - - 냄새 없는 - 고약한 거칠거칠한 + + 냄새 없는 + + + 강력한 + + + 냄새나는 + + + 미끈미끈한 + + + 정제된 + + + 짙은 + + + 찰랑대는 + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 회복합니다. + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 감소합니다. + + + 효과 대상 플레이어, 동물 및 괴물이 불, 용암 및 Blaze의 원거리 공격에 피해를 받지 않게 됩니다. + + + 그 자체로는 효과가 없습니다. 양조대에서 다른 재료를 추가로 넣어 효과를 추가할 수 있습니다. + 매캐한 + + 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 느려집니다. 플레이어의 질주 속도가 느려지며 점프 거리와 시야 거리가 줄어듭니다. + + + 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 빨라집니다. 플레이어의 질주 속도가 빨라지며 점프 거리와 시야 거리가 늘어납니다. + + + 효과 대상 플레이어 및 괴물의 공격력이 증가합니다. + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 증가합니다. + + + 효과 대상 플레이어 및 괴물의 공격력이 감소합니다. + + + 모든 물약의 기본이 됩니다. 양조대에서 사용하여 물약을 만들 수 있습니다. + 역겨운 지독한 - - 모든 물약의 기본이 됩니다. 양조대에서 사용하여 물약을 만들 수 있습니다. - - - 그 자체로는 효과가 없습니다. 양조대에서 다른 재료를 추가로 넣어 효과를 추가할 수 있습니다. - - - 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 빨라집니다. 플레이어의 질주 속도가 빨라지며 점프 거리와 시야 거리가 늘어납니다. - - - 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 느려집니다. 플레이어의 질주 속도가 느려지며 점프 거리와 시야 거리가 줄어듭니다. - - - 효과 대상 플레이어 및 괴물의 공격력이 증가합니다. - - - 효과 대상 플레이어 및 괴물의 공격력이 감소합니다. - - - 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 증가합니다. - - - 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 감소합니다. - - - 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 회복합니다. - - - 효과 대상 플레이어, 동물 및 괴물이 불, 용암 및 Blaze의 원거리 공격에 피해를 받지 않게 됩니다. - - - 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 감소합니다. + + 강타 예리 - - 강타 + + 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 감소합니다. - - 절지동물 격파 + + 공격 손상 타격 반동 - - 화염 + + 절지동물 격파 - - 방어 + + 속도 - - 화염 방어 + + 좀비 보강 - - 낙하 방어 + + 말 점프력 - - 폭발 방어 + + 적용할 경우: - - 발사체 방어 + + 타격 반동 방어력 - - 호흡 + + 괴물 및 동물 추적 범위 - - 수분 친화력 - - - 효율성 + + 체력 최대치 채굴 정확성 - - 견고 + + 효율성 - - 전리품 획득 + + 수분 친화력 희귀품 채굴 - - 강화 + + 전리품 획득 - + + 견고 + + + 화염 방어 + + + 방어 + + 화염 - - 강타 + + 낙하 방어 - - 무한 + + 호흡 - - I + + 발사체 방어 - - II - - - III + + 폭발 방어 IV @@ -5282,23 +6218,29 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E VI + + 강타 + VII - - VIII + + III - - IX + + 화염 - - X + + 강화 - - 철제 곡괭이 이상으로 채굴하면 에메랄드를 얻습니다. + + 무한 - - 상자와 비슷하지만 다른 차원에서도 플레이어의 모든 Ender 상자에서 사용할 수 있습니다. + + II + + + I 어떤 개체가 연결된 철사 덫을 통과할 때 활성화됩니다. @@ -5309,44 +6251,59 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 에메랄드를 저장하는 간편한 방법입니다. - - 조약돌로 만들어진 벽입니다. + + 상자와 비슷하지만 다른 차원에서도 플레이어의 모든 Ender 상자에서 사용할 수 있습니다. - - 무기, 도구, 방어구를 수리하기 위해 사용할 수 있습니다. + + IX - - 화로에서 녹여 지하 석영을 만들 수 있습니다. + + VIII - - 장식으로 사용됩니다. + + 철제 곡괭이 이상으로 채굴하면 에메랄드를 얻습니다. - - 마을 사람들과 교환할 수 있습니다. - - - 장식으로 사용할 수 있습니다. 이 안에 꽃, 묘목, 선인장과 버섯을 심을 수 있습니다. + + X {*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*}를 1만큼 회복하지만 병에 걸릴 수 있습니다. 안장 얹은 돼지를 탈 때 돼지를 제어하기 위해 사용합니다. - - {*ICON_SHANK_01*}를 4만큼 회복합니다. + + {*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 감자를 조리해서 만듭니다. + + + {*ICON_SHANK_01*}를 3만큼 회복합니다. 당근과 금덩이로 만듭니다. 모루로 무기, 도구, 방어구에 효과를 부여할 때 사용합니다. @@ -5354,6 +6311,15 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 지하 석영 광석을 녹여 만듭니다. 석영 블록을 만들 수 있습니다. + + 감자 + + + 구운 감자 + + + 당근 + 양털로 만듭니다. 장식으로 사용됩니다. @@ -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,72 +6458,77 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 깎아놓은 사암 - - 부드러운 사암 - {*PLAYER*}이(가) {*SOURCE*}에게 상처를 주려다 죽었습니다. + + 부드러운 사암 + {*PLAYER*}이(가) 떨어지는 모루에 깔렸습니다. {*PLAYER*}이(가) 떨어지는 블록에 깔렸습니다. - - {*PLAYER*}을(를) {*DESTINATION*}에게로 순간 이동시켰습니다 - {*PLAYER*}이(가) 그들의 위치로 당신을 순간 이동시켰습니다 - - {*PLAYER*}이(가) 당신 위치로 순간 이동시켰습니다 + + {*PLAYER*}을(를) {*DESTINATION*}에게로 순간 이동시켰습니다 가시 - - 석영 발판 + + {*PLAYER*}이(가) 당신 위치로 순간 이동시켰습니다 물속 같이 어두운 지역을 밝게 해줍니다. + + 석영 발판 + 플레이어, 동물 및 괴물이 안 보이게 합니다. 수리 및 이름 붙이기 - - 효과부여 비용: %d - 너무 비쌉니다! - - 이름 바꾸기 + + 효과부여 비용: %d 현재 소유: - - 교환에 필요한 아이템 + + 이름 바꾸기 {*VILLAGER_TYPE*}이(가) %s을(를) 제안합니다 - - 수리 + + 교환에 필요한 아이템 교환 - - 목걸이 염색 + + 수리 이것은 모루 인터페이스입니다. 경험치를 지불하고 무기, 방어구 또는 도구의 이름을 바꾸고 수리하고 효과를 부여할 수 있습니다. + + + + 목걸이 염색 + + + + 작업할 아이템을 첫 번째 입력 슬롯에 넣으십시오. @@ -5576,9 +6538,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 모루 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + - 작업할 아이템을 첫 번째 입력 슬롯에 넣으십시오. + 아니면 동일한 두 번째 아이템을 두 번째 슬롯에 넣어 두 아이템을 조합할 수 있습니다. @@ -5586,24 +6548,14 @@ 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,14 +6637,24 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 왼쪽에 있는 두 상자에서 교환에 필요한 아이템의 총 숫자를 볼 수 있습니다. - + - 마을 사람이 제안하는 아이템을 교환하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + 마을 사람에게 주는 아이템의 양과 유형은 왼쪽의 두 상자에 표시됩니다. 이 구역에는 마을 사람과 아이템을 구매할 수 있는 종이가 들어있는 상자가 있습니다. + + + + + 마을 사람이 제안하는 아이템을 교환하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + + + + + 플레이어는 소지품에서 아이템을 꺼내 마을 사람과 교환할 수 있습니다. @@ -5702,19 +6664,14 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 교환에 대해 이미 알고 있다면 {*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,37 +1,124 @@  - + + "PSN"에 로그인하시겠습니까? + + + 호스트 플레이어와 같은 "PlayStation Vita" 본체로 플레이하는 플레이어를 제외하고, 이 옵션을 선택하면 다른 "PlayStation Vita" 본체로 접속하는 플레이어를 추방할 수 있습니다. 추방당한 플레이어는 게임이 새로 시작되기 전까지 다시 참가할 수 없습니다. + + + SELECT + + + 이 옵션을 켜면 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 플레이 도중에 옵션을 켜거나 옵션을 켠 후 저장한 게임을 다시 불러와도 마찬가지입니다. + + + "PlayStation Vita" 본체 + + + 애드혹 네트워크를 선택해 근처에 있는 다른 "PlayStation Vita" 본체와 연결하든가 "PSN"을 선택해 전 세계의 친구들과 연결할 수 있습니다. + + + 애드혹 네트워크 + + + 네트워크 모드 변경 + + + 네트워크 모드 선택 + + + 분할 화면 온라인 ID + + + 트로피 + + + 이 게임은 레벨 자동 저장 기능을 지원합니다. 위에 보이는 아이콘은 게임을 저장하는 중임을 나타내는 것입니다. +이 아이콘이 화면에 있을 때 "PlayStation Vita" 본체를 끄지 마십시오. + + + 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. + + + 온라인 ID: + + + 텍스처 팩의 평가판을 사용 중입니다. 텍스처 팩의 전체 콘텐츠를 사용할 수 있지만 진행 상황은 저장할 수 없습니다. +평가판을 사용하는 동안 저장하려고 하면 정식 버전을 구매할 수 있는 옵션이 표시됩니다. + + + + 패치 1.04(제목 업데이트 14) + + + 게임 내 온라인 ID + + + Minecraft: "PlayStation Vita" Edition에서 제가 만든 것들을 보세요! + + + 다운로드 실패. 나중에 다시 시도해 주십시오. + + + 제한적 NAT 유형 때문에 게임에 참여할 수 없습니다. 네트워크 설정을 확인해 주십시오. + + + 업로드 실패. 나중에 다시 시도해 주십시오. + + + 다운로드 완료! + + + +현재 저장 전송 영역에 저장 데이터가 없습니다. +Minecraft: "PlayStation 3" Edition으로 월드 저장 데이터를 저장 전송 영역에 업로드한 후 Minecraft: "PlayStation Vita" Edition으로 다운로드할 수 있습니다. + + + + 저장 완료 안 됨 + + + Minecraft: "PlayStation Vita" Edition에 데이터를 저장할 공간이 없습니다. 저장할 공간을 만들기 위해 다른 Minecraft: "PlayStation Vita" Edition 저장 데이터를 삭제하십시오. + + + 업로드 취소됨 + + + 본 저장 데이터를 저장 전송 영역에 업로드하는 작업이 취소되었습니다. + + + PS3™/PS4™ 저장 데이터 업로드 + + + 데이터 업로드 중: %d%% + + + "PSN" + + + "PS3™" 저장 데이터 다운로드 + + + 데이터 다운로드 중: %d%% + + + 저장 중 + + + 업로드 완료! + + + 이 저장 데이터를 업로드해서 전송 영역에 있는 기존 저장 데이터를 덮어쓰시겠습니까? + + + 데이터 변환 중 + + NOT USED - - PlayStation(R)Vita 본체의 터치스크린을 사용해 메뉴를 찾을 수 있습니다! - - - minecraftforum에 PlayStation(R)Vita Edition 전용 섹션이 생겼습니다. - - - 4J Studios와 Kappische의 Twitter에서 이 게임의 최신 정보를 얻을 수 있습니다. - - - Enderman의 눈을 똑바로 쳐다보지 마십시오! - - - 4J Studios가 PlayStation(R)Vita 본체용 게임에서 Herobrine을 삭제한 것 같습니다. - - - 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가 표시되지 않습니다. + + NOT USED {*T3*}플레이 방법 : 창작 모드{*ETW*}{*B*}{*B*} @@ -46,33 +133,81 @@ PlayStation(R)Vita 본체용 Minecraft는 멀티 플레이 게임이 기본값 {*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. 비행 모드에서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올라가고{*CONTROLLER_ACTION_SNEAK*}을 길게 누르면 아래로 내려갑니다. 또는 방향키를 사용해서 상하좌우로 움직일 수도 있습니다. - - NOT USED - - - NOT USED - 게이머 카드 보기 - - 게이머 프로필 확인 - - - 친구 초대 - 창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다. 계속하시겠습니까? 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 계속하시겠습니까? - - 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. + + 게이머 프로필 확인 - - 호스트 권한을 켜고 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 옵션을 꺼도 마찬가지입니다. 계속하시겠습니까? + + 친구 초대 + + + minecraftforum에 "PlayStation Vita" Edition 전용 섹션이 생겼습니다. + + + 4J Studios와 Kappische의 Twitter에서 이 게임의 최신 정보를 얻을 수 있습니다. + + + NOT USED + + + "PlayStation 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가 표시되지 않습니다. + + + 4J Studios가 "PlayStation Vita" 본체용 게임에서 Herobrine을 삭제한 것 같습니다. + + + Minecraft: "PlayStation Vita" Edition이 다양한 기록을 갱신했습니다! + + + Minecraft: "PlayStation Vita" Edition 평가판을 플레이할 수 있는 시간이 만료되었습니다! 정식 버전 게임을 구매하여 계속해서 게임을 즐기시겠습니까? + + + "Minecraft: "PlayStation Vita" Edition"을 불러오는 중에 오류가 발생하여 계속할 수 없습니다. + + + 양조 + + + "PSN"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. + + + 한 명 이상의 플레이어 Sony Entertainment Network 계정의 대화 제한 때문에 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. + + + 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. + + + 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션을 생성할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. + + + 한 명 이상의 플레이어가 Sony Entertainment Network 계정의 대화 제한 때문에 온라인 게임을 플레이할 수 없어 온라인 게임을 만들 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. + + + 대화 제한 때문에 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. "PSN" 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. @@ -80,18 +215,15 @@ PlayStation(R)Vita 본체용 Minecraft는 멀티 플레이 게임이 기본값 "PSN"과의 연결이 끊어졌습니다. + + 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. + + + 호스트 권한을 켜고 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 옵션을 꺼도 마찬가지입니다. 계속하시겠습니까? + - 이 Minecraft: PlayStation(R)Vita Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. -정식 버전 게임을 구매하면 Minecraft: PlayStation(R)Vita Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. -정식 버전 게임을 구매하시겠습니까? - - - 이 PlayStation(R)Vita Edition은 평가판입니다. 정식 버전 게임에서는 테마를 받을 수 있습니다! -정식 버전 게임을 구매하면 Minecraft: PlayStation(R)Vita Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 즐길 수 있습니다. -정식 버전 게임을 구매하시겠습니까? - - - 이 게임은 Minecraft: PlayStation(R)Vita Edition 평가판입니다. 초대를 수락하려면 정식 버전 게임이 필요합니다. + 이 Minecraft: "PlayStation Vita" Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft: "PlayStation Vita" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. 정식 버전 게임을 구매하시겠습니까? @@ -100,145 +232,16 @@ PlayStation(R)Vita 본체용 Minecraft는 멀티 플레이 게임이 기본값 온라인 ID - - 양조 + + 이 "PlayStation Vita" Edition은 평가판입니다. 정식 버전 게임에서는 테마를 받을 수 있습니다! +정식 버전 게임을 구매하면 Minecraft: "PlayStation Vita" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? - - "PSN"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. + + 이 게임은 Minecraft: "PlayStation Vita" Edition 평가판입니다. 초대를 수락하려면 정식 버전 게임이 필요합니다. +정식 버전 게임을 구매하시겠습니까? - - Minecraft: PlayStation(R)Vita Edition 평가판을 플레이할 수 있는 시간이 만료되었습니다! 정식 버전 게임을 구매하여 계속해서 게임을 즐기시겠습니까? - - - "Minecraft: PlayStation(R)Vita Edition"을 불러오는 중에 오류가 발생하여 계속할 수 없습니다. - - - 한 명 이상의 플레이어 Sony Entertainment Network 계정의 대화 제한 때문에 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. - - - 한 명 이상의 플레이어가 Sony Entertainment Network 계정의 대화 제한 때문에 온라인 게임을 플레이할 수 없어 온라인 게임을 만들 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. - - - 대화 제한 때문에 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. - - - 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. - - - 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션을 생성할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. - - - 이 게임은 레벨 자동 저장 기능을 지원합니다. 위에 보이는 아이콘은 게임을 저장하는 중임을 나타내는 것입니다. -이 아이콘이 화면에 있을 때 PlayStation(R)Vita 본체를 끄지 마십시오. - - - 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. - - - 분할 화면 온라인 ID - - - 트로피 - - - 온라인 ID: - - - 게임 내 온라인 ID - - - Minecraft: PlayStation(R)Vita Edition에서 제가 만든 것들을 보세요! - - - 텍스처 팩의 평가판을 사용 중입니다. 텍스처 팩의 전체 콘텐츠를 사용할 수 있지만 진행 상황은 저장할 수 없습니다. -평가판을 사용하는 동안 저장하려고 하면 정식 버전을 구매할 수 있는 옵션이 표시됩니다. - - - - 패치 1.04(제목 업데이트 14) - - - SELECT - - - 이 옵션을 켜면 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 플레이 도중에 옵션을 켜거나 옵션을 켠 후 저장한 게임을 다시 불러와도 마찬가지입니다. - - - "PSN"에 로그인하시겠습니까? - - - 호스트 플레이어와 같은 PlayStation(R)Vita 본체로 플레이하는 플레이어를 제외하고, 이 옵션을 선택하면 다른 PlayStation(R)Vita 본체로 접속하는 플레이어를 추방할 수 있습니다. 추방당한 플레이어는 게임이 새로 시작되기 전까지 다시 참가할 수 없습니다. - - - PlayStation(R)Vita 본체 - - - 네트워크 모드 변경 - - - 네트워크 모드 선택 - - - 애드혹 네트워크를 선택해 근처에 있는 다른 PlayStation(R)Vita 본체와 연결하든가 "PSN"을 선택해 전 세계의 친구들과 연결할 수 있습니다. - - - 애드혹 네트워크 - - - "PSN" - - - PlayStation(R)3 저장 데이터 다운로드 - - - PlayStation(R)3/PlayStation(R)4 저장 데이터 업로드 - - - 업로드 취소됨 - - - 본 저장 데이터를 저장 전송 영역에 업로드하는 작업이 취소되었습니다. - - - 데이터 업로드 중: %d%% - - - 데이터 다운로드 중: %d%% - - - 이 저장 데이터를 업로드해서 전송 영역에 있는 기존 저장 데이터를 덮어쓰시겠습니까? - - - 데이터 변환 중 - - - 저장 중 - - - 업로드 완료! - - - 업로드 실패. 나중에 다시 시도해 주십시오. - - - 다운로드 완료! - - - 다운로드 실패. 나중에 다시 시도해 주십시오. - - - 제한적 NAT 유형 때문에 게임에 참여할 수 없습니다. 네트워크 설정을 확인해 주십시오. - - - - 현재 저장 전송 영역에 저장 데이터가 없습니다. - Minecraft: PlayStation(R)3 Edition으로 월드 저장 데이터를 저장 전송 영역에 업로드한 후 Minecraft: PlayStation(R)Vita Edition으로 다운로드할 수 있습니다. - - - - 저장 완료 안 됨 - - - Minecraft: PlayStation(R)Vita Edition에 데이터를 저장할 공간이 없습니다. 저장할 공간을 만들기 위해 다른 Minecraft: PlayStation(R)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. - - - Volviste a la pantalla de título porque cerraste sesión en "PSN". - - - La partida finalizó porque cerraste sesión en "PSN". - - - - No has iniciado sesión. - - - - Este juego ofrece funciones que requieren estar conectado a "PSN", 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. - - - Esta función requiere haber iniciado sesión en "PSN". - - - - Conectarse a "PSN". - - - Conectar a Red Ad hoc - - - Problema con el trofeo - - - Se produjo un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. + + Se produjo un error al guardar la configuración en la cuenta Sony Entertainment Network. Problema con la cuenta Sony Entertainment Network - - Se produjo un error al guardar la configuración en la cuenta Sony Entertainment Network. + + Se produjo un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. 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? + + 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 + + + Problema con el trofeo + + + La partida finalizó porque cerraste sesión en "PSN". + + + + Volviste a la pantalla de título porque cerraste sesión en "PSN". + + + El almacenamiento del sistema no tiene suficiente espacio libre para crear un juego guardado. + + + No has iniciado sesión. + + + 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/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,3113 +1,905 @@  - - ¡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! - - - No todos los suecos son rubios. ¡Algunos, como Jens de Mojang, son pelirrojos! - - - ¡Pronto habrá una actualización de este juego! - - - ¿Quién es Notch? - - - ¡Mojang tiene más premios que empleados! - - - ¡Hay famosos que juegan Minecraft! - - - ¡A deadmau5 le gusta Minecraft! - - - No mires directamente a los bichos. - - - Los creepers surgieron de un fallo de código. - - - ¿Es una gallina o es un pato? - - - ¿Estuviste en la Minecon? - - - Nadie de Mojang le ha visto jamás la cara a Junkboy. - - - ¿Sabías que hay una wiki de Minecraft? - - - ¡El nuevo despacho de Mojang es genial! - - - ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE. UU.! - - - .party() fue excelente. - - - Supón siempre que los rumores son falsos, ¡no te los creas! - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - - {*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. Oprime{*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 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. - - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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*} - - - - {*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. - - - - {*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. - - - - {*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. - - - - Página siguiente - - - Página anterior - - - Fundamentos - - - Panel de datos - - - Inventario - - - Cofres - - - Creación - - - Horno - - - Dispensador - - - Cuidar animales - - - Reproducción de animales - - + Elaboración de pociones - - Encantamientos - - - Portal del Inframundo - - - Multijugador - - - Compartir capturas de pantalla - - - Bloquear niveles - - - Modo Creativo - - - Opciones de anfitrión y de jugador - - - Comercio - - - Yunque - - - El Fin - - - {*T3*}CÓMO SE JUEGA: EL FIN{*ETW*}{*B*}{*B*} -El Fin es otra dimensión del juego a la que se llega a través de un portal 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. - - - Correr - - - Novedades - - - {*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*} - - - - {*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*} - - - - Causas más daño que con la mano. - - - Se usa para excavar tierra, hierba, arena, gravilla y nieve más rápido que a mano. La pala es necesaria para excavar bolas de nieve. - - - Necesario para extraer bloques de piedra y mineral. - - - Se usa para cortar bloques de madera más rápido que a mano. - - - Se usa para labrar tierra y hierba y prepararla para el cultivo. - - - Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. - - - Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. - - - NO SE USA - - - NO SE USA - - - NO SE USA - - - NO SE USA - - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Herramientas, armas y armadura - - Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + Materiales - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Bloques de construcción - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Piedra rojiza y transporte - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Varios - - Cuando la lleva puesta, el usuario recibe 5 de armadura. + + Entradas: - - Cuando los lleva puestos, el usuario recibe 4 de armadura. + + Salir sin guardar - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! - - Cuando las lleva puestas, el usuario recibe 6 de armadura. + + El archivo guardado está dañado. ¿Quieres borrarlo? - - Cuando las lleva puestas, el usuario recibe 5 de armadura. + + ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. - - Cuando las lleva puestas, el usuario recibe 2 de armadura. + + Salir y guardar - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Crear nuevo mundo - - Cuando la lleva puesta, el usuario recibe 5 de armadura. + + Escribe un nombre para tu mundo. - - Cuando las lleva puestas, el usuario recibe 3 de armadura. + + Introduce la semilla para la generación del mundo. - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Cargar mundo guardado - - Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + Jugar tutorial - - Cuando la lleva puesta, el usuario recibe 8 de armadura. + + Tutorial - - Cuando las lleva puestas, el usuario recibe 6 de armadura. + + Dar nombre al mundo - - Cuando las lleva puestas, el usuario recibe 3 de armadura. + + Archivo dañado - - Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. + + Aceptar - - 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. + + Cancelar - - 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. + + Tienda de Minecraft - - Se usan en escaleras compactas. + + Rotar - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + Ocultar - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + Vaciar todos los espacios - - Se usa para crear luz, pero también derrite la nieve y el hielo. + + ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderá todo el progreso no guardado. - - Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. + + ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? - - Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. + + ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! - - Se usa como material de construcción. + + Iniciar partida - - Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. + + Salir de la partida - - 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. + + Guardar partida - - Te permite crear una selección más variada de objetos que la creación normal. + + Salir sin guardar - - Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. + + Oprime START para unirte. - - 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. + + ¡Hurra! ¡Recibiste una imagen de jugador de Steve, de Minecraft! - - 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. + + ¡Hurra! ¡Recibiste una imagen de jugador de un creeper! - - Se usa para ascender en vertical. + + Desbloquear juego completo - - 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. + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. - - Muestra el texto introducido por ti o por otros jugadores. + + Nuevo 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. + + ¡Premio desbloqueado! - - 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. + + Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. +¿Quieres desbloquear el juego completo? - - Se usa para contener estofado de champiñón. Te quedas el tazón después de comer el estofado. + + Amigos - - Se usa para contener y transportar agua, lava o leche. + + Mi puntuación - - Se usa para contener y transportar agua. + + Total - - Se usa para contener y transportar lava. + + Espera... - - Se usa para contener y transportar leche. + + Sin resultados - - Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. + + Filtro: - - Se usa para pescar peces. + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. - - Muestra la posición del sol y de la luna. + + Conexión perdida - - Indica tu punto de inicio. + + Se perdió la conexión con el servidor. Saliendo al menú principal. - - Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. + + Desconectado por el servidor - - Permite ataques a distancia con flechas. + + Saliendo de la partida - - Se usa como munición para arcos. + + Se produjo un error. Saliendo al menú principal. - - Restablece 2.5{*ICON_SHANK_01*}. + + Error de conexión - - Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. + + Te expulsaron de la partida. - - Restablece 1{*ICON_SHANK_01*}. + + El anfitrión abandonó la partida. - - Restablece 1{*ICON_SHANK_01*}. + + No puedes unirte a esta partida porque no tienes ningún amigo en ella. - - Recupera 3 de{*ICON_SHANK_01*}. + + No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. - - Restablece 2{*ICON_SHANK_01*} y se puede cocinar en un horno. Si lo comes crudo, puedes envenenarte. + + Te expulsaron de la partida por volar. - - Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. + + El intento de conexión tomó demasiado tiempo. - - Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + El servidor está lleno. - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. + + 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! - - Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + Temas - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando chuleta de cerdo cruda en un horno. + + Skin Packs - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. + + Permitir amigos de amigos - - Restablece 2.5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. + + Expulsar jugador - - Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + + ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. - - Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se fabrica con una manzana y pepitas de oro. + + Packs de imágenes de jugador - - Restablece 2{*ICON_SHANK_01*}. Si la comes, puedes envenenarte. + + No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. - - Se usa en la receta de pasteles y como ingrediente para elaborar pociones. + + Contenido descargable dañado - - Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a oprimir. + + 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. - - 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. + + Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. - - Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + + No puedes unirte a la partida - - Se usa para enviar una descarga eléctrica cuando se oprime. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. + + Seleccionado - - Se usa para contener y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. + + Aspecto seleccionado: - - 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. + + Conseguir versión completa - - Se usa para llevar vagonetas. + + Desbloquear pack de textura - - Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + + Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? - - Funciona como una placa de presión: envía una señal de piedra rojiza, pero solo cuando es activada por una vagoneta. + + Versión de prueba del pack de textura - - Se usa para transportarte sobre los rieles a ti, a un animal o a un monstruo. + + Semilla - - Se usa para transportar mercancías sobre los rieles. + + Desbloquear skin pack - - Se mueve sobre los rieles y empujará a otras vagonetas si se le añade hulla. + + Para usar la apariencia que seleccionaste tienes que desbloquear este skin pack. +¿Quieres desbloquear este skin pack ahora? - - Te permite desplazarte por el agua más rápido que nadando. + + 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? - - Se obtiene de las ovejas y se puede colorear con tinte. + + Descargar versión completa - - 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. + + ¡Este mundo usa un pack de textura o de popurrí que no tienes! +¿Quieres instalar el pack de textura o de popurrí ahora? - - Se usa como tinte para crear lana negra. + + Conseguir versión de prueba - - Se usa como tinte para crear lana verde. + + Pack de textura no disponible - - Se usan como tinte para crear lana marrón, como ingrediente de las galletas y para cultivar vainas de cacao. + + Desbloquear versión completa - - Se usa como tinte para crear lana plateada. + + Descargar versión de prueba - - Se usa como tinte para crear lana amarilla. + + Se cambió el modo de juego. - - Se usa como tinte para crear lana roja. + + Si está habilitado, solo los jugadores invitados pueden unirse. - - Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. + + Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. - - Se usa como tinte para crear lana rosa. + + Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. - - Se usa como tinte para crear lana naranja. + + Normal - - Se usa como tinte para crear lana limón. + + Superplano - - Se usa como tinte para crear lana gris. + + Si está habilitado, la partida será online. - - 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). + + Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. - - Se usa como tinte para crear lana azul claro. + + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. - - Se usa como tinte para crear lana cian. + + Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el Inframundo. - - Se usa como tinte para crear lana púrpura. + + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de reaparición del jugador. - - Se usa como tinte para crear lana magenta. + + Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. - - Se usa como tinte para crear lana azul. + + Si está habilitado, la dinamita explota cuando se activa. - - Reproduce discos. + + Si está habilitado, el Inframundo se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del Inframundo. - - Úsalos para crear herramientas, armas o armaduras sólidas. + + No - - 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. + + Modo de juego: Creativo - - Se usa para crear libros y mapas. + + Supervivencia - - Se usa para crear estanterías o encantamiento para hacer libros encantados. + + Creativo - - Permite la creación de encantamientos más poderosos cuando se coloca en una mesa de encantamiento. + + Cambiar nombre del mundo - - Se usa como elemento decorativo. + + Escribe un nuevo nombre para tu mundo. - - Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + + Modo de juego: Supervivencia - - Se puede extraer con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + + Creado en modo Supervivencia - - Se puede extraer con un pico para obtener hulla. + + Renombrar partida guardada - - Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. + + Autoguardando en %d... - - Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. + + - - Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. + + Creado en modo Creativo - - Se puede extraer con un pico para obtener guijarros. + + Generar nubes - - Se recoge con una pala. Se puede emplear en la construcción. + + ¿Qué quieres hacer con esta partida guardada? - - Se puede plantar y con el tiempo se convierte en un árbol. + + Tamaño panel (pantalla dividida) - - No se puede romper. + + Ingrediente - - Prende fuego a cualquier cosa que toque. Se puede recoger en un cubo. + + Combustible - - 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 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 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. - - - 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. - - - Una forma compacta de almacenar bolas de nieve. - - - Se puede excavar con una pala para crear bolas de nieve. - - - A veces produce semillas de trigo cuando se rompe. - - - Se puede convertir en tinte. - - - Junto con un tazón 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 coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumenta la duración del efecto. - - - Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. - - - Terreno preparado para plantar semillas. - - - Se pueden cocinar en un horno para crear tinte verde. - - - Se pueden usar para crear azúcar. - - - 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. - - - Si se le prende fuego, arderá para siempre. - - - Frena el movimiento de cualquier cosa que camina sobre ella. - - - Si te colocas en el portal podrás trasladarte del mundo superior al Inframundo y viceversa. - - - Se usa como combustible en un horno o se puede convertir en una antorcha. - - - 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. - - - Se consigue al matar a una gallina y se puede convertir en una flecha. - - - Se consigue al matar a un creeper y se puede convertir en dinamita o usar como ingrediente para elaborar pociones. - - - Se pueden plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! - - - Se recoge de los cultivos y se puede usar para crear alimentos. - - - Se obtiene al excavar grava y se puede usar para crear un encendedor de pedernal. - - - Si se usa con un cerdo te permite montarlo. Podrás dirigir al cerdo usando un palo con zanahoria. - - - Se obtiene al excavar nieve y se puede arrojar. - - - Se obtiene al matar a una vaca y se puede convertir en armadura o usar para fabricar libros. - - - Se obtiene al matar a un limo y se usa como ingrediente para elaborar pociones o se crea para hacer pistones adhesivos. - - - Las gallinas lo ponen al azar y se puede convertir en alimentos. - - - 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. - - - Se obtiene al matar a 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. - - - Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. - - - Se encuentra en subterráneos, se puede emplear en la construcción y en la decoración. - - - Se usan para obtener lana de las ovejas y cosechar bloques de hojas. - - - 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 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. - - - Se crea con bloques de piedra y se encuentra normalmente en fortalezas. - - - Se usa como barrera, igual que las vallas. - - - Es como una puerta, pero se usa principalmente con vallas. - - - Se puede crear a partir de rodajas de melón. - - - Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. - - - Se pueden plantar para cultivar calabazas. - - - Se pueden plantar para cultivar melones. - - - 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. - - - Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. - - - Se puede emplear en la construcción y en la decoración. - - - Frena el movimiento cuando pasas sobre ella. Se puede destruir con unas tijeras 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. - - - Una vez colocada, va creciendo con el paso del tiempo. Se puede recolectar con tijeras. Puede usarse como una escalera para trepar por ella. - - - 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. - - - 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 Inframundo o en sus alrededores. - - - Se usa para elaborar pociones. La sueltan los espectros cuando mueren. - - - La sueltan los hombres-cerdo zombis cuando mueren. Estos se encuentran en el Inframundo. Se usa como ingrediente para elaborar pociones. - - - Se usan para preparar pociones. Crecen de forma natural en las fortalezas del Inframundo. También se pueden plantar en arena de almas. - - - Puede tener diversos efectos, dependiendo de con qué se use. - - - 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 a una araña o a una araña de las cuevas. - - - Se usa para elaborar pociones, principalmente con efecto negativo. - - - Se usa para elaborar pociones o se combina con otros objetos para crear el ojo de Ender o la crema de magma. - - - Se usa para elaborar pociones. - - - Se usa para crear pociones y pociones de salpicadura. - - - Se puede llenar de lluvia o de agua con un cubo y usar para llenar de agua los frascos de cristal. - - - 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. - - - Se usa para elaborar pociones. - - - Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. - - - Flota en el agua y se puede caminar sobre él. - - - Se usa para construir fortalezas del Inframundo. Es inmune a las bolas de fuego del espectro. - - - Se usa en las fortalezas del Inframundo. - - - Se encuentra en las fortalezas del Inframundo y suelta verrugas del Inframundo cuando se rompe. - - - Permite encantar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia. - - - Se puede activar con doce ojos de Ender y permite al jugador viajar a la dimensión El Fin. - - - Se usa para crear un portal a El Fin. - - - 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. - - - Útil para prender fuego a las cosas o para provocar incendios indiscriminadamente disparándola desde un dispensador. - - - Es similar a una vitrina y muestra el objeto o el bloque que contiene. - - - Al lanzarse, puede generar una criatura del tipo indicado. - - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - - Se crea al fundir piedra del Inframundo en un horno. Se puede convertir en bloques de ladrillo del Inframundo. - - - Al recibir energía, emite luz. - - - Puede cultivarse en la granja para cosechar granos de cacao. - - - Las cabezas de enemigos pueden colocarse como decoración o usarse como una máscara en el espacio del casco. - - - Calamar - - - Suelta bolsas de tinta cuando muere. - - - Vaca - - - Suelta cuero cuando muere. Se puede ordeñar con un cubo. - - - Oveja - - - Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. - - - Gallina - - - Suelta plumas cuando muere y pone huevos al azar. - - - Cerdo - - - Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. - - - Lobo - - - Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos para que 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 y huesos cuando muere. - - - Araña - - - Te ataca cuando está cerca. Puede trepar por muros. Suelta cuerda cuando muere. - - - Zombi - - - Te ataca cuando está cerca. - - - Hombre-cerdo zombi - - - En principio es manso, pero si atacas a uno, atacará en grupo. - - - Espectro - - - Te dispara bolas de fuego que explotan al entrar en contacto. - - - Limo - - - Escupe limos más pequeños cuando recibe daños. - - - Enderman - - - Te ataca si lo miras. También puede mover bloques de lugar. - - - 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. - - - Champivaca - - - 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. - - - Golem de nieve - - - Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. - - - Dragón Ender - - - Un dragón negro y grande que se encuentra en El Fin. - - - Llama - - - Son enemigos que se encuentran en el Inframundo, principalmente dentro de sus fortalezas. Sueltan varas de llama cuando mueren. - - - Cubo de magma - - - Se encuentran en el Inframundo. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. - - - Aldeano - - - Ocelote - - - 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á. - - - Golem de hierro - - - Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. - - - Animador de explosivos - - - Artista conceptual - - - Cálculos y estadísticas - - - Coordinador de bullies - - - Diseño original y programación - - - Coordinador de proyecto/Productor - - - Resto del despacho Mojang - - - Jefe de programación de Minecraft PC - - - Programador ninja - - - Director ejecutivo - - - Empleado de cuello blanco - - - Atención al cliente - - - DJ de la oficina - - - Diseñador/Programador de Minecraft - Pocket Edition - - - Desarrollador - - - Arquitecto en jefe - - - Desarrollador artístico - - - Creador de juego - - - Director de diversión - - - Música y efectos - - - Programación - - - Arte - - - Control de calidad - - - Productor ejecutivo - - - Jefe de producción - - - Productor - - - Jefe de pruebas de control de calidad - - - Jefe de pruebas - - - Equipo de diseño - - - Equipo de desarrollo - - - Coordinador de lanzamiento - - - Director de XBLA Publishing - - - Desarrollo mercantil - - - Director de inversiones - - - Coordinador de producto - - - Marketing - - - Coordinador de comunidad - - - Equipo de localización de Europa - - - Equipo de localización de Redmond - - - Equipo de localización de Asia - - - Equipo de investigación de usuario - - - Equipos principales de MGS - - - Certificador de calidad de logros - - - Agradecimientos especiales - - - Coordinador de pruebas de control de calidad - - - Jefe sénior de pruebas de control de calidad - - - SDET - - - STE de proyecto - - - STE adicionales - - - Socios de control de calidad - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Espada de madera - - - Espada de piedra - - - Espada de hierro - - - Espada de diamante - - - Espada de oro - - - Pala de madera - - - Pala de piedra - - - Pala de hierro - - - Pala de diamante - - - Pala de oro - - - Pico de madera - - - Pico de piedra - - - Pico de hierro - - - Pico de diamante - - - Pico de oro - - - Hacha de madera - - - Hacha de piedra - - - Hacha de hierro - - - Hacha de diamante - - - Hacha de oro - - - Azadón de madera - - - Azadón de piedra - - - Azadón de hierro - - - Azadón de diamante - - - Azadón de oro - - - Puerta de madera - - - Puerta de hierro - - - Casco de malla - - - Pechera de malla - - - Mallas de malla - - - Botas de malla - - - Gorro de cuero - - - Casco de hierro - - - Casco de diamante - - - Casco de oro - - - Túnica de cuero - - - Pechera de hierro - - - Pechera de diamante - - - Pechera de oro - - - Pantalones de cuero - - - Mallas de hierro - - - Mallas de diamante - - - Mallas de oro - - - Botas de cuero - - - Botas de hierro - - - Botas de diamante - - - Botas de oro - - - Lingote de hierro - - - Lingote de oro - - - Cubo - - - Cubo de agua - - - Cubo de lava - - - Encend. de pedernal - - - Manzana - - - Arco - - - Flecha - - - Hulla - - - Carbón - - - Diamante - - - Palo - - - Tazón - - - Estofado de champiñón - - - Cuerda - - - Pluma - - - Pólvora - - - Semillas de trigo - - - Trigo - - - Pan - - - Pedernal - - - Chuleta de cerdo cruda - - - Chuleta de cerdo cocinada - - - Cuadro - - - Manzana de oro - - - Cartel - - - Vagoneta - - - Silla de montar - - - Piedra rojiza - - - Bola de nieve - - - Bote - - - Cuero - - - Cubo de leche - - - Ladrillo - - - Arcilla - - - Cañas de azúcar - - - Papel - - - Libro - - - Bola de limo - - - Vagoneta con cofre - - - Vagoneta con horno - - - Huevo - - - Brújula - - - Caña de pescar - - - Reloj - - - Polvo de piedra brillante - - - Pescado crudo - - - Pescado cocido - - - Polvo de tinte - - - Bolsa de tinta - - - Rojo rosa - - - Verde cactus - - - Granos de cacao - - - Lapislázuli - - - Tinte púrpura - - - Tinte cian - - - Tinte gris claro - - - Tinte gris - - - Tinte rosa - - - Tinte limón - - - Amarillo diente de león - - - Tinte azul claro - - - Tinte magenta - - - Tinte naranja - - - Polvo de hueso - - - Hueso - - - Azúcar - - - Pastel - - - Cama - - - Repetidor de piedra rojiza - - - Galleta - - - Mapa - - - Disco: "13" - - - Disco: "Gato" - - - Disco: "Bloques" - - - Disco: "Gorjeo" - - - Disco: "Lejos" - - - Disco: "Galería" - - - Disco: "Mellohi" - - - Disco: "Stal" - - - Disco: "Strad" - - - Disco: "Pabellón" - - - Disco: "11" - - - Disco: "Dónde estamos" - - - Tijeras - - - Semillas de calabaza - - - Semillas de melón - - - Pollo crudo - - - Pollo cocido - - - Res cruda - - - Filete - - - Carne podrida - - - Perla de Ender - - - Rodaja de melón - - - Vara de llama - - - Lágrima de espectro - - - Pepita de oro - - - Verruga del Inframundo - - - Poción{*splash*}{*prefix*}{*postfix*} - - - Frasco de cristal - - - Botella de agua - - - Ojo de araña - - - Ojo araña fermentado - - - Polvo de llama - - - Crema de magma - - - Soporte para pociones - - - Caldero - - - Ojo de Ender - - - Melón resplandeciente - - - Botella de encantamiento - - - Descarga de fuego - - - Desc. fuego (carbón) - - - Desc. fuego (hulla) - - - Marco - - - Generar {*CREATURE*} - - - Ladrillo del Inframundo - - - Calavera - - - Calavera de esqueleto - - - Calavera de esqueleto atrofiado - - - Cabeza de zombi - - - Cabeza - - - Cabeza de %s - - - Cabeza de creeper - - - Piedra - - - Bloque de hierba - - - Tierra - - - Guijarro - - - Tablones de roble - - - Tablones de abeto - - - Tablones de abedul - - - Tablones de la jungla - - - Brote - - - Brote de roble - - - Brote de abeto - - - Brote de abedul - - - Brote de árbol de la jungla - - - Lecho de roca - - - Agua - - - Lava - - - Arena - - - Arenisca - - - Grava - - - Mineral de oro - - - Mineral de hierro - - - Mineral de hulla - - - Madera - - - Madera de roble - - - Madera de abeto - - - Madera de abedul - - - Madera de la jungla - - - Roble - - - Abeto - - - Abedul - - - Hojas - - - Hojas de roble - - - Hojas de abeto - - - Hojas de abedul - - - Hojas de la jungla - - - Esponja - - - Cristal - - - Lana - - - Lana negra - - - Lana roja - - - Lana verde - - - Lana marrón - - - Lana azul - - - Lana púrpura - - - Lana cian - - - Lana gris claro - - - Lana gris - - - Lana rosa - - - Lana limón - - - Lana amarilla - - - Lana azul claro - - - Lana magenta - - - Lana naranja - - - Lana blanca - - - Flor - - - Rosa - - - Champiñón - - - Bloque de oro - - - Una forma compacta de almacenar oro. - - - Bloque de hierro - - - Una forma compacta de almacenar hierro. - - - Losa simple - - - Losa de piedra - - - Losa de arenisca - - - Losa de roble - - - Losa de guijarros - - - Losa de ladrillos - - - Losa (ladrillos de piedra) - - - Losa de roble - - - Losa de abeto - - - Losa de abedul - - - Losa de la jungla - - - Losa del Inframundo - - - - Ladrillo - - - Dinamita - - - Estantería - - - Piedra musgosa - - - Obsidiana - - - Antorcha - - - Antorcha (hulla) - - - Antorcha (carbón) - - - Fuego - - - Generador de monstruos - - - Escaleras de roble - - - Cofre - - - Polvo de piedra rojiza - - - Mineral de diamante - - - Bloque de diamante - - - Una forma compacta de almacenar diamantes. - - - Mesa de trabajo - - - Cultivos - - - Granja - - - Horno - - - Cartel - - - Puerta de madera - - - Escalera - - - Rieles - - - Rieles propulsores - - - Rieles detectores - - - Escaleras de piedra - - - Palanca - - - Placa de presión - - - Puerta de hierro - - - Mineral de piedra rojiza - - - Antorcha piedra roja - - - Botón - - - Nieve - - - Hielo - - - Cactus - - - Arcilla - - - Caña de azúcar - - - Tocadiscos - - - Valla - - - Calabaza - - - Calabaza iluminada - - - Bloque del Inframundo - - - Arena de almas - - - Piedra brillante - - - Portal - - - Mineral de lapislázuli - - - Bloque de lapislázuli - - - Una forma compacta de almacenar lapislázuli. - - + Dispensador - - Bloque de nota + + Cofre - - Pastel + + Encantamiento - - Cama + + Horno - - Telaraña + + No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. - - Hierba alta + + ¿Seguro que quieres borrar esta partida guardada? - - Arbusto muerto + + Esperando aprobación - - Diodo + + Censurado - - Cofre cerrado + + %s se unió a la partida. - - Trampilla + + %s abandonó la partida. - - Lana (cualquier color) + + Expulsaron a %s de la partida. - - Pistón - - - Pistón adhesivo - - - Bloque de pez plateado - - - Ladrillo de piedra - - - Ladrillo de piedra musgosa - - - Ladrillo de piedra agrietada - - - Ladrillo de piedra cincelada - - - Champiñón - - - Champiñón - - - Barras de hierro - - - Panel de cristal - - - Melón - - - Tallo de calabaza - - - Tallo de melón - - - Enredaderas - - - Puerta de valla - - - Escaleras de ladrillo - - - Esc. de ladrillos de piedra - - - Piedra de pez plateado - - - Guijarro de piedra de pez plateado - - - Ladrillo de piedra de pez plateado - - - Micelio - - - Nenúfar - - - Ladrillo del Inframundo - - - Valla del Inframundo - - - Escaleras del Inframundo - - - Verruga del Inframundo - - - Mesa de encantamientos - - + Soporte para pociones - - Caldero + + Introducir texto del cartel - - Portal a El Fin + + Introduce una línea de texto para tu cartel. - - Marco de portal a El Fin + + Introducir título - - Piedra de El Fin + + Fin de la versión de prueba - - Huevo de dragón + + Partida llena - - Arbusto + + No pudiste unirte a la partida y ya no quedan más espacios. - - Helecho + + Introduce un título para tu publicación. - - Esc. de losas de arenisca + + Introduce una descripción para tu publicación. - - Escaleras de abeto - - - Escaleras de abedul - - - Esc. madera de jungla - - - Lámpara de piedra rojiza - - - Cacao - - - Calavera - - - Controles actuales - - - Configuración - - - Mover/Correr - - - Mirar - - - Pausar - - - Saltar - - - Saltar/Volar hacia arriba - - + Inventario - - Cambiar objeto + + Ingredientes - - Acción + + Introducir descripción - - Usar + + Introduce una descripción para tu publicación. - - Crear + + Introducir descripción - - Soltar + + En reproducción: - - Sigilo + + ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir de la partida. - - Sigilo/Volar hacia abajo + + Eliminar de la lista de bloqueados - - Cambiar modo cámara + + Autoguardado cada - - Jugadores/Invitar + + Nivel bloqueado - - Movimiento (al volar) + + 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. - - Opción 1 + + ¿Bloquear este nivel? - - Opción 2 + + Autoguardado: NO - - Opción 3 + + Opacidad de la interfaz - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Preparando autoguardado del nivel - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Tamaño del panel de datos - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + minutos - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + ¡No se puede colocar aquí! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + No se puede colocar lava cerca del punto de reaparición del nivel porque puede matar al instante a los jugadores que se regeneran. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Apariencias favoritas - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Partida de %s - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Partida de anfitrión desconocido - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Un invitado cerró la sesión - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Restablecer ajustes - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + ¿Seguro que quieres restablecer los ajustes a los valores predeterminados? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Error al cargar - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Un jugador invitado cerró la sesión, lo que provocó que todos los invitados fueran excluidos de la partida. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Imposible crear la partida - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Selección automática - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Sin pack: apariencias regulares - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Iniciar sesión - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Multijugador no admitido - - <![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;]]> + + Beber - - {*B*}Oprime{*CONTROLLER_VK_A*} para continuar. - - - {*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. - - - Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. -De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda. - - - Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. - - - Usa{*CONTROLLER_ACTION_MOVE*} para moverte. - - - Para correr, 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. - - - Oprime{*CONTROLLER_ACTION_JUMP*} para saltar. - - - 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... - - - 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. - - - Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. - - - A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} - Oprime{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. - - - Cuando te mueves, extraes o atacas, tu barra de comida se vacía{*ICON_SHANK_01*}. Si corres y saltas, consumes más comida que si caminas y saltas de forma normal. - - - Si pierdes salud pero tienes una barra de comida con 9 o más{*ICON_SHANK_01*} en ella, la salud se repondrá automáticamente. Si comes, la barra de comida se recargará. - - - 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. - - - Tu barra de comida está baja y has perdido salud. Come el filete de tu inventario para recargar tu barra de comida y empezar a curarte.{*ICON*}364{*/ICON*} - - - La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} - - - Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} - - - 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*} - - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. - - - Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interactuar con ellos y colocarlos. Los objetos colocados se pueden volver a recoger extrayéndolos con la herramienta adecuada. - - - Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. - - - Apunta hacia la mesa de trabajo y oprime{*CONTROLLER_ACTION_USE*} para abrirla. - - - 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*} - - - 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*} - - - 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*} - - - Abre el contenedor. - - + - 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. + En esta área se colocó una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. - - - Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. - - - - - 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. - - - - 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*} - - - Ya recogiste suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. - - - Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. - - - Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? - - - 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? - - - Un buen refugio debe tener una puerta para que puedas entrar y salir con facilidad sin tener que perforar y sustituir los muros. Crea ahora una puerta de madera.{*WoodenDoorIcon*} - - - Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. - - - La noche puede ser muy oscura, así que necesitarás iluminación en el refugio si quieres ver. Crea una antorcha con palos y carbón mediante la interfaz de creación.{*TorchIcon*} - - - - Completaste la primera parte del tutorial. - - - + {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} - Oprime{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar solo. + 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. + + - 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. + 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. - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. - - - + - 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. + ¡En esta área hay un portal del Inframundo! - + - 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*} + 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. - + - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + 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*} - + - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime {*CONTROLLER_VK_BACK*}. + 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*} - + - Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario. + 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*} - + - Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. - - - + - 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. + 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. - + - 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. + Ahora estás en el modo Creativo. - + - 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*}. + {*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. - + - 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. + 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. - + - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime{*CONTROLLER_VK_BACK*} . + 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. - + - Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + 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. + + - Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + 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 continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo crear. - - - - {*B*} - Oprime{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. - - - - {*B*} - Oprime{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. - - - - {*B*} - Oprime{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. - - - + - Desplázate por las pestañas de tipo de grupo de la parte superior con{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para seleccionar el tipo de grupo del objeto que quieres crear; a continuación, usa{*CONTROLLER_MENU_NAVIGATE*} para seleccionar el objeto y crearlo. + {*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*} + + - 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. + {*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. + + - 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. + 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. + + - 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. + En esta zona hay algunas calabazas y bloques para crear un golem de nieve y otro de hierro. - + - Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. - - - - - Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. - - - - La leña que recojas se puede convertir en tablones. Selecciona el ícono de tablones y oprime{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} - - - - 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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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. - - - - - Hay objetos que no se pueden crear con la mesa de trabajo y requieren un horno. Crea un horno ahora.{*FurnaceIcon*} - - - - - 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. - - - - - Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. - - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. - - - - - Tienes que colocar combustible en el espacio de la parte inferior del horno y el objeto que quieres modificar en el espacio superior. El horno se encenderá y empezará a funcionar, y colocará el resultado en el espacio de la parte derecha. - - - - - Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También 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. - - - - - 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. - - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar 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. - - - - - 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. - - - - - 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. - - - - - En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. - - - - {*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. - - - - - El primer paso para elaborar una poción es crear una botella de agua. Toma un frasco de cristal del cofre. - - - - - 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*}. + 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. @@ -3124,11 +916,42 @@ De noche salen los monstruos, así que procura construir un refugio antes de que 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. + + + + {*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. + + + + + El primer paso para elaborar una poción es crear una botella de agua. Toma un frasco de cristal del cofre. + + + + + 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*}. Usa una poción de resistencia al fuego contigo mismo. + + + + + 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. + + + + + 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. + + + + + 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. @@ -3147,118 +970,80 @@ De noche salen los monstruos, así que procura construir un refugio antes de que Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. - + - 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. + En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. - + - 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. + El carbón se puede usar como combustible y convertirse en una antorcha con un palo. - + - 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 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. - - - - - 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. - - - - - En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. - - - - {*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. - - - - - 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. - - - - - Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Ahora estás en una vagoneta. Para salir de ella, apunta a ella con el cursor y oprime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - - {*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. - - - - - Las vagonetas van sobre rieles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. - {*RailIcon*} - - - - - 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*} - - - - - Ahora navegas en un bote. Para salir de él, apúntalo con el puntero y oprime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - - - {*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. - - - - - 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. @@ -3278,11 +1063,46 @@ Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. 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. + + + + + 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. @@ -3304,249 +1124,304 @@ Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. {*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. + 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. - + - 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. + 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. - + - 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. + Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. - + - 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*} + 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. - + - 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*} + 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 recibir energía, los pistones se extienden y empujan hasta 12 bloques. Cuando se repliegan, los pistones adhesivos pueden tirar de bloques de casi cualquier tipo. - {*ICON*}33{*/ICON*} + En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. - + + {*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. + + + - 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. + 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. - + - ¡En esta área hay un portal del Inframundo! + Las vagonetas van sobre rieles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. + {*RailIcon*} - + - {*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. + 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*} - + - Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + Ahora navegas en un bote. Para salir de él, apúntalo con el puntero y oprime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - + - 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. + 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. - + - 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. + Ahora estás en una vagoneta. Para salir de ella, apunta a ella con el cursor y oprime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - 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. + + {*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. - - - 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. - - - - 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. - - - 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. - - - - 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. - - - 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. - - - 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*} - - - 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*} - - - Completaste el tutorial de los cultivos. - - - - 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. - - - 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. - - - 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*} - - - - 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. - - - - - {*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. - - - 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. - - - 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. - - - 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. - - - 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... - - - 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. - - - 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. - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. + + Leer + + + Colgar + + + Arrojar + + + Abrir + + + Cambiar tono + + + Detonar + + + Plantar + + + Desbloquear juego completo + + + Borrar partida guardada + + + Borrar + + + Labrar + + + Cosechar + + + Continuar + + + Nadar hacia arriba + + + Golpear + + + Ordeñar + + + Recoger + + + Vaciar + + + Silla de montar + + + Colocar + + + Comer + + + Montar + + + Navegar + + + Cultivar + + + Dormir + + + Despertar + + + Reproducir + + + Opciones + + + Mover armadura + + + Mover arma + + + Equipar + + + Mover ingrediente + + + Mover combustible + + + Mover herramienta + + + Sacar + + + Retroceder página + + + Avanzar página + + + Modo Amor + + + Soltar + + + Privilegios + + + Bloquear + + + Creativo + + + Bloquear nivel + + + Seleccionar apariencia + + + Prender fuego + + + Invitar a amigos + + + Aceptar + + + Esquilar + + + Desplazar + + + Reinstalar + + + Op. de guardado + + + Ejecutar comando + + + Instalar versión completa + + + Instalar versión de prueba + + + Instalar + + + Expulsar + + + Actualizar partidas online + + + Partidas en grupo + + + Todas las partidas + + + Salir + + + Cancelar + + + No unirse + + + Cambiar grupo + + + Fabricar + + + Crear + + + Tomar/Colocar + + + Mostrar inventario + + + Mostrar descripción + + + Mostrar ingredientes + + + Atrás + + + Recordatorio: + + + + + + Se añadieron nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. + No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. @@ -3559,29 +1434,9 @@ Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. {*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. - - Recordatorio: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Se añadieron nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. - {*B*}Oprime{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} Oprime{*CONTROLLER_VK_B*} para omitir el tutorial principal. - - - En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los botes y la piedra rojiza. - - - 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. - @@ -3596,102 +1451,20 @@ Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. Usar - - Atrás + + En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los botes y la piedra rojiza. - - Salir + + Fuera de esta zona encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. - - Cancelar - - - No unirse - - - Actualizar partidas online - - - Partidas en grupo - - - Todas las partidas - - - Cambiar grupo - - - Mostrar inventario - - - Mostrar descripción - - - Mostrar ingredientes - - - Fabricar - - - Crear - - - Tomar/Colocar + + + La barra de comida se agotó hasta un nivel a partir del cual ya no te puedes curar. + Tomar - - Tomar todo - - - Tomar la mitad - - - Colocar - - - Colocar todo - - - Colocar uno - - - Soltar - - - Soltar todo - - - Soltar uno - - - Cambiar - - - Movimiento rápido - - - Borrar selección rápida - - - ¿Qué es esto? - - - Compartir en Facebook - - - Cambiar filtro - - - Enviar solicitud de amistad - - - Avanzar página - - - Retroceder página - Siguiente @@ -3701,18 +1474,18 @@ Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. Expulsar jugador + + Enviar solicitud de amistad + + + Avanzar página + + + Retroceder página + Teñir - - Extraer - - - Alimentar - - - Domar - Curar @@ -3722,1068 +1495,874 @@ Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. Sígueme - - Expulsar + + Extraer - - Vaciar + + Alimentar - - Silla de montar + + Domar - - Colocar + + Cambiar filtro - - Golpear + + Colocar todo - - Ordeñar + + Colocar uno - - Recoger - - - Comer - - - Dormir - - - Despertar - - - Reproducir - - - Montar - - - Navegar - - - Cultivar - - - Nadar hacia arriba - - - Abrir - - - Cambiar tono - - - Detonar - - - Leer - - - Colgar - - - Arrojar - - - Plantar - - - Labrar - - - Cosechar - - - Continuar - - - Desbloquear juego completo - - - Borrar partida guardada - - - Borrar - - - Opciones - - - Invitar a amigos - - - Aceptar - - - Esquilar - - - Bloquear nivel - - - Seleccionar apariencia - - - Prender fuego - - - Desplazar - - - Instalar versión completa - - - Instalar versión de prueba - - - Instalar - - - Reinstalar - - - Op. de guardado - - - Ejecutar comando - - - Creativo - - - Mover ingrediente - - - Mover combustible - - - Mover herramienta - - - Mover armadura - - - Mover arma - - - Equipar - - - Sacar - - + Soltar - - Privilegios + + Tomar todo - - Bloquear + + Tomar la mitad - - Retroceder página + + Colocar - - Avanzar página + + Soltar todo - - Modo Amor + + Borrar selección rápida - - Beber + + ¿Qué es esto? - - Rotar + + Compartir en Facebook - - Ocultar + + Soltar uno - - Vaciar todos los espacios + + Cambiar - - Aceptar - - - Cancelar - - - Tienda de Minecraft - - - ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderá todo el progreso no guardado. - - - Salir de la partida - - - Guardar partida - - - Salir sin guardar - - - ¿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 - - - Archivo dañado - - - El archivo guardado está dañado. ¿Quieres borrarlo? - - - ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. - - - Salir y guardar - - - Salir sin guardar - - - ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. - - - ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! - - - Crear nuevo mundo - - - Jugar tutorial - - - Tutorial - - - Dar nombre al mundo - - - Escribe un nombre para tu mundo. - - - Introduce la semilla para la generación del mundo. - - - Cargar mundo guardado - - - Oprime START para unirte. - - - Saliendo de la partida - - - Se produjo un error. Saliendo al menú principal. - - - Error de conexión - - - Conexión perdida - - - Se perdió la conexión con el servidor. Saliendo al menú principal. - - - Desconectado por el servidor - - - Te expulsaron de la partida. - - - Te expulsaron de la partida por volar. - - - El intento de conexión tomó demasiado tiempo. - - - El servidor está lleno. - - - 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. - - - No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. - - - 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! - - - ¡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 - - - Mi puntuación - - - Total - - - Entradas: - - - Rango - - - Preparando para guardar nivel - - - Preparando fragmentos... - - - Finalizando... - - - Construyendo terreno - - - Simulando mundo durante un instante - - - Inicializando servidor - - - Preparando zona de generación - - - 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 - - - Cambiando a juego sin conexión - - - Espera mientras el anfitrión guarda la partida. - - - Entrando en El Fin - - - Saliendo de El Fin - - - Esta cama está ocupada. - - - Solo puedes dormir por la noche. - - - %s está durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben estar en cama a la vez. - - - ¡La cama de tu casa desapareció o está obstruida! - - - Ahora no puedes descansar, hay monstruos cerca. - - - Estás durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben estar en cama a la vez. - - - Herramientas y armas - - - Armas - - - Comida - - - Estructuras - - - Armadura - - - Mecanismos - - - Transporte - - - Decoraciones - - - Bloques de construcción - - - Piedra rojiza y transporte - - - Varios - - - Elaboración de pociones - - - Herramientas, armas y armadura - - - Materiales - - - Sesión cerrada - - - Dificultad - - - Música - - - Sonido - - - Gamma - - - Sensibilidad del juego - - - Sensibilidad de la interfaz - - - Pacífico - - - Fácil - - - Normal - - - Difícil - - - En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. - - - En este modo, el entorno genera enemigos, pero infligirán menos daño al jugador que en el modo normal. - - - En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño estándar. - - - 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! - - - Fin de la versión de prueba - - - Partida llena - - - No pudiste unirte a la partida y ya no quedan más espacios. - - - Introducir texto del cartel - - - Introduce una línea de texto para tu cartel. - - - Introducir título - - - Introduce un título para tu publicación. - - - Introducir descripción - - - Introduce una descripción para tu publicación. - - - Introducir descripción - - - Introduce una descripción para tu publicación. - - - Inventario - - - Ingredientes - - - Soporte para pociones - - - Cofre - - - Encantamiento - - - Horno - - - Ingrediente - - - Combustible - - - Dispensador - - - No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. - - - %s se unió a la partida. - - - %s abandonó la partida. - - - Expulsaron a %s de la partida. - - - ¿Seguro que quieres borrar esta partida guardada? - - - Esperando aprobación - - - Censurado - - - En reproducción: - - - Restablecer ajustes - - - ¿Seguro que quieres restablecer los ajustes a los valores predeterminados? - - - Error al cargar - - - Partida de %s - - - Partida de anfitrión desconocido - - - Un invitado cerró la sesión - - - Un jugador invitado cerró la sesión, lo que provocó que todos los invitados fueran excluidos de la partida. - - - Iniciar sesión - - - No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? - - - Multijugador no admitido - - - Imposible crear la partida - - - Selección automática - - - Sin pack: apariencias regulares - - - Apariencias favoritas - - - 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? - - - ¿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 - - - Autoguardado: NO - - - 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. - - - Opacidad de la interfaz - - - Preparando autoguardado del nivel - - - Tamaño del panel de datos - - - Tamaño panel (pantalla dividida) - - - Semilla - - - Desbloquear skin pack - - - Para usar la apariencia que seleccionaste tienes que desbloquear este skin pack. -¿Quieres desbloquear este skin pack ahora? - - - 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 - - - Estás usando una versión de prueba del pack de textura. No podrás guardar este mundo a menos que desbloquees la versión completa. -¿Te gustaría desbloquear la versión completa de este pack de textura? - - - Pack de textura no disponible - - - Desbloquear versión completa - - - Descargar versión de prueba - - - Descargar versión completa - - - ¡Este mundo usa un pack de textura o de popurrí que no tienes! -¿Quieres instalar el pack de textura o de popurrí ahora? - - - Conseguir versión de prueba - - - Conseguir versión completa - - - Expulsar jugador - - - ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. - - - Packs de imágenes de jugador - - - Temas - - - Skin Packs - - - Permitir amigos de amigos - - - No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. - - - No puedes unirte a la partida - - - Seleccionado - - - Aspecto seleccionado: - - - 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. - - - Se cambió el modo de juego. - - - Cambiar nombre del mundo - - - Escribe un nuevo nombre para tu mundo. - - - Modo de juego: Supervivencia - - - Modo de juego: Creativo - - - Supervivencia - - - Creativo - - - Creado en modo Supervivencia - - - Creado en modo Creativo - - - Generar nubes - - - ¿Qué quieres hacer con esta partida guardada? - - - Renombrar partida guardada - - - Autoguardando en %d... - - - - - - No - - - Normal - - - Superplano - - - Si está habilitado, la partida será online. - - - Si está habilitado, solo los jugadores invitados pueden unirse. - - - Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. - - - Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. - - - Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. - - - Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. - - - Si está habilitado, la dinamita explota cuando se activa. - - - Si está habilitado, el Inframundo se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del Inframundo. - - - 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. + + Movimiento rápido Skin Packs - - Temas + + Panel de vitral rojo - - Imágenes de jugador + + Panel de vitral verde - - Objetos de avatar + + Panel de vitral café - - Packs de textura + + Vitral blanco - - Packs de popurrí + + Panel de vitral - - {*PLAYER*} ardió en llamas. + + Panel de vitral negro - - {*PLAYER*} se quemó hasta morir. + + Panel de vitral azul - - {*PLAYER*} intentó nadar en la lava. + + Panel de vitral gris - - {*PLAYER*} se asfixió en un muro. + + Panel de vitral rosa - - {*PLAYER*} se ahogó. + + Panel de vitral lima - - {*PLAYER*} se murió de hambre. + + Panel de vitral púrpura - - {*PLAYER*} fue picado hasta morir. + + Panel de vitral cian - - {*PLAYER*} se golpeó demasiado fuerte contra el suelo. + + Panel de vitral gris claro - - {*PLAYER*} se cayó del mundo. + + Vitral naranja - - {*PLAYER*} murió. + + Vitral azul - - {*PLAYER*} explotó. + + Vitral púrpura - - {*PLAYER*} murió a causa de la magia. + + Vitral cian - - {*PLAYER*} murió a causa del aliento del dragón Ender. + + Vitral rojo - - {*PLAYER*} fue asesinado por {*SOURCE*}. + + Vitral verde - - {*PLAYER*} fue asesinado por {*SOURCE*}. + + Vitral café - - {*SOURCE*} le disparó a {*PLAYER*}. + + Vitral gris claro - - {*PLAYER*} fue quemado con bolas de fuego por {*SOURCE*}. + + Vitral amarillo - - {*PLAYER*} recibió una paliza de {*SOURCE*}. + + Vitral azul claro - - {*PLAYER*} murió a manos de {*SOURCE*}. + + Vitral magenta - - Niebla de lecho de roca + + Vitral gris - - Mostrar panel de datos + + Vitral rosa - - Mostrar mano + + Vitral lima - - Mensajes de muerte + + Panel de vitral amarillo - - Personaje animado + + Gris claro - - Animación de apariencia personalizada + + Gris - - Ya no puedes extraer ni usar objetos. + + Rosa - - Ahora puedes extraer y usar objetos. + + Azul - - Ya no puedes colocar bloques. + + Púrpura - - Ahora puedes colocar bloques. + + Cian - - Ahora puedes usar puertas e interruptores. + + Lima - - Ya no puedes usar puertas ni interruptores. + + Naranja - - Ahora puedes usar contenedores (p. ej. cofres). + + Blanco - - Ya no puedes usar contenedores (p. ej. cofres). + + Personalizado - - Ya no puedes atacar a enemigos. + + Amarillo - - Ahora puedes atacar a enemigos. + + Azul claro - - Ya no puedes atacar a jugadores. + + Magenta - - Ahora puedes atacar a jugadores. + + Café - - Ya no puedes atacar a animales. + + Panel de vitral blanco - - Ahora puedes atacar a animales. + + Bola pequeña - - Ahora eres moderador. + + Bola grande - - Ya no eres moderador. + + Panel de vitral azul claro - - Ahora puedes volar. + + Panel de vitral magenta - - Ya no puedes volar. + + Panel de vitral naranja - - Ya no te cansarás. + + Forma de estrella - - Ahora te cansarás. + + Negro - - Ahora eres invisible. + + Rojo - - Ya no eres invisible. + + Verde - - Ahora eres invulnerable. + + Forma de creeper - - Ya no eres invulnerable. + + Explosión - - MSP %d + + Forma desconocida - - Dragón Ender + + Vitral negro - - %s entró en El Fin. + + Barda de hierro - - %s abandonó El Fin. + + Barda de oro - + + Barda de diamante + + + Comparador de piedra rojiza + + + Vagoneta con dinamita + + + Vagoneta con tolva + + + Correa + + + Baliza + + + Cofre con trampa + + + Placa de presión con peso (ligera) + + + Marca de nombre + + + Tablones de madera (cualquier tipo) + + + Bloque de comandos + + + Estrella de fuegos artificiales + + + Se puede domar y luego montar a estos animales. Se les puede acoplar un cofre. + + + Mula + + + Nacen de la cría de un caballo y un burro. Se puede domar y luego montar a estos animales, y pueden cargar cofres. + + + Caballo + + + Se puede domar y luego montar a estos animales. + + + Burro + + + Caballo zombi + + + Mapa vacío + + + Estrella del Inframundo + + + Cohete de fuegos artificiales + + + Esqueleto de caballo + + + Wither + + + Se crean con cráneos atrofiados y arena de almas. Disparan cráneos que explotan contra ti. + + + Placa de presión con peso (pesada) + + + Arcilla de color gris claro + + + Arcilla de color gris + + + Arcilla de color rosa + + + Arcilla de color azul + + + Arcilla de color púrpura + + + Arcilla de color cian + + + Arcilla de color lima + + + Arcilla de color naranja + + + Arcilla de color blanco + + + Vitral + + + Arcilla de color amarillo + + + Arcilla de color azul claro + + + Arcilla de color magenta + + + Arcilla de color café + + + Tolva + + + Vía de activación + + + Soltador + + + Comparador de piedra rojiza + + + Sensor de luz del día + + + Bloque de piedra rojiza + + + Arcilla de color + + + Arcilla de color negro + + + Arcilla de color rojo + + + Arcilla de color verde + + + Bloque de paja + + + Arcilla endurecida + + + Bloque de hulla + + + Fundido en + + + 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. + + + Si está habilitado, los jugadores conservarán su inventario al morir. + + + Cuando se inhabilita, no se generarán enemigos de forma natural. + + + Modo de juego: Aventura + + + Aventura + + + Introduce una semilla para generar de nuevo el mismo terreno. Déjalo vacío para crear un mundo aleatorio. + + + Si se inhabilita, los monstruos y los animales no soltarán tesoros para saquear (por ejemplo, los creepers no soltarán pólvora). + + + {*PLAYER*} se cayó de una escalera. + + + {*PLAYER*} se cayó de unas enredaderas. + + + {*PLAYER*} se cayó fuera del agua. + + + Si se habilita, los bloques que sean destruidos no soltarán objetos (por ejemplo, los bloques de piedra no soltarán guijarros). + + + Si se habilita, los jugadores no recuperarán la salud de forma natural. + + + Si se inhabilita, no cambiará el momento del día. + + + Vagoneta + + + Poner correa + + + Soltar + + + Acoplar + + + Desmontar + + + Acoplar cofre + + + Lanzar + + + Nombrar + + + Baliza + + + Poder principal + + + Poder secundario + + + Caballo + + + Soltador + + + Tolva + + + {*PLAYER*} se cayó de un punto elevado + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de murciélagos. + + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de caballos. + + + Opciones de partida + + + {*PLAYER*} recibió una bola de fuego de {*SOURCE*}, con {*ITEM*}. + + + {*PLAYER*} recibió una paliza de {*SOURCE*}, con {*ITEM*}. + + + {*PLAYER*} murió a manos de {*SOURCE*}, con {*ITEM*}. + + + Enemigos irritantes + + + Soltar bloques + + + Regeneración natural + + + Ciclo de luz diurna + + + Mantener inventario + + + Generación de enemigos + + + Tesoros de enemigos + + + {*PLAYER*} recibió un disparo de {*SOURCE*}, con {*ITEM*}. + + + {*PLAYER*} cayó demasiado lejos y {*SOURCE*} le remató. + + + {*PLAYER*} cayó demasiado lejos y {*SOURCE*} le remató con {*ITEM*}. + + + {*PLAYER*} entró en el fuego cuando luchaba contra {*SOURCE*}. + + + {*SOURCE*} provocó la caída de {*PLAYER*}. + + + {*SOURCE*} provocó la caída de {*PLAYER*}. + + + {*SOURCE*} provocó la caída de {*PLAYER*}, con {*ITEM*}. + + + {*PLAYER*} se volvió cenizas mientras luchaba contra {*SOURCE*}. + + + {*PLAYER*} reventó por culpa de {*SOURCE*}. + + + {*PLAYER*} eliminado por un Wither. + + + {*PLAYER*} murió por culpa de {*SOURCE*}, con {*ITEM*}. + + + {*PLAYER*} intentó nadar en la lava para huir de {*SOURCE*}. + + + {*PLAYER*} se ahogó mientras escapaba de {*SOURCE*}. + + + {*PLAYER*} chocó con un cactus cuando huía de {*SOURCE*}. + + + Montar + + -{*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*} - + 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 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. + + + + + 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. + + + + + 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. + + + + + Cuando aparezcan corazones sobre un caballo significará que está domado y ya no tirará al jinete. + + + + + Ahora intenta montar sobre este caballo. Usa {*CONTROLLER_ACTION_USE*} para montar cuando no tengas objetos ni herramientas en las manos. + + + + + Aquí puedes intentar domar a caballos y burros, y en los alrededores hay cofres con sillas de montar, bardas y otros objetos útiles. + + + + + 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. + + + + + 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. + + + + En la cima de esta pirámide hay una baliza inactiva. + + + + Esta es la interfaz de la baliza y puedes usarla para elegir los poderes que concederá. + + + + + {*B*}Oprime {*CONTROLLER_VK_A*} para continuar. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes usar el interfaz de la baliza. + + + + + 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. + + + + + 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. + + + + + Esta es la interfaz del inventario del caballo. + + + + + {*B*}Oprime {*CONTROLLER_VK_A*} para continuar. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del caballo. + + + + + El inventario del caballo te permite transferir o equipar objetos en tu caballo, burro o mula. + + + + Parpadeo + + + Ruta + + + Duración de vuelo: + + + + 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. + + + + Encontraste una mula. + + + + {*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. + + + + + 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. + + + + + En este menú también puedes transferir objetos entre tu inventario y las alforjas acopladas a los burros y las mulas. + + + + Encontraste un caballo. + + + Encontraste un burro. + + + + {*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. + + + + + Las estrellas de fuegos artificiales pueden fabricarse colocando pólvora y tinte en la cuadrícula de fabricación. + + + + + El tinte establecerá el color de la explosión de la estrella de fuegos artificiales. + + + + + 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. + + + + + Si lo deseas, puedes colocar varias estrellas de fuegos artificiales a la cuadrícula de fabricación para añadirlas a los fuegos artificiales. + + + + + 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. + + + + + Finalmente, puedes sacar los fuegos artificiales fabricados en el espacio de producción. + + + + + Puedes añadir un rastro o parpadeo con diamantes o polvo de piedra brillante. + + + + + 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. + + + + + 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. + + + + + Intenta fabricar fuegos artificiales en la mesa de trabajo con los ingredientes de los cofres. + + + + + Una vez fabricada la estrella de fuegos artificiales, puedes establecer el color del fundido al fabricarla con tinte. + + + + + ¡Estos cofres contienen algunos objetos que puedes usar para la creación de FUEGOS ARTIFICIALES! + + + + + {*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. + + + + + 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. + + + + Esta sala contiene tovas. + + + + {*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. + + + + + Las tolvas se utilizan para insertar o quitar objetos de contenedores y para recoger automáticamente los objetos que se arrojen dentro de ellas. + + + + + 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. + + + + + 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. + + + + + Prueba a usar la baliza para elegir el poder que concede. Puedes pagar con los lingotes de hierro que se proporcionan. + + + + + Afectan a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas, así como a otras tolvas. + + + + + En esta sala hay varias configuraciones útiles de tolvas para que veas y experimentes. + + + + + Esta es la interfaz de fuegos artificiales. Aquí podrás crear fuegos artificiales y estrellas de fuegos artificiales. + + + + + {*B*}Oprime {*CONTROLLER_VK_A*} para continuar. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes usar la interfaz de los fuegos artificiales. + + + + + 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. + + + + + Sin embargo, si una tolva dispone de energía de piedra rojiza se volverá inactiva y dejará de absorber e insertar objetos. + + + + + 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. + + + + Estas criaturas se encuentran en pantanos y atacan arrojando pociones. Sueltan pociones al morir. + + + Se alcanzó el límite de cuadros y marcos en un mundo. + + + No puedes generar enemigos en el modo Pacífico. + + + 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. + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de calamares. + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de enemigos. + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de aldeanos. + + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de lobos. + + + Se alcanzó el límite de cabezas de enemigos en un mundo. + + + Invertir vista + + + Zurdo + + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de gallinas. + + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de champivacas. + + + Se alcanzó la cantidad máxima de botes en un mundo. + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de gallinas. @@ -4837,9 +2416,63 @@ Selecciona ACEPTAR para salir de la partida. Restablecer Inframundo + + %s entró en El Fin. + + + %s abandonó El Fin. + + + +{*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*} + + ¿Seguro que quieres restablecer el Inframundo de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el Inframundo. + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de champivacas. + + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de lobos. + Restablecer Inframundo @@ -4847,113 +2480,11 @@ Selecciona ACEPTAR para salir de la partida. No restablecer Inframundo - No se puede esquilar esta champivaca en este momento. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas y gatos. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas y gatos. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de champivacas. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de lobos. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de gallinas. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de calamares. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de enemigos. - - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de aldeanos. - - - Se alcanzó el límite de cuadros y marcos en un mundo. - - - No puedes generar enemigos en el modo Pacífico. - - - Este animal no puede entrar en el modo Amor. Se alcanzó la cantidad máxima de cría de cerdos, ovejas, vacas y gatos. - - - Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de lobos. - - - Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de gallinas. - - - Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de champivacas. - - - Se alcanzó la cantidad máxima de botes en un mundo. - - - Se alcanzó el límite de cabezas de enemigos en un mundo. - - - Invertir vista - - - Zurdo + No se puede esquilar esta champivaca en este momento. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. ¡Has muerto! - - Regenerar - - - Ofertas de contenido descargable - - - Cambiar aspecto - - - Cómo se juega - - - Controles - - - Ajustes - - - Créditos - - - Reinstalar el contenido - - - Ajustes de depuración - - - El fuego se propaga - - - La dinamita explota - - - Jugador contra jugador - - - Confiar en jugadores - - - Privilegios de anfitrión - - - Generar estructuras - - - Mundo superplano - - - Cofre de bonificación - Opciones de mundo @@ -4963,18 +2494,18 @@ Selecciona ACEPTAR para salir de la partida. Puede usar puertas e interruptores + + Generar estructuras + + + Mundo superplano + + + Cofre de bonificación + Puede abrir contenedores - - Puede atacar a jugadores - - - Puede atacar a animales - - - Moderador - Expulsar jugador @@ -4984,185 +2515,308 @@ Selecciona ACEPTAR para salir de la partida. Desactivar agotamiento + + Puede atacar a jugadores + + + Puede atacar a animales + + + Moderador + + + Privilegios de anfitrión + + + Cómo se juega + + + Controles + + + Ajustes + + + Regenerar + + + Ofertas de contenido descargable + + + Cambiar aspecto + + + Créditos + + + La dinamita explota + + + Jugador contra jugador + + + Confiar en jugadores + + + Reinstalar el contenido + + + Ajustes de depuración + + + El fuego se propaga + + + Dragón Ender + + + {*PLAYER*} murió a causa del aliento del dragón Ender. + + + {*PLAYER*} fue asesinado por {*SOURCE*}. + + + {*PLAYER*} fue asesinado por {*SOURCE*}. + + + {*PLAYER*} murió. + + + {*PLAYER*} explotó. + + + {*PLAYER*} murió a causa de la magia. + + + {*SOURCE*} le disparó a {*PLAYER*}. + + + Niebla de lecho de roca + + + Mostrar panel de datos + + + Mostrar mano + + + {*PLAYER*} fue quemado con bolas de fuego por {*SOURCE*}. + + + {*PLAYER*} recibió una paliza de {*SOURCE*}. + + + {*PLAYER*} murió a manos de {*SOURCE*}, con magia. + + + {*PLAYER*} se cayó del mundo. + + + Packs de textura + + + Packs de popurrí + + + {*PLAYER*} ardió en llamas. + + + Temas + + + Imágenes de jugador + + + Objetos de avatar + + + {*PLAYER*} se quemó hasta morir. + + + {*PLAYER*} se murió de hambre. + + + {*PLAYER*} fue picado hasta morir. + + + {*PLAYER*} se golpeó demasiado fuerte contra el suelo. + + + {*PLAYER*} intentó nadar en la lava. + + + {*PLAYER*} se asfixió en un muro. + + + {*PLAYER*} se ahogó. + + + Mensajes de muerte + + + Ya no eres moderador. + + + Ahora puedes volar. + + + Ya no puedes volar. + + + Ya no puedes atacar a animales. + + + Ahora puedes atacar a animales. + + + Ahora eres moderador. + + + Ya no te cansarás. + + + Ahora eres invulnerable. + + + Ya no eres invulnerable. + + + MSP %d + + + Ahora te cansarás. + + + Ahora eres invisible. + + + Ya no eres invisible. + + + Ahora puedes atacar a jugadores. + + + Ahora puedes extraer y usar objetos. + + + Ya no puedes colocar bloques. + + + Ahora puedes colocar bloques. + + + Personaje animado + + + Animación de apariencia personalizada + + + Ya no puedes extraer ni usar objetos. + + + Ahora puedes usar puertas e interruptores. + + + Ya no puedes atacar a enemigos. + + + Ahora puedes atacar a enemigos. + + + Ya no puedes atacar a jugadores. + + + Ya no puedes usar puertas ni interruptores. + + + Ahora puedes usar contenedores (p. ej. cofres). + + + Ya no puedes usar contenedores (p. ej. cofres). + Invisible - - Opciones de anfitrión + + Balizas - - Jugadores/Invitar + + {*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*} + - - Partida online + + Fuegos artificiales - - Solo por invitación + + Idiomas - - Más opciones + + Caballos - - Cargar + + {*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*} + - - Nuevo mundo + + {*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. + - - Nombre del mundo + + {*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. + - - Semilla para el generador de mundos + + 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. - - Dejar vacío para semilla aleatoria + + Lo sueltan los Wither, se usan para crear balizas. - - Jugadores + + Tolvas - - Unirse a partida + + {*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*} + - - Iniciar partida + + Soltadores - - No se encontraron partidas - - - Jugar partida - - - Marcadores - - - Ayuda y opciones - - - Desbloquear juego completo - - - Reanudar partida - - - Guardar partida - - - Dificultad: - - - Tipo de partida: - - - Estructuras: - - - Tipo de nivel: - - - JcJ: - - - Confiar en jugadores: - - - Dinamita: - - - El fuego se propaga: - - - Volver a instalar tema - - - Volver a instalar imagen de jugador 1 - - - Volver a instalar imagen de jugador 2 - - - Volver a instalar objeto de avatar 1 - - - Volver a instalar objeto de avatar 2 - - - Volver a instalar objeto de avatar 3 - - - Opciones - - - Sonido - - - Control - - - Gráficos - - - Interfaz de usuario - - - Valores predeterminados - - - Oscilación de vista - - - Consejos - - - Ayuda sobre el juego - - - Pantalla dividida vert. para 2 j. - - - Listo - - - Editar mensaje de cartel: - - - Rellena la información que irá junto a tu captura. - - - Descripción - - - Captura de pantalla del juego - - - Editar mensaje de cartel: - - - ¡Con la interfaz de usuario, los íconos y la textura clásica de Minecraft! - - - Mostrar todos los mundos de popurrí - - - Sin efectos - - - Velocidad - - - Lentitud - - - Rapidez - - - Cansancio de extracción - - - Fuerza - - - Debilidad + + NO SE USA Salud instantánea @@ -5173,62 +2827,3329 @@ Selecciona ACEPTAR para salir de la partida. Impulso en salto + + Cansancio de extracción + + + Fuerza + + + Debilidad + Náuseas + + NO SE USA + + + NO SE USA + + + NO SE USA + Regeneración Resistencia - - Resistente al fuego + + Buscar semillas para el generador de mundos - - Respiración acuática + + 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. - - Invisibilidad + + Un tipo de vía que puede habilitar o inhabilitar las vagonetas con tolvas y activar las vagonetas con dinamita. - - Ceguera + + Sirve para contener y soltar objetos o para meter objetos en otro contenedor cuando recibe una descarga de piedra rojiza. - - Visión nocturna + + Bloques coloridos que se crean tiñendo arcilla endurecida. - - Hambre + + 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. + + + Se usa como fuente de energía de piedra rojiza. Se puede volver a usar para crear piedra rojiza. + + + Se usa para recoger, meter o sacar objetos de contenedores. + + + Se puede usar para alimentar a caballos, burros o mulas y que recuperen hasta 10 corazones. Acelera el crecimiento de los potros. + + + Murciélago + + + Estas criaturas voladoras se encuentran en cavernas y otros espacios grandes cerrados. + + + Bruja + + + Se crea fundiendo arcilla en un horno. + + + Se crea con cristal y un tinte. + + + Se crea con vitrales. + + + Proporciona una descarga de piedra rojiza. La descarga será más potente cuantos más objetos haya sobre la placa. + + + Es un bloque que crea una señal de piedra rojiza que depende de la luz solar (o de la carencia de luz solar). + + + 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. + + + Un tipo especial de armadura que se puede equipar a los caballos. Proporciona 5 de armadura. + + + Se usan para determinar el color, el efecto y la forma de los fuegos artificiales. + + + Se usa en los circuitos de piedra rojiza para mantener, comparar o reducir potencia de señal, o para medir determinados estados de bloque. + + + Es un tipo de vagoneta que funciona como bloque de dinamita móvil. + + + Un tipo especial de armadura que se puede equipar a los caballos. Proporciona 7 de armadura. + + + Se usa para ejecutar comandos. + + + Proyecta un rayo de luz al cielo y puede proporcionar efectos de estado a los jugadores cercanos. + + + 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. + + + Un tipo especial de armadura que se puede equipar a los caballos. Proporciona 11 de armadura. + + + Se usa para atar a enemigos al jugador o a postes de vallas. + + + Se usa para poner nombres a los enemigos en el mundo. + + + Rapidez + + + Desbloquear juego completo + + + Reanudar partida + + + Guardar partida + + + Jugar partida + + + Marcadores + + + Ayuda y opciones + + + Dificultad: + + + JcJ: + + + Confiar en jugadores: + + + Dinamita: + + + Tipo de partida: + + + Estructuras: + + + Tipo de nivel: + + + No se encontraron partidas + + + Solo por invitación + + + Más opciones + + + Cargar + + + Opciones de anfitrión + + + Jugadores/Invitar + + + Partida online + + + Nuevo mundo + + + Jugadores + + + Unirse a partida + + + Iniciar partida + + + Nombre del mundo + + + Semilla para el generador de mundos + + + Dejar vacío para semilla aleatoria + + + El fuego se propaga: + + + Editar mensaje de cartel: + + + Rellena la información que irá junto a tu captura. + + + Descripción + + + Ayuda sobre el juego + + + Pantalla dividida vert. para 2 j. + + + Listo + + + Captura de pantalla del juego + + + Sin efectos + + + Velocidad + + + Lentitud + + + Editar mensaje de cartel: + + + ¡Con la interfaz de usuario, los íconos y la textura clásica de Minecraft! + + + Mostrar todos los mundos de popurrí + + + Consejos + + + Volver a instalar objeto de avatar 1 + + + Volver a instalar objeto de avatar 2 + + + Volver a instalar objeto de avatar 3 + + + Volver a instalar tema + + + Volver a instalar imagen de jugador 1 + + + Volver a instalar imagen de jugador 2 + + + Opciones + + + 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 hombres-cerdo zombis cuando mueren. Estos se encuentran en el Inframundo. Se usa como ingrediente para elaborar pociones. + + + Se usan para preparar pociones. Crecen de forma natural en las fortalezas del Inframundo. También se pueden plantar en arena de almas. + + + 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. + + + 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 Inframundo o en sus alrededores. + + + 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 de Ender 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 a una araña o a 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 recolectar con tijeras. 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 (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. + + + Se crea con bloques de piedra y se encuentra normalmente en fortalezas. + + + Se usa como barrera, igual que las vallas. + + + Se pueden plantar para cultivar calabazas. + + + Se puede emplear en la construcción y en la decoración. + + + Frena el movimiento cuando pasas sobre ella. Se puede destruir con unas tijeras 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 pueden plantar para cultivar melones. + + + 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. + + + Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + + + Se puede llenar de lluvia o de agua con un cubo y usar para llenar de agua los frascos de cristal. + + + Se usa 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 piedra del Inframundo en un horno. Se puede convertir en bloques de ladrillo del Inframundo. + + + 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 usa 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 usarse 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 indiscriminadamente disparándola desde un dispensador. + + + Flota en el agua y se puede caminar sobre él. + + + Se usa para construir fortalezas del Inframundo. Es inmune a las bolas de fuego del espectro. + + + Se usa en las fortalezas del Inframundo. + + + 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. + + + 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 Inframundo y suelta verrugas del Inframundo 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 de Ender y permite al jugador viajar a la dimensión El Fin. + + + Se usa para crear un portal a El Fin. + + + 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 tazón 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, aumenta la duración del efecto. + + + Se obtiene al matar a una vaca y se puede convertir en armadura o usar para fabricar libros. + + + Se obtiene al matar a un limo y se usa como ingrediente para elaborar pociones o se crea para hacer pistones adhesivos. + + + Las gallinas lo ponen al azar y se puede convertir en alimentos. + + + Se obtiene al excavar grava y se puede usar para crear un encendedor de pedernal. + + + Si se usa con un cerdo te permite montarlo. Podrás dirigir al cerdo usando un palo con zanahoria. + + + 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 elaborarse con 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 subterráneos, se puede emplear en la construcción y en la decoración. + + + Se usan para obtener lana de las ovejas y cosechar bloques de hojas. + + + Se obtiene al matar a 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 usar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal de la tarta de calabaza. + + + Si se le prende fuego, arderá para siempre. + + + Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + + + Terreno preparado para plantar semillas. + + + Se pueden cocinar en un horno para crear tinte verde. + + + Frena el movimiento de cualquier cosa que camina sobre ella. + + + Se consigue al matar a una gallina y se puede convertir en una flecha. + + + Se consigue al matar a un creeper y se puede convertir en dinamita o usar como ingrediente para elaborar pociones. + + + Se pueden 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 Inframundo y viceversa. + + + Se usa como combustible en un horno o se puede convertir en una antorcha. + + + 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. + + + Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. + + + Desarrollo mercantil + + + Director de inversiones + + + Coordinador de producto + + + Equipo de desarrollo + + + Coordinador de lanzamiento + + + Director de XBLA Publishing + + + Marketing + + + Equipo de localización de Asia + + + Equipo de investigación de usuario + + + Equipos principales de MGS + + + Coordinador de comunidad + + + Equipo de localización de Europa + + + Equipo de localización de Redmond + + + Equipo de diseño + + + Director de diversión + + + Música y efectos + + + Programación + + + Arquitecto en jefe + + + Desarrollador artístico + + + Creador de juego + + + Arte + + + Productor + + + Jefe de pruebas de control de calidad + + + Jefe de pruebas + + + Control de calidad + + + Productor ejecutivo + + + Jefe de producción + + + Certificador de calidad de logros + + + 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 + + + STE de proyecto + + + STE adicionales + + + Agradecimientos especiales + + + Coordinador de pruebas de control de calidad + + + Jefe sénior de pruebas de control de calidad + + + Socios de control de calidad + + + Espada de madera + + + Espada de piedra + + + Espada de hierro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Desarrollador + + + Te dispara bolas de fuego que explotan al entrar en contacto. + + + Limo + + + Escupe limos más pequeños cuando recibe daños. + + + Hombre-cerdo zombi + + + En principio es manso, pero si atacas a uno, atacará en grupo. + + + Espectro + + + Enderman + + + Araña de las cuevas + + + Tiene una picadura venenosa. + + + Champivaca + + + Te ataca si lo miras. También puede mover bloques de lugar. + + + 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 tazón. Suelta champiñones y se convierte en una vaca normal cuando se esquila. + + + Diseño original y programación + + + Coordinador de proyecto/Productor + + + Resto del despacho Mojang + + + Artista conceptual + + + Cálculos y estadísticas + + + Coordinador de bullies + + + Jefe de programación de Minecraft PC + + + Atención al cliente + + + DJ de la oficina + + + Diseñador/Programador de Minecraft - Pocket Edition + + + Programador ninja + + + Director ejecutivo + + + Empleado de cuello blanco + + + Animador de explosivos + + + Un dragón negro y grande que se encuentra en El Fin. + + + Llama + + + Son enemigos que se encuentran en el Inframundo, principalmente dentro de sus fortalezas. Sueltan varas de llama cuando mueren. + + + Golem de nieve + + + Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. + + + Dragón Ender + + + 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á. + + + Golem de hierro + + + Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. + + + Se encuentran en el Inframundo. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. + + + Aldeano + + + Ocelote + + + Permite la creación de encantamientos más poderosos cuando se coloca en una mesa de encantamiento. + + + {*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. + + + + {*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. + + + + {*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. + + + + {*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. Oprime{*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 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. + + + + {*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*} + + + + {*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 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. + + + + 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 cercada de menos de 20x20 bloques y mete dentro a tus animales. Así te asegurarás de que estén ahí 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, 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. + + + + {*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 le 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 es genial! + + + {*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. + + + {*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. + + + {*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. + + + ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE. UU.! + + + .party() fue excelente. + + + Supón siempre que los rumores son falsos, ¡no te los creas! + + + Página anterior + + + Comercio + + + Yunque + + + El Fin + + + Bloquear niveles + + + Modo Creativo + + + Opciones de anfitrión y de jugador + + + {*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. + + + + {*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*} + + + + Causas más daño que con la mano. + + + Se usa para excavar tierra, hierba, arena, gravilla y nieve más rápido que a mano. La pala es necesaria para excavar bolas de nieve. + + + Correr + + + Novedades + + + {*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*} + + + + Compartir capturas de pantalla + + + Cofres + + + Creación + + + Horno + + + Fundamentos + + + Panel de datos + + + Inventario + + + Dispensador + + + Encantamientos + + + Portal del Inframundo + + + Multijugador + + + Cuidar animales + + + Reproducción de animales + + + Elaboración de pociones + + + ¡A deadmau5 le gusta Minecraft! + + + Los hombres-cerdo no te atacarán a no ser que tú los ataques a ellos. + + + Al dormir en una cama, puedes cambiar el punto de reaparición del personaje y avanzar el juego hasta el amanecer. + + + ¡Golpea esas bolas de fuego de vuelta al espectro! + + + Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. + + + ¡Con una vagoneta y rieles llegarás a tu destino más rápido! + + + Planta brotes y se convertirán en árboles. + + + Si construyes un portal podrás viajar a otra dimensión: el Inframundo. + + + Excavar en línea recta hacia abajo o hacia arriba no es buena idea. + + + El polvo de hueso (se fabrica con hueso de esqueleto) se puede usar como fertilizante, y hace que las cosas crezcan al instante. + + + ¡Los creepers explotan cuando se acercan a ti! + + + ¡Oprime{*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! + + + ¡Usa la herramienta correcta para el trabajo! + + + Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. + + + Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. + + + 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 domarlo. Podrás hacer que se siente o que te siga. + + + Para soltar objetos desde el menú Inventario, mueve el cursor fuera del menú y oprime{*CONTROLLER_VK_A*}. + + + ¡Nuevo contenido descargable disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. + + + 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. + + + Ajusta la configuración de gamma para que la visualización del juego sea más clara o más oscura. + + + 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. + + + Usa un azadón para preparar el terreno para la cosecha. + + + Las arañas no atacan durante el día, a no ser que tú las ataques a ellas. + + + ¡Es más fácil excavar arena o tierra con una pala que a mano! + + + Extrae chuletas de los cerdos y cocínalas para comerlas y recuperar tu salud. + + + Extrae cuero de las vacas y úsalo para fabricar armaduras. + + + Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! + + + La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. + + + ¡Ahora hay vallas apilables en el juego! + + + Algunos animales te seguirán si llevas trigo en la mano. + + + Si un animal no puede desplazarse más de 20 bloques en cualquier dirección, no se degenerará. + + + 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. + + + Lee la sección de Novedades en los menús Cómo se juega para ver la información más actualizada del juego. + + + ¡Música de C418! + + + ¿Quién es Notch? + + + ¡Mojang tiene más premios que empleados! + + + ¡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! + + + ¡Pronto habrá una actualización de este juego! + + + Si colocas dos cofres juntos crearás un cofre grande. + + + Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. + + + Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. + + + El instrumento que toca un bloque de nota depende del material que tenga debajo. + + + Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. + + + Los guijarros son resistentes a las bolas de fuego del espectro, lo que los hace útiles para defender portales. + + + Los bloques que se pueden usar como fuente de luz derriten la nieve y el hielo. Entre ellos se incluyen las antorchas, las piedras brillantes y las calabazas iluminadas. + + + Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. + + + Las gallinas ponen huevos cada 5 a 10 minutos. + + + La obsidiana solo se puede extraer con un pico de diamante. + + + Los creepers son la fuente de pólvora más fácil de obtener. + + + 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. + + + Los lobos no pueden entrar en el Inframundo. + + + Los lobos no atacan a los creepers. + + + Necesario para extraer bloques de piedra y mineral. + + + Se usa en la receta de pasteles y como ingrediente para elaborar pociones. + + + Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a oprimir. + + + 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. + + + Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + + + Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se fabrica con una manzana y pepitas de oro. + + + Restablece 2{*ICON_SHANK_01*}. Si la comes, puedes envenenarte. + + + Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + + + Se usa para llevar vagonetas. + + + Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + + + Funciona como una placa de presión: envía una señal de piedra rojiza, pero solo cuando es activada por una vagoneta. + + + Se usa para enviar una descarga eléctrica cuando se oprime. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. + + + Se usa para contener y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. + + + Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de distintos bloques para cambiar el tipo de instrumento. + + + Restablece 2.5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. + + + Restablece 1{*ICON_SHANK_01*}. + + + Restablece 1{*ICON_SHANK_01*}. + + + Recupera 3 de{*ICON_SHANK_01*}. + + + Se usa como munición para arcos. + + + Restablece 2.5{*ICON_SHANK_01*}. + + + Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. + + + Restablece 2{*ICON_SHANK_01*} y se puede cocinar en un horno. Si lo comes crudo, puedes envenenarte. + + + Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando chuleta de cerdo cruda en un horno. + + + Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. + + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. + + + Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. + + + Se usa para transportarte sobre los rieles a ti, a un animal o a un monstruo. + + + Se usa como tinte para crear lana azul claro. + + + Se usa como tinte para crear lana cian. + + + Se usa como tinte para crear lana púrpura. + + + Se usa como tinte para crear lana limón. + + + Se usa como tinte para crear lana gris. + + + 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). + + + Se usa como tinte para crear lana magenta. + + + Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. + + + Se usa para crear libros y mapas. + + + Se usa para crear estanterías o encantamiento para hacer libros encantados. + + + Se usa como tinte para crear lana azul. + + + Reproduce discos. + + + Úsalos para crear herramientas, armas o armaduras sólidas. + + + Se usa como tinte para crear lana naranja. + + + Se obtiene de las ovejas y se puede colorear con tinte. + + + Se usa como material de construcción y se puede colorear con tinte. Esta receta no es muy recomendable porque la lana se puede obtener con facilidad de las ovejas. + + + Se usa como tinte para crear lana negra. + + + Se usa para transportar mercancías sobre los rieles. + + + Se mueve sobre los rieles y empujará a otras vagonetas si se le añade hulla. + + + Te permite desplazarte por el agua más rápido que nadando. + + + Se usa como tinte para crear lana verde. + + + Se usa como tinte para crear lana roja. + + + Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. + + + Se usa como tinte para crear lana rosa. + + + Se usan como tinte para crear lana marrón, como ingrediente de las galletas y para cultivar vainas de cacao. + + + Se usa como tinte para crear lana plateada. + + + Se usa como tinte para crear lana amarilla. + + + Permite ataques a distancia con flechas. + + + Cuando la lleva puesta, el usuario recibe 5 de armadura. + + + Cuando las lleva puestas, el usuario recibe 3 de armadura. + + + Cuando las lleva puestas, el usuario recibe 1 de armadura. + + + Cuando las lleva puestas, el usuario recibe 5 de armadura. + + + Cuando las lleva puestas, el usuario recibe 2 de armadura. + + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + + Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + + Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. + + + Permite convertir lingotes, gemas o tintes en bloques utilizables. Se puede usar como bloque de construcción de precio elevado o como almacenamiento compacto del mineral. + + + Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo la pisan. Las placas de presión de madera también se activan soltando algo sobre ellas. + + + Cuando la lleva puesta, el usuario recibe 8 de armadura. + + + Cuando las lleva puestas, el usuario recibe 6 de armadura. + + + Cuando las lleva puestas, el usuario recibe 3 de armadura. + + + Cuando las lleva puestas, el usuario recibe 6 de armadura. + + + Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. + + + Cuando las lleva puestas, el usuario recibe 1 de armadura. + + + Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + + Se usa para cortar bloques de madera más rápido que a mano. + + + Se usa para labrar tierra y hierba y prepararla para el cultivo. + + + Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. + + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + + Cuando los lleva puestos, el usuario recibe 4 de armadura. + + + Cuando las lleva puestas, el usuario recibe 1 de armadura. + + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + + Cuando las lleva puestas, el usuario recibe 1 de armadura. + + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + + Cuando la lleva puesta, el usuario recibe 5 de armadura. + + + Se usan en escaleras compactas. + + + Se usa para contener estofado de champiñón. Te quedas el tazón después de comer el estofado. + + + Se usa para contener y transportar agua, lava o leche. + + + Se usa para contener y transportar agua. + + + Muestra el texto introducido por ti o por otros jugadores. + + + Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. + + + Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el encendedor de pedernal o con una descarga eléctrica. + + + Se usa para contener y transportar lava. + + + Muestra la posición del sol y de la luna. + + + Indica tu punto de inicio. + + + Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. + + + Se usa para contener y transportar leche. + + + Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. + + + Se usa para pescar peces. + + + 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. + + + Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. + + + Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. + + + Se usa como material de construcción. + + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + + Se usa para crear luz, pero también derrite la nieve y el hielo. + + + Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. + + + Almacena bloques y objetos en su interior. Coloca dos cofres, uno junto a otro, para crear un cofre más grande con el doble de capacidad. + + + Se usa como barrera sobre la que no se puede saltar. Cuenta como 1.5 bloques de alto para jugadores, animales y monstruos, pero solo como 1 bloque de alto para otros bloques. + + + Se usa para ascender en vertical. + + + 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. + + + Te permite crear una selección más variada de objetos que la creación normal. + + + Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. + + + Hacha de hierro + + + Lámpara de piedra rojiza + + + Esc. madera de jungla + + + Escaleras de abedul + + + Controles actuales + + + Calavera + + + Cacao + + + Escaleras de abeto + + + Huevo de dragón + + + Piedra de El Fin + + + Marco de portal a El Fin + + + Esc. de losas de arenisca + + + Helecho + + + Arbusto + + + Configuración + + + Crear + + + Usar + + + Acción + + + Sigilo/Volar hacia abajo + + + Sigilo + + + Soltar + + + Cambiar objeto + + + Pausar + + + Mirar + + + Mover/Correr + + + Inventario + + + Saltar/Volar hacia arriba + + + Saltar + + + Portal a El Fin + + + Tallo de calabaza + + + Melón + + + Panel de cristal + + + Puerta de valla + + + Enredaderas + + + Tallo de melón + + + Barras de hierro + + + Ladrillo de piedra agrietada + + + Ladrillo de piedra musgosa + + + Ladrillo de piedra + + + Champiñón + + + Champiñón + + + Ladrillo de piedra cincelada + + + Escaleras de ladrillo + + + Verruga del Inframundo + + + Escaleras del Inframundo + + + Valla del Inframundo + + + Caldero + + + Soporte para pociones + + + Mesa de encantamientos + + + Ladrillo del Inframundo + + + Guijarro de piedra de pez plateado + + + Piedra de pez plateado + + + Esc. de ladrillos de piedra + + + Nenúfar + + + Micelio + + + Ladrillo de piedra de pez plateado + + + Cambiar modo cámara + + + 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á. + + + 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. + + + A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} + Oprime{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. + + + La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} + + + 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*} + + + 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. + + + Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. + + + 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. + + + Usa{*CONTROLLER_ACTION_MOVE*} para moverte. + + + Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. + + + 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. + + + 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... + + + Oprime{*CONTROLLER_ACTION_JUMP*} para saltar. + + + Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} + + + + 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. + + + + Abre el contenedor. + + + 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*} + + + 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*} + + + + 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. + + + + + Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. + + + + 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*} + + + 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. + + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. + + + 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*} + + + 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*} + + + Apunta hacia la mesa de trabajo y oprime{*CONTROLLER_ACTION_USE*} para abrirla. + + + Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Opción 1 + + + Movimiento (al volar) + + + Jugadores/Invitar + + + + + + Opción 3 + + + Opción 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Oprime{*CONTROLLER_VK_A*} para continuar. + + + + + + + + + + + + + + + + + + + + + + + + + + + Bloque de pez plateado + + + Losa simple + + + Una forma compacta de almacenar hierro. + + + Bloque de hierro + + + Losa de roble + + + Losa de arenisca + + + Losa de piedra + + + Una forma compacta de almacenar oro. + + + Flor + + + Lana blanca + + + Lana naranja + + + Bloque de oro + + + Champiñón + + + Rosa + + + Losa de guijarros + + + Estantería + + + Dinamita + + + Ladrillo + + + Antorcha + + + Obsidiana + + + Piedra musgosa + + + Losa del Inframundo + + + + Losa de roble + + + Losa (ladrillos de piedra) + + + Losa de ladrillos + + + Losa de la jungla + + + Losa de abedul + + + Losa de abeto + + + Lana magenta + + + Hojas de abedul + + + Hojas de abeto + + + Hojas de roble + + + Cristal + + + Esponja + + + Hojas de la jungla + + + Hojas + + + Roble + + + Abeto + + + Abedul + + + Madera de abeto + + + Madera de abedul + + + Madera de la jungla + + + Lana + + + Lana rosa + + + Lana gris + + + Lana gris claro + + + Lana azul claro + + + Lana amarilla + + + Lana limón + + + Lana cian + + + Lana verde + + + Lana roja + + + Lana negra + + + Lana púrpura + + + Lana azul + + + Lana marrón + + + Antorcha (hulla) + + + Piedra brillante + + + Arena de almas + + + Bloque del Inframundo + + + Bloque de lapislázuli + + + Mineral de lapislázuli + + + Portal + + + Calabaza iluminada + + + Caña de azúcar + + + Arcilla + + + Cactus + + + Calabaza + + + Valla + + + Tocadiscos + + + Una forma compacta de almacenar lapislázuli. + + + Trampilla + + + Cofre cerrado + + + Diodo + + + Pistón adhesivo + + + Pistón + + + Lana (cualquier color) + + + Arbusto muerto + + + Pastel + + + Bloque de nota + + + Dispensador + + + Hierba alta + + + Telaraña + + + Cama + + + Hielo + + + Mesa de trabajo + + + Una forma compacta de almacenar diamantes. + + + Bloque de diamante + + + Horno + + + Granja + + + Cultivos + + + Mineral de diamante + + + Generador de monstruos + + + Fuego + + + Antorcha (carbón) + + + Polvo de piedra rojiza + + + Cofre + + + Escaleras de roble + + + Cartel + + + Mineral de piedra rojiza + + + Puerta de hierro + + + Placa de presión + + + Nieve + + + Botón + + + Antorcha piedra roja + + + Palanca + + + Rieles + + + Escalera + + + Puerta de madera + + + Escaleras de piedra + + + Rieles detectores + + + Rieles propulsores + + + Ya recogiste suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. + + + Caña de pescar + + + Reloj + + + Polvo de piedra brillante + + + Vagoneta con horno + + + Huevo + + + Brújula + + + Pescado crudo + + + Rojo rosa + + + Verde cactus + + + Granos de cacao + + + Pescado cocido + + + Polvo de tinte + + + Bolsa de tinta + + + Vagoneta con cofre + + + Bola de nieve + + + Bote + + + Cuero + + + Vagoneta + + + Silla de montar + + + Piedra rojiza + + + Cubo de leche + + + Papel + + + Libro + + + Bola de limo + + + Ladrillo + + + Arcilla + + + Cañas de azúcar + + + Lapislázuli + + + Mapa + + + Disco: "13" + + + Disco: "Gato" + + + Cama + + + Repetidor de piedra rojiza + + + Galleta + + + Disco: "Bloques" + + + Disco: "Mellohi" + + + Disco: "Stal" + + + Disco: "Strad" + + + Disco: "Gorjeo" + + + Disco: "Lejos" + + + Disco: "Galería" + + + Pastel + + + Tinte gris + + + Tinte rosa + + + Tinte limón + + + Tinte púrpura + + + Tinte cian + + + Tinte gris claro + + + Amarillo diente de león + + + Polvo de hueso + + + Hueso + + + Azúcar + + + Tinte azul claro + + + Tinte magenta + + + Tinte naranja + + + Cartel + + + Túnica de cuero + + + Pechera de hierro + + + Pechera de diamante + + + Casco de hierro + + + Casco de diamante + + + Casco de oro + + + Pechera de oro + + + Mallas de oro + + + Botas de cuero + + + Botas de hierro + + + Pantalones de cuero + + + Mallas de hierro + + + Mallas de diamante + + + Gorro de cuero + + + Azadón de piedra + + + Azadón de hierro + + + Azadón de diamante + + + Hacha de diamante + + + Hacha de oro + + + Azadón de madera + + + Azadón de oro + + + Pechera de malla + + + Mallas de malla + + + Botas de malla + + + Puerta de madera + + + Puerta de hierro + + + Casco de malla + + + Botas de diamante + + + Pluma + + + Pólvora + + + Semillas de trigo + + + Tazón + + + Estofado de champiñón + + + Cuerda + + + Trigo + + + Chuleta de cerdo cocinada + + + Cuadro + + + Manzana de oro + + + Pan + + + Pedernal + + + Chuleta de cerdo cruda + + + Palo + + + Cubo + + + Cubo de agua + + + Cubo de lava + + + Botas de oro + + + Lingote de hierro + + + Lingote de oro + + + Encend. de pedernal + + + Hulla + + + Carbón + + + Diamante + + + Manzana + + + Arco + + + Flecha + + + Disco: "Pabellón" + + + + 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*} + + + + + 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*} + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + La leña que recojas se puede convertir en tablones. Selecciona el ícono de tablones y oprime{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} + + + + 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. + + + + + 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. + + + + + 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. + + + + + Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. + + + + + Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. + + + + + 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. + + + + + Hay objetos que no se pueden crear con la mesa de trabajo y requieren un horno. Crea un horno ahora.{*FurnaceIcon*} + + + + Grava + + + Mineral de oro + + + Mineral de hierro + + + Lava + + + Arena + + + Arenisca + + + Mineral de hulla + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. + + + + + Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. + + + + + 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. + + + + Madera + + + Madera de roble + + + + 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. + + + + {*B*} + Oprime{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. + + + + + 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. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} + Oprime{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar solo. + + + + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + + + + + 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. + + + + + 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. + + + + + Completaste la primera parte del tutorial. + + + + 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? + + + 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? + + + Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + + + 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*} + + + Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el 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*} + + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + + + + + Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + + + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + {*B*} + Oprime{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + + + + {*B*} + Oprime{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + + + + 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. + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. + + + + + Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + + + + Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario. + + + + + 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*}. + + + + + 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. + + + + + 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. + + + + Agua + + + Frasco de cristal + + + Botella de agua + + + Ojo de araña + + + Pepita de oro + + + Verruga del Inframundo + + + Poción{*splash*}{*prefix*}{*postfix*} + + + Ojo araña fermentado + + + Caldero + + + Ojo de Ender + + + Melón resplandeciente + + + Polvo de llama + + + Crema de magma + + + Soporte para pociones + + + Lágrima de espectro + + + Semillas de calabaza + + + Semillas de melón + + + Pollo crudo + + + Disco: "11" + + + Disco: "Dónde estamos" + + + Tijeras + + + Pollo cocido + + + Perla de Ender + + + Rodaja de melón + + + Vara de llama + + + Res cruda + + + Filete + + + Carne podrida + + + Botella de encantamiento + + + Tablones de roble + + + Tablones de abeto + + + Tablones de abedul + + + Bloque de hierba + + + Tierra + + + Guijarro + + + Tablones de la jungla + + + Brote de abedul + + + Brote de árbol de la jungla + + + Lecho de roca + + + Brote + + + Brote de roble + + + Brote de abeto + + + Piedra + + + Marco + + + Generar {*CREATURE*} + + + Ladrillo del Inframundo + + + Descarga de fuego + + + Desc. fuego (carbón) + + + Desc. fuego (hulla) + + + Calavera + + + Cabeza + + + Cabeza de %s + + + Cabeza de creeper + + + Calavera de esqueleto + + + Calavera de esqueleto atrofiado + + + Cabeza de zombi + + + 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 torpeza + + + de rapidez + + + de debilidad + + + de fortaleza + + + Resistente al fuego + + + Saturación + de resistencia - - de resistencia al fuego + + de salto - - de respiración en agua + + Poción - - de invisibilidad + + Refuerzo de salud - - de ceguera - - - de visión nocturna - - - de hambre - - - de veneno + + Absorción @@ -5269,9 +6199,78 @@ Selecciona ACEPTAR para salir de la partida. III + + de invisibilidad + IV + + de respiración en agua + + + de resistencia al fuego + + + de visión nocturna + + + de veneno + + + de hambre + + + de absorción + + + de saturación + + + de refuerzo de salud + + + de ceguera + + + de debilidad + + + natural + + + fina + + + difusa + + + nítida + + + lechosa + + + rara + + + untada + + + lisa + + + torpe + + + plana + + + voluminosa + + + insulsa + de salpicadura @@ -5281,50 +6280,14 @@ Selecciona ACEPTAR para salir de la partida. aburrida - - insulsa + + enérgica - - nítida + + cordial - - lechosa - - - difusa - - - natural - - - fina - - - rara - - - plana - - - voluminosa - - - torpe - - - untada - - - lisa - - - suave - - - cortés - - - gruesa + + encantadora elegante @@ -5332,149 +6295,152 @@ Selecciona ACEPTAR para salir de la partida. sofisticada - - encantadora - - - enérgica - - - refinada - - - cordial - resplandeciente - - potente - - - repugnante - - - inodora - rancia áspera + + inodora + + + potente + + + repugnante + + + suave + + + refinada + + + gruesa + + + cortés + + + Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + + Reduce al instante la salud de los jugadores, animales y monstruos afectados. + + + 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. + 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. + + + Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. + asquerosa hedionda - - Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. - - - 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. - - - 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 el daño causado por los jugadores y monstruos afectados cuando atacan. - - - 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. - - - Reduce al instante la salud de los jugadores, animales y monstruos afectados. - - - Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - - Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. - - - Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + Aporrear Agudeza - - Aporrear + + Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - Maldición de los Artrópodos + + Daño del ataque Derribar - - Apariencia ígnea + + Maldición de los Artrópodos - - Protección + + Velocidad - - Protección contra el fuego + + Refuerzos zombi - - Caída de pluma + + Potencia de salto de caballo - - Protección contra explosiones + + Al aplicarse: - - Protección contra proyectiles + + Resistencia al derribo - - Respiración + + Alcance de seguimiento de enemigos - - Afinidad acuática - - - Eficacia + + Salud máxima Toque sedoso - - Irrompible + + Eficacia - - Saqueo + + Afinidad acuática Fortuna - - Poder + + Saqueo - - Flama + + Irrompible - - Puñetazo + + Protección contra el fuego - - Infinidad + + Protección - - I + + Apariencia ígnea - - II + + Caída de pluma - - III + + Respiración + + + Protección contra proyectiles + + + Protección contra explosiones IV @@ -5485,23 +6451,29 @@ Selecciona ACEPTAR para salir de la partida. VI + + Puñetazo + VII - - VIII + + III - - IX + + Flama - - X + + Poder - - Se puede extraer con un pico de hierro o un objeto mejor para obtener esmeraldas. + + Infinidad - - 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. + + II + + + I Se activa cuando una entidad pasa a través de un cable trampa conectado. @@ -5512,44 +6484,59 @@ Selecciona ACEPTAR para salir de la partida. Una forma compacta de almacenar esmeraldas. - - Un muro hecho de guijarros. + + 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 puede utilizar para reparar armas, herramientas y armaduras. + + IX - - Se funde en un horno para fabricar cuarzo del Inframundo. + + VIII - - Se usa como un elemento decorativo. + + Se puede extraer con un pico de hierro o un objeto mejor para obtener esmeraldas. - - Se puede comercializar con los aldeanos. - - - Se usa como un elemento decorativo. En ella se pueden plantar flores, brotes, cactus y champiñones. + + X Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria de oro. Se puede plantar en una granja. + + Se usa como un elemento decorativo. En ella se pueden plantar flores, brotes, cactus y champiñones. + + + Un muro hecho de guijarros. + Restablece 0.5{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede plantar en una granja. - - Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una papa en un horno. + + Se funde en un horno para fabricar cuarzo del Inframundo. + + + Se puede utilizar para reparar armas, herramientas y armaduras. + + + Se puede comercializar con los aldeanos. + + + Se usa como un elemento decorativo. + + + Recupera 4 de{*ICON_SHANK_01*}. - 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. + Restablece 1{*ICON_SHANK_01*}. Si la comes, puedes envenenarte. Se usa para controlar a un cerdo ensillado cuando se cabalga sobre él. - - Recupera 4 de{*ICON_SHANK_01*}. + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una papa en un horno. + + + Restablece 3{*ICON_SHANK_01*}. Se fabrica con una zanahoria y pepitas de oro. Se usa con un yunque para encantar armas, herramientas o armaduras. @@ -5557,6 +6544,15 @@ Selecciona ACEPTAR para salir de la partida. 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 + + Tarta de calabaza - - Papa - - - 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,72 +6691,77 @@ 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. + + + + Teñir collar + + + + Para empezar a trabajar en un objeto, colócalo en el primer espacio de introducción. @@ -5779,9 +6771,9 @@ Selecciona ACEPTAR para salir de la partida. Oprime{*CONTROLLER_VK_B*} si ya sabes utilizar la interfaz del yunque. - + - Para empezar a trabajar en un objeto, colócalo en el primer espacio de introducción. + También puedes colocar un segundo objeto idéntico en el segundo espacio para combinarlos. @@ -5789,24 +6781,14 @@ Selecciona ACEPTAR para salir de la partida. 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. - + - También puedes colocar un segundo objeto idéntico en el segundo espacio para combinarlos. + 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. Para encantar objetos en el yunque, coloca un libro encantado en el segundo espacio de introducción. - - - - - 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. @@ -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,14 +6870,24 @@ 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. En esta zona hay un aldeano y un cofre que contiene papel para comprar objetos. + + + + + Oprime{*CONTROLLER_VK_A*} para cambiar los objetos que exige el aldeano por el objeto que ofrece. + + + + + Los jugadores pueden cambiar objetos de su inventario con los aldeanos. @@ -5905,19 +6897,14 @@ Selecciona ACEPTAR para salir de la partida. Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona el comercio. - + - Los jugadores pueden cambiar objetos de su inventario con los aldeanos. + 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. - - - - - Si realizas una serie de cambios, se añadirán cambios al azar o se actualizarán los cambios disponibles de un aldeano. @@ -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,37 +1,123 @@  - - 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 + + + ID online en pantalla dividida + + + Trofeos + + + 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. + + + 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. + + + ID online: + + + 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. + + + Parche 1.04 (Actualización de título 14) + + + ID online del juego + + + ¡Mira lo que hice en Minecraft: PlayStation®Vita Edition! + + + Error en la descarga. Vuelve a intentarlo más tarde. + + + No pudiste unirte a la partida por culpa de un tipo de NAT restrictivo. Comprueba tu configuración de red. + + + Error en la carga. Vuelve a intentarlo más tarde. + + + ¡Descarga completada! + + + +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. + + + + Guardado incompleto + + + Minecraft: PlayStation®Vita Edition no tiene espacio suficiente para guardar datos. Para crear espacio, borra otros datos guardados de Minecraft: PlayStation®Vita Edition. + + + Subida cancelada + + + Cancelaste la subida de estos datos a la zona de transferencia. + + + Cargar partida guardada para PS3™/PS4™ + + + Cargando datos: %d%% + + + "PSN" + + + Descargar datos PS3™ + + + Descargando datos: %d%% + + + Guardando + + + ¡Carga completada! + + + ¿Seguro que quieres cargar esta partida guardada y sobrescribir cualquier otra que pueda haber en la zona de transferencia? + + + Convirtiendo datos + + + NO SE USA + + + NO SE USA {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} @@ -46,32 +132,80 @@ En modo de vuelo, puedes mantener oprimido{*CONTROLLER_ACTION_JUMP*} para subir 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. - - NO SE USA - - - NO SE USA - "NO SE USA" - - "NO SE USA" - - - Invitar a amigos - 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? Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. ¿Seguro que quieres continuar? - - Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. + + "NO SE USA" - - 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? + + Invitar a amigos + + + minecraftforum cuenta con una sección dedicada a la edición para PlayStation®Vita. + + + ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! + + + NOT USED + + + ¡Puedes usar la pantalla táctil del aparato PlayStation®Vita para desplazarte por los menús! + + + ¡No mires a un Enderman a los ojos! + + + {*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. + + + {*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. + + + Creemos que 4J Studios eliminó a Herobrine del juego para el aparato PlayStation®Vita, pero no estamos seguros. + + + ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! + + + 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? + + + Se produjo un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. + + + Elaboración de pociones + + + Volviste a la pantalla de título porque cerraste sesión en "PSN". + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. Se perdió la conexión con "PSN". Saliendo al menú principal. @@ -79,11 +213,23 @@ En el modo de vuelo, mantén oprimido{*CONTROLLER_ACTION_JUMP*} para moverte hac Se perdió la conexión con "PSN". + + Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. + + + 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? + 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? + + Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. + + + ID online + 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". @@ -93,150 +239,7 @@ Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStati 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? - - Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. - - - ID online - - - Elaboración de pociones - - - Volviste a la pantalla de título porque cerraste sesión en "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? - - - Se produjo un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - ID online en pantalla dividida - - - Trofeos - - - ID online: - - - ID online del juego - - - ¡Mira lo que hice en Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Parche 1.04 (Actualización de título 14) - - - SELECT - - - 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. - - - ¿Quieres iniciar sesión en "PSN"? - - - 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. - - - Aparato PlayStation®Vita - - - Cambiar modo de red - - - Seleccionar modo de red - - - Elige Red Ad hoc para conectarte con otros sistemas PlayStation®Vita cercanos o "PSN" para conectarte con amigos de todo el mundo. - - - Red Ad hoc - - - "PSN" - - - Datos aparato PlayStation®3 - - - Cargar partida guardada para aparato PlayStation®3/PlayStation®4 - - - Subida cancelada - - - Cancelaste la subida de estos datos a la zona de transferencia. - - - Cargando datos : %d%% - - - Descargando datos : %d%% - - - ¿Seguro que quieres cargar esta partida guardada y sobrescribir cualquier otra que pueda haber en la zona de transferencia? - - - Convirtiendo datos - - - Guardando - - - ¡Carga completada! - - - Error en la carga. Vuelve a intentarlo más tarde. - - - ¡Descarga completada! - - - Error en la descarga. Vuelve a intentarlo más tarde. - - - No pudiste unirte a la partida por culpa de un tipo de NAT restrictivo. Comprueba tu configuración de red. - - - 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. - - - Guardado incompleto - - - Minecraft: PlayStation®Vita Edition no tiene espacio suficiente para guardar datos. Para crear espacio, borra otros datos guardados de Minecraft: PlayStation®Vita Edition. + + 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 game is beëindigd omdat je bent afgemeld bij "PSN" - - - Momenteel niet aangemeld. - - - Voor bepaalde functies van deze game moet je met "PSN" zijn verbonden. Je bent momenteel offline. - - - Ad hoc-netwerk niet beschikbaar. - - - 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 - - - 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 instellingen kunnen niet worden opgeslagen naar je Sony Entertainment Network-account. Probleem met Sony Entertainment Network-account - - De instellingen kunnen niet worden opgeslagen naar je Sony Entertainment Network-account. + + Er is een probleem opgetreden tijdens de verbinding met je Sony Entertainment Network-account. Je kunt de trofee momenteel niet ontvangen. 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? + + Verbinding maken met Ad hoc-netwerk + + + Je bent momenteel offline. Voor bepaalde functies van deze game moet je over een Ad hoc-netwerkverbinding beschikken. + + + Ad hoc-netwerk niet beschikbaar. + + + Probleem met trofee + + + De game is beëindigd omdat je bent afgemeld bij "PSN" + + + Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". + + + Je systeemopslag heeft te weinig vrije ruimte voor een opslagbestand. + + + 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,3106 +1,902 @@  - - 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! - - - Niet alle Zweden zijn blond. Jens van Mojang heeft zelfs rood haar! - - - Er komt nog wel een keer een update voor deze game. - - - Wie is Notch? - - - Mojang heeft meer prijzen dan medewerkers. - - - Er zijn hele beroemde mensen die Minecraft spelen. - - - deadmau5 houdt van Minecraft! - - - Kijk niet direct naar de bugs. - - - Creepers zijn het resultaat van een programmeerfout. - - - Is het een kip of een eend? - - - Ben je ook naar Minecon geweest? - - - Niemand bij Mojang heeft junkboy ooit gezien. - - - Weet je dat er ook een Minecraft-wiki is? - - - Het nieuwe kantoor van Mojang is cool! - - - Minecon 2013 vond plaats in Orlando, Florida. - - - .party() was geweldig! - - - Ga er altijd vanuit dat geruchten niet kloppen en neem ze nooit zomaar voor waar aan. - - - {*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. - - - {*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*}. - - - {*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. - - - {*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. - - - - {*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. - - - - {*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. - - - - {*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: 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. - - - - {*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. - - - - {*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. - - - {*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: 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: 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 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. - - - Volgende pagina - - - Vorige pagina - - - De basis - - - Scherminfo - - - Inventaris - - - Kisten - - - Produceren - - - Oven - - - Automaat - - - Dieren houden - - - Veeteelt - - + Brouwen - - Betoveren - - - Onderwereld-portaal - - - Multiplayer - - - Screenshots delen - - - Werelden uitsluiten - - - Speltype Creatief - - - Opties voor host en spelers - - - Handelen - - - Aambeeld - - - Het Einde - - - {*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. - - - - Sprinten - - - Nieuwe functies - - - {*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*} - - - {*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*} - - - Richt meer schade aan dan je vuisten. - - - 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. - - - Dit heb je nodig om verschillende stenen blokken en erts uit te graven. - - - Hiermee kun je sneller dan met de hand houten blokken kappen. - - - Hiermee kun je aarde en grasblokken voorbewerken voor gewassen. - - - Je activeert houten deuren door ze te gebruiken, door op ze te slaan of met roodsteen. - - - IJzeren deuren kunnen alleen worden geopend met roodsteen, knoppen of schakelaars. - - - NIET GEBRUIKT - - - NIET GEBRUIKT - - - NIET GEBRUIKT - - - NIET GEBRUIKT - - - Versterkt het pantser van de drager met 1. + + Gereedschap, wapens en pantser - - Versterkt het pantser van de drager met 3. + + Materialen - - Versterkt het pantser van de drager met 2. + + Bouwblokken - - Versterken het pantser van de drager met 1. + + Roodsteen en transport - - Versterkt het pantser van de drager met 2. + + Diversen - - Versterkt het pantser van de drager met 5. + + Aantal: - - Versterkt het pantser van de drager met 4. + + Afsluiten zonder opslaan - - Versterken het pantser van de drager met 1. + + Weet je zeker dat je naar het hoofdmenu wilt gaan? Niet opgeslagen voortgang gaat verloren. - - Versterkt het pantser van de drager met 2. + + Weet je zeker dat je naar het hoofdmenu wilt gaan? Je voortgang gaat dan verloren. - - Versterkt het pantser van de drager met 6. + + Dit opslagbestand is beschadigd. Wil je het verwijderen? - - Versterkt het pantser van de drager met 5. + + 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. - - Versterken het pantser van de drager met 2. + + Afsluiten en opslaan - - Versterkt het pantser van de drager met 2. + + Nieuwe wereld maken - - Versterkt het pantser van de drager met 5. + + Geef je wereld een naam - - Versterkt het pantser van de drager met 3. + + Voer de basis van je wereld in - - Versterken het pantser van de drager met 1. + + Opgeslagen wereld laden - - Versterkt het pantser van de drager met 3. + + Speluitleg spelen - - Versterkt het pantser van de drager met 8. + + Speluitleg - - Versterkt het pantser van de drager met 6. + + Naam van je wereld - - Versterken het pantser van de drager met 3. + + Beschadigd opslagbestand - - Een glanzende staaf die kan worden gebruikt om gereedschappen van dit materiaal te produceren. Ontstaat door erts te smelten in een oven. + + OK - - Hiermee kun je plaatsbare blokken produceren van staven, edelstenen of kleurstoffen. Je kunt het gebruiken als duur bouwblok of als compacte opslagplaats voor erts. + + Annuleren - - 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. + + Minecraft Store - - Wordt gebruikt voor korte trappen. + + Draaien - - Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + Verbergen - - Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok van dubbele platen. + + Alle vakjes leegmaken - - Wordt gebruik om licht te maken. Met fakkels kun je ook sneeuw en ijs smelten. + + Weet je zeker dat je de huidige game wilt verlaten om mee te doen met de nieuwe game? Niet opgeslagen voortgang gaat dan verloren. - - Worden gebruikt als bouwmateriaal waarmee je van alles kunt maken. Kan worden geproduceerd uit alle soorten hout. + + Weet je zeker dat je eventuele opslagbestanden voor deze wereld wilt overschrijven met de huidige versie van deze wereld? - - Wordt gebruikt als bouwmateriaal. In tegenstelling tot gewoon zand is het niet gevoelig voor zwaartekracht. + + Weet je zeker dat je wilt afsluiten zonder op te slaan? Je raakt al je voortgang kwijt in deze wereld! - - Wordt gebruikt als bouwmateriaal. + + Game starten - - Wordt gebruikt voor het produceren van fakkels, pijlen, borden, ladders en hekken, en als handgrepen van gereedschap en wapens. + + Game afsluiten - - 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. + + Game opslaan - - Hiermee kun je een grotere selectie voorwerpen produceren. + + Afsluiten zonder opslaan - - Hiermee kun je erts smelten, houtskool en glas maken en vis en varkensvlees bereiden. + + Druk START om mee te doen - - 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. + + Hoera! Je hebt een gamersafbeelding van Steve uit Minecraft verdiend! - - 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. + + Hoera! Je hebt een gamerafbeelding van een Creeper verdiend! - - Wordt gebruikt om verticaal te klimmen. + + Volledige game kopen - - 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 kunt niet meedoen met deze game omdat de andere speler een nieuwere versie van de game heeft. - - Is voorzien van tekst die is ingevoerd door jou of een andere speler. + + Nieuwe wereld - - Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. + + Je hebt een prijs verdiend! - - Wordt gebruikt om explosies te veroorzaken. Na plaatsing te activeren door aan te steken met een aansteker of een elektrische lading. + + Je speelt de testversie en je kunt de game alleen opslaan in de volledige game. +Wil je nu de volledige versie kopen? - - Wordt gebruikt om paddenstoelenstoofpot in te doen. Als de stoofpot op is, mag je de kom houden. + + Vrienden - - Wordt gebruikt om water, lava en melk in te doen en te vervoeren. + + Mijn score - - Wordt gebruikt om water in te doen en te vervoeren. + + Algemeen - - Wordt gebruikt om lava in te doen en te vervoeren. + + Even geduld - - Wordt gebruikt om melk in te doen en te vervoeren. + + Geen resultaten - - Wordt gebruikt om vuur te maken, TNT te laten ontploffen en een portaal te openen. + + Filter: - - Wordt gebruikt om vis te vangen. + + Je kunt niet meedoen met deze game omdat de andere speler een oudere versie van de game heeft. - - Laat de posities van de zon en de maan zien. + + Verbinding verbroken - - Wijst je de weg naar je startpunt. + + Verbinding met de server is verbroken. Terug naar het hoofdmenu. - - Als je de kaart vasthoudt, wordt de al ontdekte omgeving uitgetekend. Dit is erg handig om je weg te vinden. + + Verbinding verbroken door de server - - Hiermee kun je van afstand aanvallen door pijlen af te schieten. + + De game wordt afgesloten - - Wordt gebruikt als munitie voor bogen. + + Er is een fout opgetreden. Terug naar het hoofdmenu. - - Herstelt 2,5{*ICON_SHANK_01*}. + + Verbinding mislukt - - Herstelt 1{*ICON_SHANK_01*}. Kan 6 keer worden gebruikt. + + Je bent uit de game verwijderd - - Herstelt 1{*ICON_SHANK_01*}. + + De host heeft de game verlaten. - - Herstelt 1{*ICON_SHANK_01*}. + + Je kunt niet meedoen met deze game omdat niemand in de game een vriend van je is. - - Herstelt 3{*ICON_SHANK_01*}. + + Je kunt niet meedoen met deze game omdat je al een keer bent verwijderd door de host. - - Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Het kan je wel vergiftigen. + + Je bent uit de game verwijderd omdat je vloog - - Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door rauwe kip te bereiden in een oven. + + Verbinding maken duurde te lang - - Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. + + De server is vol - - Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door rauw rundvlees te bereiden in een oven. + + 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! - - Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. + + Thema's - - Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door varkensvlees te bereiden in een oven. + + Skinpakketten - - Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Je kunt er een ocelot mee temmen. + + Vrienden van vrienden toestaan - - Herstelt 2,5{*ICON_SHANK_01*}. Wordt gemaakt door rauwe vis te bereiden in een oven. + + Speler verwijderen - - Herstelt 2{*ICON_SHANK_01*} en er kan een gouden appel van worden gemaakt. + + Weet je zeker dat je deze speler uit de game wilt verwijderen? De speler kan pas weer meedoen als je de wereld opnieuw start. - - Herstelt 2{*ICON_SHANK_01*} en herstelt 4 seconden lang je gezondheid. Wordt gemaakt van een appel en goudklompen. + + Gamerafbeelding-pakketten - - Herstelt 2{*ICON_SHANK_01*}. Het kan je wel vergiftigen. + + Je kunt niet meedoen met deze game omdat alleen vrienden van de host mogen meedoen. - - Wordt gebruikt in het taartrecept en als ingrediënt bij het brouwen van drankjes. + + Downloadbare content beschadigd - - Wordt gebruikt om een elektrische lading aan of uit te zetten. Blijft aan of uit staan tot je de hendel weer gebruikt. + + 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. - - 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. + + 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. - - Wordt in roodsteencircuits gebruikt als versterker, delayer en/of diode. + + Je kunt niet meedoen - - Druk hierop om een elektrische lading af te geven. Blijft ongeveer een seconde geactiveerd en gaat dan weer uit. + + Geselecteerd - - Bevat voorwerpen en werpt deze in willekeurige volgorde uit als de automaat een roodsteensignaal krijgt. + + Geselecteerde skin: - - 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. + + Volledige versie downloaden - - Worden gebruikt als spoorweg voor mijnwagens. + + Texturepakket ontgrendelen - - Als deze rails stroom hebben, versnellen ze mijnwagens. Zonder stroom komen mijnwagens tot stilstand. + + Om dit texturepakket te kunnen gebruiken voor je wereld, moet je het ontgrendelen. +Wil je het nu ontgrendelen? - - Werkt als een drukplaat (via een roodsteensignaal als het stroom heeft), maar kan alleen worden geactiveerd door een mijnwagen. + + Testversie texturepakket - - Wordt gebruikt om jezelf, een dier of een monster over rails te vervoeren. + + Basis - - Wordt gebruikt om goederen over rails te vervoeren. + + Skinpakket ontgrendelen - - Verplaatst zich over rails en duwt andere mijnwagens als er steenkool in zit. + + Om de geselecteerde skin te kunnen gebruiken, moet je dit skinpakket ontgrendelen. +Wil je dit skinpakket nu ontgrendelen? - - Hiermee kun je je sneller over het water verplaatsen dan door te zwemmen. + + 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? - - Wordt verkregen door een schaap te scheren en kan worden gekleurd met kleurstoffen. + + Volledige versie downloaden - - Wordt gebruikt als bouwmateriaal en kan worden gekleurd met kleurstoffen. Dit recept is wat overbodig, omdat wol eenvoudig kan worden verkregen van een schaap. + + Deze wereld gebruikt een combinatiepakket of texturepakket dat je niet hebt! +Wil je het combinatiepakket of texturepakket nu installeren? - - Wordt gebruikt als kleurstof voor zwarte wol. + + Testversie downloaden - - Wordt gebruikt als kleurstof voor groene wol. + + Texturepakket niet aanwezig - - Wordt gebruikt als kleurstof voor bruine wol, als ingrediënt van koekjes of voor het kweken van cacaovruchten. + + Volledige versie ontgrendelen - - Wordt gebruikt als kleurstof voor zilveren wol. + + Testversie downloaden - - Wordt gebruikt als kleurstof voor gele wol. + + Je speltype is veranderd - - Wordt gebruikt als kleurstof voor rode wol. + + Als deze optie is ingeschakeld, mogen alleen uitgenodigde spelers meedoen. - - Wordt gebruikt om meteen gewassen, bomen, hoog gras, grote paddenstoelen en bloemen te laten ontstaan en kan worden gebruikt om kleurstoffen te maken. + + Als deze optie is ingeschakeld, mogen vrienden van spelers op je Vriendenlijst meedoen. - - Wordt gebruikt als kleurstof voor roze wol. + + Als deze optie is ingeschakeld, kunnen spelers andere spelers verwonden. Alleen voor het speltype Survival. - - Wordt gebruikt als kleurstof voor oranje wol. + + Normaal - - Wordt gebruikt als kleurstof voor lichtgroene wol. + + Supervlak - - Wordt gebruikt als kleurstof voor grijze wol. + + Als deze optie is ingeschakeld zal het een online spel worden. - - 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.) + + Als deze optie is uitgeschakeld, mogen andere spelers pas na toestemming bouwen of uitgraven. - - Wordt gebruikt als kleurstof voor lichtblauwe wol. + + Als deze optie is ingeschakeld, worden bouwwerken als dorpen en vestingen gegenereerd in de wereld. - - Wordt gebruikt als kleurstof voor cyaankleurige wol. + + Als deze optie is ingeschakeld, wordt een volledig vlakke Bovenwereld en Onderwereld gegenereerd. - - Wordt gebruikt als kleurstof voor paarse wol. + + Als deze optie is ingeschakeld, staat er een kist met handige voorwerpen bij de terugkeerlocatie van de speler. - - Wordt gebruikt als kleurstof voor magenta wol. + + Als deze optie is ingeschakeld, kan vuur overslaan naar brandbare blokken in de buurt. - - Wordt gebruikt als kleurstof voor blauwe wol. + + Als deze optie is ingeschakeld, ontploft TNT als het wordt geactiveerd. - - Speelt muziekplaten af. + + Als deze optie is ingeschakeld, wordt de Onderwereld opnieuw gegenereerd. Dit is handig als je een ouder opslagbestand zonder Onderwereld-forten hebt. - - Wordt gebruikt om zeer sterke gereedschappen, wapens en pantser te maken. + + Uit - - Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. + + Speltype: Creatief - - Wordt gebruikt om boeken en kaarten te maken. + + Survival - - Kan worden gebruikt voor het maken van boekenplanken en worden betoverd voor het maken van betoverde boeken. + + Creatief - - Door deze rond een tovertafel te plaatsen, kun je krachtigere betoveringen maken. + + Je wereld hernoemen - - Wordt gebruikt als decoratie. + + Voer de nieuwe naam in voor je wereld - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap. Het kan in een oven worden omgesmolten tot goudstaven. + + Speltype: Survival - - Kan worden uitgegraven met een stenen houweel of beter gereedschap. Het kan in een oven worden omgesmolten tot ijzerstaven. + + Gemaakt in het speltype Survival - - Kan worden uitgegraven met een houweel om steenkool te verkrijgen. + + Opslagbestand hernoemen - - Kan worden uitgegraven met een stenen houweel of beter gereedschap om lapis lazuli te verkrijgen. + + Automatisch opslaan over %d... - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om diamanten te verkrijgen. + + Aan - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om roodsteenstof te verkrijgen. + + Gemaakt in het speltype Creatief - - Kan worden uitgegraven met een houweel om keien te verkrijgen. + + Wolken renderen - - Wordt verkregen met een schop. Kan worden gebruikt voor constructie. + + Wat wil je doen met dit opslagbestand? - - Kan worden geplant en groeit uiteindelijk uit tot boom. + + Formaat Scherminfo (gedeeld scherm) - - Dit is onbreekbaar materiaal. + + Ingrediënt - - Alles wat ermee in contact komt, gaat branden. Kan worden verzameld in een emmer. + + Brandstof - - Wordt verkregen met een schop. Kan in een oven worden versmolten tot glas. Is gevoelig voor zwaartekracht als er geen object onder ligt. - - - Wordt verkregen met een schop. Bij het opgraven verschijnt soms vuursteen. Is gevoelig voor zwaartekracht als er geen object onder ligt. - - - 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. - - - 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. - - - Een compacte manier om sneeuwballen op te slaan. - - - Kan worden afgegraven met een schop om sneeuwballen te maken. - - - Bij het afbreken verschijnen soms tarwezaden. - - - Hiervan kun je een kleurstof maken. - - - 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. - - - 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. - - - 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. - - - 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. - - - Vertraagt de beweging van alles wat eroverheen loopt. - - - 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. - - - 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! - - - Wordt verkregen door het oogsten van gewassen 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 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 uitgraven van gloeisteen. Kan worden gebruikt om nieuwe blokken gloeisteen te maken of om het effect van een drankje krachtiger te maken. - - - 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. - - - 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. - - - Moet worden aangedreven met een knop, hendel, drukplaat, roodsteenfakkel of roodsteen, waarna de zuiger wordt uitgeschoven en blokken kan wegduwen. - - - 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. - - - 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. - - - Kunnen worden geplant om pompoenen te kweken. - - - 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 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. - - - De plant begint te groeien nadat hij is geplaatst. Kan worden verzameld met een schaar. Je kunt erop klimmen zoals op een ladder. - - - 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. - - - 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. - - - Afhankelijk van hun toepassing kunnen drankjes uiteenlopende effecten hebben. - - - 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. - - - 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 door regen of met een emmer water worden gevuld en vervolgens worden gebruikt om glazen flessen met water te vullen. - - - 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. - - - 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. - - - Te vinden in Onderwereld-forten. Laten Onderwereld-wratten achter als je ze breekt. - - - 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. - - - 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. - - - Te gebruiken om dingen in brand te steken of om lukraak branden te stichten als ze uit een automaat worden geschoten. - - - 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. - - - 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. - - - Kan worden geoogst om cacaobonen te verkrijgen. - - - 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. - - - Koe - - - Koeien laten leer achter als ze worden gedood. Ze kunnen ook worden gemolken met een emmer. - - - Schaap - - - 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. - - - Kip - - - Kippen laten veren achter als ze worden gedood en leggen op willekeurige momenten eieren. - - - Varken - - - 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. - - - Creeper - - - Creepers exploderen als je te dichtbij komt! - - - Skelet - - - Skeletten schieten met pijlen op je. Ze laten pijlen achter als ze worden gedood. - - - Spin - - - Spinnen vallen je aan als je te dichtbij komt. Ze kunnen op muren lopen en laten draden achter als ze worden gedood. - - - Zombie - - - Zombies vallen je aan als je te dichtbij komt. - - - Zombie-bigmens - - - Zombie-bigmensen zijn niet agressief tot je er een aanvalt. Dan vallen ze in groepen aan. - - - Ghast - - - Ghasts schieten vuurballen die exploderen als je erdoor wordt geraakt. - - - Slijmkubus - - - Slijmkubussen splitsen zich op in kleinere slijmkubussen als ze worden geraakt. - - - Einder-man - - - 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. - - - Grotspin - - - De beet van de grotspin is giftig. - - - Zwamkoe - - - 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. - - - Sneeuwgolem - - - Je kunt sneeuwgolems maken van sneeuwblokken en pompoenen. Vervolgens gooien ze sneeuwballen naar je vijanden. - - - Einder-draak - - - Dit is een grote zwarte draak, die je aantreft in het Einde. - - - Blaze - - - Deze vijanden tref je aan in de Onderwereld, meestal in Onderwereld-forten. Ze laten Blaze-staven achter als ze worden gedood. - - - Magmakubus - - - Magmakubussen komen voor in de Onderwereld. Net als slijmkubussen splitsen ze zich op in kleinere kubussen als ze worden geraakt. - - - Dorpeling - - - Ocelot - - - 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. - - - IJzergolem - - - IJzergolems verdedigen dorpen. Je kunt ze maken met ijzerblokken en pompoenen. - - - Explosie-animaties - - - Concept-illustraties - - - Cijfertjes en statistieken - - - Pestcoördinatie - - - Oorspronkelijk ontwerp en code - - - Projectmanager/producent - - - Rest van Mojang - - - Hoofdprogrammeur Minecraft PC - - - Ninja-code - - - CEO - - - Witteboordenwerker - - - Klantenservice - - - Kantoor-dj - - - Ontwerper/programmeur Minecraft - Pocket Edition - - - Ontwikkelaar - - - Hoofd-architect - - - Ontwikkeling grafisch ontwerp - - - Game-crafter - - - Directeur lolfactor - - - Muziek en geluid - - - Programmering - - - Grafisch ontwerp - - - Kwaliteitscontrole - - - Uitvoerend producent - - - Hoofdproducent - - - Producent - - - Testleider - - - Hoofdtester - - - Ontwerpteam - - - Ontwikkelteam - - - Release-management - - - Directeur XBLA Publishing - - - Zakelijke ontwikkeling - - - Directeur Portfolio - - - Productmanager - - - Marketing - - - Community-manager - - - Lokalisatieteam Europa - - - Lokalisatieteam Redmond - - - Lokalisatieteam Azië - - - Gebruikersresearchteam - - - MGS Central Teams - - - Tester milestone-goedkeuring - - - Speciale dank - - - Testmanager - - - Senior testleider - - - SDET - - - Project-STE - - - Extra STE - - - Testpartners - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Houten zwaard - - - Stenen zwaard - - - IJzeren zwaard - - - Diamanten zwaard - - - Gouden zwaard - - - Houten schop - - - Stenen schop - - - IJzeren schop - - - Diamanten schop - - - Gouden schop - - - Houten houweel - - - Stenen houweel - - - IJzeren houweel - - - Diamanten houweel - - - Gouden houweel - - - Houten bijl - - - Stenen bijl - - - IJzeren bijl - - - Diamanten bijl - - - Gouden bijl - - - Houten schoffel - - - Stenen schoffel - - - IJzeren schoffel - - - Diamanten schoffel - - - Gouden schoffel - - - Houten deur - - - IJzeren deur - - - Maliënhelm - - - Maliënborstplaat - - - Maliënbeenbeschermers - - - Maliënlaarzen - - - Leren kap - - - IJzeren helm - - - Diamanten helm - - - Gouden helm - - - Leren tuniek - - - IJzeren borstplaat - - - Diamanten borstplaat - - - Gouden borstplaat - - - Leren broek - - - IJzeren beenbeschermers - - - Diamanten beenbeschermers - - - Gouden beenbeschermers - - - Leren laarzen - - - IJzeren laarzen - - - Diamanten laarzen - - - Gouden laarzen - - - IJzerstaaf - - - Goudstaaf - - - Emmer - - - Emmer water - - - Emmer lava - - - Aansteker - - - Appel - - - Boog - - - Pijl - - - Steenkool - - - Houtskool - - - Diamant - - - Stok - - - Kom - - - Paddenstoelenstoofpot - - - Draad - - - Veer - - - Buskruit - - - Tarwezaden - - - Tarwe - - - Brood - - - Vuursteen - - - Rauw varkensvlees - - - Gebraden varkensvlees - - - Schilderij - - - Gouden appel - - - Bord - - - Mijnwagen - - - Zadel - - - Roodsteen - - - Sneeuwbal - - - Boot - - - Leer - - - Emmer melk - - - Baksteen - - - Klei - - - Suikerriet - - - Papier - - - Boek - - - Slijmbal - - - Mijnwagen met kist - - - Mijnwagen met oven - - - Ei - - - Kompas - - - Hengel - - - Klok - - - Gloeisteenstof - - - Rauwe vis - - - Gebakken vis - - - Kleurstof - - - Inktzak - - - Rozenrood - - - Cactusgroen - - - Cacaobonen - - - Lapis lazuli - - - Paarse kleurstof - - - Cyaan-kleurstof - - - Lichtgrijze kleurstof - - - Grijze kleurstof - - - Roze kleurstof - - - Lichtgroene kleurstof - - - Paardenbloemgeel - - - Lichtblauwe kleurstof - - - Magenta kleurstof - - - Oranje kleurstof - - - Bottenmeel - - - Bot - - - Suiker - - - Taart - - - Bed - - - Roodsteenversterker - - - Koekje - - - Kaart - - - Muziekplaat - '13' - - - Muziekplaat - 'Cat' - - - Muziekplaat - 'Blocks' - - - Muziekplaat - 'Chirp' - - - Muziekplaat - 'Far' - - - Muziekplaat - 'Mall' - - - Muziekplaat - 'Mellohi' - - - Muziekplaat - 'Stal' - - - Muziekplaat - 'Strad' - - - Muziekplaat - 'Ward' - - - Muziekplaat - '11' - - - Muziekplaat - 'Where are we now' - - - Schaar - - - Pompoenzaden - - - Meloenzaden - - - Rauwe kip - - - Gebraden kip - - - Rauw rundvlees - - - Biefstuk - - - Bedorven vlees - - - Einder-parel - - - Stuk meloen - - - Blaze-staf - - - Ghast-traan - - - Goudklomp - - - Onderwereld-wrat - - - {*splash*}{*prefix*}Drankje {*postfix*} - - - Glazen fles - - - Fles water - - - Spinnenoog - - - Gegist spinnenoog - - - Blaze-poeder - - - Magmacrème - - - Brouwrek - - - Ketel - - - Einder-oog - - - Glinsterende meloen - - - Priesterfles - - - Vuurbal - - - Vuurbal (houtskool) - - - Vuurbal (steenkool) - - - Voorwerplijst - - - {*CREATURE*} spawnen - - - Onderwereld-steen - - - Schedel - - - Schedel skelet - - - Schedel Onderwereld-skelet - - - Zombiehoofd - - - Hoofd - - - Hoofd van %s - - - Creeper-hoofd - - - Steen - - - Grasblok - - - Aarde - - - Kei - - - Eikenhouten planken - - - Sparrenhouten planken - - - Berkenhouten planken - - - Tropenhouten planken - - - Jong boompje - - - Jonge eik - - - Jonge spar - - - Jonge berk - - - Jonge tropische boom - - - Grondsteen - - - Water - - - Lava - - - Zand - - - Zandsteen - - - Grind - - - Gouderts - - - IJzererts - - - Steenkoolerts - - - Hout - - - Eikenhout - - - Sparrenhout - - - Berkenhout - - - Tropisch hout - - - Eik - - - Spar - - - Berk - - - Bladeren - - - Eikenbladeren - - - Sparrenbladeren - - - Berkenbladeren - - - Tropische bladeren - - - Spons - - - Glas - - - Wol - - - Zwarte wol - - - Rode wol - - - Groene wol - - - Bruine wol - - - Blauwe wol - - - Paarse wol - - - Cyaankleurige wol - - - Lichtgrijze wol - - - Grijze wol - - - Roze wol - - - Lichtgroene wol - - - Gele wol - - - Lichtblauwe wol - - - Magenta wol - - - Oranje wol - - - Witte wol - - - Bloem - - - Roos - - - Paddenstoel - - - Goudblok - - - Een compacte manier om goud op te slaan. - - - IJzerblok - - - Een compacte manier om ijzer op te slaan. - - - Steenplaat - - - Steenplaat - - - Zandsteenplaat - - - Eikenhouten plaat - - - Keiplaat - - - Baksteenplaat - - - Bloksteenplaat - - - Eikenhouten plaat - - - Sparrenhouten plaat - - - Berkenhouten plaat - - - Tropenhouten plaat - - - Onderwereld-steenplaat - - - Bakstenen - - - TNT - - - Boekenplank - - - Mossige steen - - - Obsidiaan - - - Fakkel - - - Fakkel (steenkool) - - - Fakkel (houtskool) - - - Vuur - - - Monsterkooi - - - Eikenhouten trap - - - Kist - - - Roodsteenstof - - - Diamanterts - - - Diamantblok - - - Een compacte manier om diamanten op te slaan. - - - Werkbank - - - Gewassen - - - Akker - - - Oven - - - Bord - - - Houten deur - - - Ladder - - - Rails - - - Aangedreven rails - - - Detectierails - - - Stenen trap - - - Hendel - - - Drukplaat - - - IJzeren deur - - - Roodsteenerts - - - Roodsteenfakkel - - - Toets - - - Sneeuw - - - IJs - - - Cactus - - - Klei - - - Suikerriet - - - Jukebox - - - Hek - - - Pompoen - - - Pompoenlampion - - - Onderwereld-blok - - - Drijfzand - - - Gloeisteen - - - Portaal - - - Lapis lazuli-erts - - - Lapis lazuli-blok - - - Een compacte manier om lapis lazuli op te slaan. - - + Automaat - - Nootblok + + Kist - - Taart + + Betoveren - - Bed + + Oven - - Web + + Er is op dit moment geen downloadbare content van dit type beschikbaar voor deze titel. - - Hoog gras + + Weet je zeker dat je dit opslagbestand wilt verwijderen? - - Verdorde struik + + Wachten op goedkeuring - - Diode + + Gecensureerd - - Afgesloten kist + + %s doet mee met de game. - - Valluik + + %s heeft de game verlaten. - - Wol (elke kleur) + + %s is verwijderd uit de game. - - Zuiger - - - Plakzuiger - - - Zilvervisblok - - - Blokstenen - - - Mossige blokstenen - - - Gebarsten blokstenen - - - Gebeitelde blokstenen - - - Paddenstoel - - - Paddenstoel - - - IJzeren hek - - - Raam - - - Meloen - - - Pompoenplant - - - Meloenplant - - - Klimplanten - - - Poortje - - - Bakstenen trap - - - Blokstenen trap - - - Zilvervissteen - - - Zilverviskei - - - Zilvervisbloksteen - - - Zwamvlok - - - Plompenblad - - - Onderwereld-steen - - - Onderwereld-stenen hek - - - Onderwereld-stenen trap - - - Onderwereld-wrat - - - Tovertafel - - + Brouwrek - - Ketel + + Tekst invoeren op bord - - Einde-portaal + + Voer een tekstregel in voor je bord - - Einde-portaalblok + + Titel invoeren - - Einde-steen + + Testversie verlopen - - Drakenei + + Game vol - - Struik + + Aansluiten bij de game is mislukt omdat er geen ruimte meer is - - Varen + + Voer een titel in voor je bericht - - Zandstenen trap + + Voer een beschrijving in voor je bericht - - Sparrenhouten trap - - - Berkenhouten trap - - - Tropenhouten trap - - - Roodsteenlamp - - - Kokospalm - - - Schedel - - - Huidige besturing - - - Configuratie - - - Verplaatsen/rennen - - - Rondkijken - - - Pauze - - - Springen - - - Springen/Omhoog vliegen - - + Inventaris - - Voorwerp veranderen + + Ingrediënten - - Actie + + Bijschrift toevoegen - - Gebruiken + + Voer een bijschrift in voor je bericht - - Produceren + + Beschrijving invoeren - - Laten vallen + + Huidig nummer: - - Sluipen + + 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. - - Sluipen/Omlaag vliegen + + Verwijderen van lijst met uitgesloten werelden - - Andere camera + + Interval automatisch opslaan - - Spelers/uitnodigen + + Uitgesloten wereld - - Verplaatsen (vliegend) + + 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. - - Configuratie 1 + + Deze wereld uitsluiten? - - Configuratie 2 + + Interval automatisch opslaan: UIT - - Configuratie 3 + + Doorzichtigheid interface - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Automatisch opslaan wereld voorbereiden - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Formaat Scherminfo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + min. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Dit kan hier niet geplaatst worden! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Je mag geen lava in de buurt van een terugkeerlocatie plaatsen, omdat verschijnende spelers anders direct doodgaan. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Favoriete skins - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Game van %s - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Game van onbekende host - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Gast afgemeld - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Standaardinstellingen herstellen - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Weet je zeker dat je de standaardinstellingen wilt herstellen? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Fout tijdens het laden - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Een gastspeler heeft zich afgemeld, waardoor alle gastspelers uit de game zijn verwijderd. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Game maken mislukt - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Automatisch geselecteerd - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Geen pakket: Standaardskins - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Aanmelden - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Je bent niet aangemeld. Om deze game te kunnen spelen, moet je zijn aangemeld. Wil je je nu aanmelden? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Multiplayer niet toegestaan - - <![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;]]> + + Drinken - - {*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. - - - {*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. - - - 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. - - - Gebruik{*CONTROLLER_ACTION_LOOK*} om omhoog, omlaag en rond te kijken. - - - Gebruik{*CONTROLLER_ACTION_MOVE*} om je te verplaatsen. - - - 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. - - - Druk op{*CONTROLLER_ACTION_JUMP*} om te springen. - - - 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. - - - 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 op{*CONTROLLER_ACTION_CRAFTING*} om de productie-interface te openen. - - - In de inventaris worden voorwerpen opgenomen die je verzamelt en produceert.{*B*} - Druk op{*CONTROLLER_ACTION_INVENTORY*} om de inventaris te openen. - - - 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. - - - 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. - - - 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. - - - 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*} - - - Je kunt planken produceren van het hout dat je hebt verzameld. Open de productie-interface om ze te maken.{*PlanksIcon*} - - - Om iets te produceren, zijn vaak meerdere stappen nodig. Nu je planken hebt, kun je meer voorwerpen produceren. Maak een werkbank.{*CraftingTableIcon*} - - - 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*} - - - Neem een ander voorwerp in je hand met{*CONTROLLER_ACTION_LEFT_SCROLL*} en{*CONTROLLER_ACTION_RIGHT_SCROLL*}. - - - 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. - - - Selecteer de werkbank, beweeg het richtkruis naar de plek waar je de werkbank wilt plaatsen en druk op{*CONTROLLER_ACTION_USE*}. - - - Beweeg het richtkruis naar de werkbank en druk op {*CONTROLLER_ACTION_USE*} om 'm te openen. - - - 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*} - - - 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*} - - - 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*} - - - Open de houder. - - - 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. - - + - Er is een verlaten mijnwerkersschuilplaats in de buurt die je kunt afmaken, zodat je je kunt verschuilen voor de nacht. + In dit gebied vind je landbouwgrond. Dit is een duurzame bron van voedsel en andere voorwerpen. - - - 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. - - - - 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 hebt genoeg keien verzameld om een oven te kunnen bouwen. Gebruik hiervoor je werkbank. - - - Gebruik{*CONTROLLER_ACTION_USE*} om de oven in de wereld te plaatsen. Daarna open je de oven. - - - 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. - - - 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. - - - Een goede schuilplaats heeft een deur, zodat je naar binnen en buiten kunt zonder muren uit te graven. Maak nu een houten deur.{*WoodenDoorIcon*} - - - Gebruik{*CONTROLLER_ACTION_USE*} om de deur te plaatsen. Met{*CONTROLLER_ACTION_USE*} kun je een houten deur in de wereld openen en dichtdoen. - - - 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*} - - - - Je hebt het eerste deel van de speluitleg voltooid. - - - + {*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. + Druk op{*CONTROLLER_VK_A*} voor meer informatie over landbouw.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over landbouw. - + + 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. + + + Druk op{*CONTROLLER_ACTION_CRAFTING*} om de inventaris van het speltype Creatief te openen. + + + Ga door deze opening om verder te gaan. + + + Je hebt de nu de uitleg van het speltype Creatief voltooid. + + + 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. + + + 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*} + + + Paddenstoelen moeten worden geplant in een schemerige omgeving en verspreiden zich over schemerige blokken in de buurt.{*ICON*}39{*/ICON*} + + + 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*} + + + Tarwe groeit in verschillende fasen en kan worden geoogst als de plant donkerder wordt.{*ICON*}59:7{*/ICON*} + + + Pompoenen en meloenen hebben naast zich een extra blok met zaad nodig zodat de vrucht zich kan ontwikkelen als de stam is volgroeid. + + + 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*} + + + 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. + + - 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. + 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. - - {*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. - - - + - 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*}. + In dit gebied vind je een portaal naar de Onderwereld! - + - 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. + {*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. - + + 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*} + + - Als je de aanwijzer buiten de interface plaatst, laat je het voorwerp vallen. + Je kunt roodsteenversterkers gebruiken om meer blokken van stroom te voorzien of om een circuit te vertragen. + {*ICON*}356{*/ICON*} - + - Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_VK_BACK*}. + 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*} - + - Druk nu op{*CONTROLLER_VK_B*} om de inventaris te sluiten. + 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. - + - Dit is de inventaris in het speltype Creatief. Je ziet de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je kunt kiezen. + 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. - - {*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. - - - - 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. - - + - 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. + Dit is het speltype Creatief. - + - 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. + {*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. - + - Blader door de voorwerpgroepen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, en selecteer de groep met het voorwerp dat je wilt pakken. + 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. - + - Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_VK_BACK*}. + 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. - + - Druk nu op{*CONTROLLER_VK_B*} om de inventaris in het speltype Creatief te sluiten. + 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. - + + Je hebt de nu de uitleg over landbouw voltooid. + + + Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een bijl gebruiken om bomen te kappen. + + + 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. + + + Sommige gereedschappen zijn beter geschikt om aan te vallen. Een zwaard is bijvoorbeeld erg effectief tegen vijanden. + + + IJzergolems kunnen ook vanzelf verschijnen om dorpen te verdedigen en vallen je aan als jij dorpelingen aanvalt. + + + Je mag dit gebied pas verlaten als je de speluitleg hebt voltooid. + + + 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. + + + 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. + + + 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. + + + In de kist naast de vijver vind je een hengel. Neem de hengel uit de kist en hou deze in je hand. + + + 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. + + + 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. + + + Hou{*CONTROLLER_ACTION_JUMP*} om omhoog te zwemmen. + + + 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. + + + 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. + + + 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. + + + 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. + + + Nadat een dier verliefd is geweest, duurt het ongeveer vijf minuten voordat het opnieuw verliefd kan worden. + + - Dit is de productie-interface. Met deze interface kun je verzamelde voorwerpen met elkaar combineren om nieuwe voorwerpen te maken. + In dit gebied zitten dieren ingesloten. Je kunt dieren fokken om nieuwe jonge dieren te verkrijgen. - - {*B*} - Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al weet hoe je moet produceren. - - - - {*B*} - Druk op{*CONTROLLER_VK_X*} voor een beschrijving van het voorwerp. - - - - {*B*} - Druk op{*CONTROLLER_VK_X*} om te zien welke ingrediënten je nodig hebt om het geselecteerde voorwerp te maken. - - - - {*B*} - Druk op{*CONTROLLER_VK_X*} om je inventaris weer te openen. - - - + - 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. + {*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. - + + Om dieren te laten paren, moet je ze voedsel geven waarvan ze 'verliefd' worden. + + + 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*} + + - 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*} voor meer informatie over golems.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over golems. - + + Je maakt een golem door een pompoen op een stapel blokken te zetten. + + + Sneeuwgolems maak je door twee sneeuwblokken op elkaar te zetten en daarop een pompoen te plaatsen. Ze gooien sneeuwballen naar je vijanden. + + - 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 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. - + + Je hebt nu de uitleg over dieren en fokken voltooid. + + - 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. + In dit gebied vind je enkele pompoenen en blokken waarmee je een sneeuwgolem en een ijzergolem kunt maken. - + - Je ziet nu de beschrijving van het geselecteerde voorwerp. Dit geeft je een idee van de mogelijke toepassingen. - - - - - Je ziet nu een lijst met de ingrediënten die je nodig hebt om het geselecteerde voorwerp te produceren. - - - - 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*} - - - - 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. - - - - - 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*} - - - - - Druk op{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*} om een andere voorwerpgroep te kiezen. Selecteer de groep Bouwmaterialen.{*StructuresIcon*} - - - - - 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*} - - - - - 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*} - - - - - 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. - - - - - Sommige voorwerpen maak je niet met de werkbank, maar met de oven. Maak nu een oven.{*FurnaceIcon*} - - - - - 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. - - - - - 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. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Houtskool kan worden gebruikt als brandstof, maar in combinatie met een stok kun je er ook een fakkel van maken. - - - - - Plaats zand in het ingrediëntvakje om glas te maken. Maak wat glasblokken, die je als ramen kunt gebruiken in je schuilplaats. - - - - - Dit is de brouw-interface. Hier maak je allerlei drankjes met verschillende effecten. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - Maak een drankje voor vuurbestendigheid door eerst Onderwereld-wrat toe te voegen aan een fles water en er vervolgens magmacrème bij te doen. - - - - - Druk nu op{*CONTROLLER_VK_B*} om de brouw-interface te sluiten. - - - - - In dit gebied staat een brouwrek, een ketel en een kist met brouwvoorwerpen. - - - - {*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. - - - - - Om een drankje te kunnen brouwen, heb je eerst een fles water nodig. Neem een glazen fles uit de kist. - - - - - 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. + 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. @@ -3117,11 +913,42 @@ Kan ook worden gebruikt voor matige verlichting. 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. + + + + {*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. + + + + + Om een drankje te kunnen brouwen, heb je eerst een fles water nodig. Neem een glazen fles uit de kist. + + + + + 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. Gebruik het drankje voor vuurbestendigheid op jezelf. + + + + + 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 er een voorwerp wordt geplaatst in het betoveringsvakje, tonen de knoppen rechts een selectie van willekeurige betoveringen. + + + + + 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. @@ -3140,118 +967,79 @@ Kan ook worden gebruikt voor matige verlichting. Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de betover-interface. - + - 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. + In dit gebied staat een brouwrek, een ketel en een kist met brouwvoorwerpen. - + - Als er een voorwerp wordt geplaatst in het betoveringsvakje, tonen de knoppen rechts een selectie van willekeurige betoveringen. + Houtskool kan worden gebruikt als brandstof, maar in combinatie met een stok kun je er ook een fakkel van maken. - + - 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. + Plaats zand in het ingrediëntvakje om glas te maken. Maak wat glasblokken, die je als ramen kunt gebruiken in je schuilplaats. + + + + + Dit is de brouw-interface. Hier maak je allerlei drankjes met verschillende effecten. + + + + + 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. + + + + + 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. + + + + + 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. + + + + {*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. + + + + + 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. + + + + Maak een drankje voor vuurbestendigheid door eerst Onderwereld-wrat toe te voegen aan een fles water en er vervolgens magmacrème bij te doen. + + + + + Druk nu op{*CONTROLLER_VK_B*} om de brouw-interface te sluiten. + + + + + 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. + + + + + 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. + + + + + 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. Selecteer een betovering en druk op{*CONTROLLER_VK_A*} om het voorwerp te betoveren. De kosten van de betovering worden afgetrokken van je ervaringsniveau. - - - - - 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. - - - - - In dit gebied vind je een tovertafel en enkele andere voorwerpen waarmee je kunt oefenen met betoveringen. - - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over betoveringen.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over betoveringen. - - - - - 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. - - - - - Door boekenkasten rond de tovertafel te plaatsen, wordt deze krachtiger en kun je betoveringen van hogere niveaus uitvoeren. - - - - - 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. - - - - - 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. - - - - - In de kisten in dit gebied vind je enkele betoverde voorwerpen, priesterflessen en voorwerpen die je zelf kunt betoveren bij de tovertafel. - - - - - 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*} - - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over mijnwagens.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over mijnwagens. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over boten.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over boten. - - - - - Met een boot kun je sneller over water reizen. Je stuurt de boot met{*CONTROLLER_ACTION_MOVE*} en{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - - - Je gebruikt nu een hengel. Druk op{*CONTROLLER_ACTION_USE*} om de hengel te gebruiken.{*FishingRodIcon*} - - - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over vissen.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over vissen. @@ -3270,11 +1058,46 @@ Kan ook worden gebruikt voor matige verlichting. 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*} + + + + + Met een boot kun je sneller over water reizen. Je stuurt de boot met{*CONTROLLER_ACTION_MOVE*} en{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Je gebruikt nu een hengel. Druk op{*CONTROLLER_ACTION_USE*} om de hengel te gebruiken.{*FishingRodIcon*} + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over vissen.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over vissen. 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*} + + + + + In dit gebied staan enkele eenvoudige circuits met roodsteen en zuigers, en een kist met voorwerpen waarmee je deze circuits kunt uitbreiden. + + + + + {*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. + + + + + 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. @@ -3296,246 +1119,304 @@ Kan ook worden gebruikt voor matige verlichting. {*ICON*}355{*/ICON*} - - - In dit gebied staan enkele eenvoudige circuits met roodsteen en zuigers, en een kist met voorwerpen waarmee je deze circuits kunt uitbreiden. - - - + {*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. + Druk op{*CONTROLLER_VK_A*} voor meer informatie over boten.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over boten. - + - 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. + 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. - + - 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. + Door boekenkasten rond de tovertafel te plaatsen, wordt deze krachtiger en kun je betoveringen van hogere niveaus uitvoeren. - - 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*} - - + - Je kunt roodsteenversterkers gebruiken om meer blokken van stroom te voorzien of om een circuit te vertragen. - {*ICON*}356{*/ICON*} + 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. - + - 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*} + 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. - + - 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. + In dit gebied vind je een tovertafel en enkele andere voorwerpen waarmee je kunt oefenen met betoveringen. - + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over betoveringen.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over betoveringen. + + + - In dit gebied vind je een portaal naar de Onderwereld! + 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. - + - {*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. + 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*} - + - 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. + 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*} - + - 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. + 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*} - + - 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. + In de kisten in dit gebied vind je enkele betoverde voorwerpen, priesterflessen en voorwerpen die je zelf kunt betoveren bij de tovertafel. - + - 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. + 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*} - - - 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. + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over mijnwagens.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over mijnwagens. - - - Dit is het speltype Creatief. - - - - - {*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. - - - - 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. - - - Druk op{*CONTROLLER_ACTION_CRAFTING*} om de inventaris van het speltype Creatief te openen. - - - Ga door deze opening om verder te gaan. - - - Je hebt de nu de uitleg van het speltype Creatief voltooid. - - - - In dit gebied vind je landbouwgrond. Dit is een duurzame bron van voedsel en andere voorwerpen. - - - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over landbouw.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over landbouw. - - - - 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. - - - 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. - - - Tarwe groeit in verschillende fasen en kan worden geoogst als de plant donkerder wordt.{*ICON*}59:7{*/ICON*} - - - Pompoenen en meloenen hebben naast zich een extra blok met zaad nodig zodat de vrucht zich kan ontwikkelen als de stam is volgroeid. - - - 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*} - - - 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*} - - - Paddenstoelen moeten worden geplant in een schemerige omgeving en verspreiden zich over schemerige blokken in de buurt.{*ICON*}39{*/ICON*} - - - 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*} - - - Je hebt de nu de uitleg over landbouw voltooid. - - - - In dit gebied zitten dieren ingesloten. Je kunt dieren fokken om nieuwe jonge dieren te verkrijgen. - - - - - {*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. - - - - Om dieren te laten paren, moet je ze voedsel geven waarvan ze 'verliefd' worden. - - - 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. - - - 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. - - - Nadat een dier verliefd is geweest, duurt het ongeveer vijf minuten voordat het opnieuw verliefd kan worden. - - - 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*} - - - - 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. - - - - Je hebt nu de uitleg over dieren en fokken voltooid. - - - - In dit gebied vind je enkele pompoenen en blokken waarmee je een sneeuwgolem en een ijzergolem kunt maken. - - - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over golems.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over golems. - - - - Je maakt een golem door een pompoen op een stapel blokken te zetten. - - - Sneeuwgolems maak je door twee sneeuwblokken op elkaar te zetten en daarop een pompoen te plaatsen. Ze gooien sneeuwballen naar je vijanden. - - - 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. - - - IJzergolems kunnen ook vanzelf verschijnen om dorpen te verdedigen en vallen je aan als jij dorpelingen aanvalt. - - - Je mag dit gebied pas verlaten als je de speluitleg hebt voltooid. - - - 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. - - - Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een bijl gebruiken om bomen te kappen. - - - 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. - - - Sommige gereedschappen zijn beter geschikt om aan te vallen. Een zwaard is bijvoorbeeld erg effectief tegen vijanden. - - - 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. - - - 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. - - - Hou{*CONTROLLER_ACTION_JUMP*} om omhoog te zwemmen. - - - 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. - - - 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. - - - In de kist naast de vijver vind je een hengel. Neem de hengel uit de kist en hou deze in je hand. - - - 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. - Als je de aanwijzer buiten de interface plaatst terwijl je een voorwerp vasthoudt, laat je dat voorwerp vallen. + + Lezen + + + Hangen + + + Gooien + + + Openen + + + Andere toonhoogte + + + Laten ontploffen + + + Planten + + + Volledige game ontgrendelen + + + Opslagbestand verwijderen + + + Verwijderen + + + Bewerken + + + Oogsten + + + Doorgaan + + + Omhoog zwemmen + + + Slaan + + + Melken + + + Oppakken + + + Leeg + + + Zadel + + + Plaatsen + + + Eten + + + Rijden + + + Varen + + + Kweken + + + Slapen + + + Ontwaken + + + Spelen + + + Opties + + + Pantser verplaatsen + + + Wapen verplaatsen + + + In uitrusting + + + Ingrediënt verplaatsen + + + Brandstof verplaatsen + + + Gereedschap verplaatsen + + + Spannen + + + Pagina omhoog + + + Pagina omlaag + + + Verliefd + + + Loslaten + + + Privileges + + + Afweren + + + Creatief + + + Wereld uitsluiten + + + Skin selecteren + + + Aansteken + + + Vrienden uitnodigen + + + Accepteren + + + Knippen + + + Navigeren + + + Opnieuw installeren + + + Opties + + + Opdracht uitvoeren + + + Volledige versie installeren + + + Testversie installeren + + + Installeren + + + Eruit + + + Lijst online games verversen + + + Party-games + + + Alle games + + + Afsluiten + + + Annuleren + + + Meedoen annuleren + + + Andere groep + + + Produceren + + + Maken + + + Pakken/plaatsen + + + Inventaris tonen + + + Beschrijving tonen + + + Ingrediënten tonen + + + Terug + + + Denk eraan: + + + + + + In de laatste versie van de game zijn er nieuwe functies toegevoegd, waaronder nieuwe gebieden in de oefenwereld. + 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. @@ -3547,29 +1428,9 @@ Kan ook worden gebruikt voor matige verlichting. {*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. - - Denk eraan: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - In de laatste versie van de game zijn er nieuwe functies toegevoegd, waaronder nieuwe gebieden in de oefenwereld. - {*B*}Druk op{*CONTROLLER_VK_A*} om de speluitleg te spelen.{*B*} Druk op{*CONTROLLER_VK_B*} om de speluitleg over te slaan. - - - In dit gebied vind je omgevingen waar je uitleg krijgt over vissen, boten, zuigers en roodsteen. - - - Buiten dit gebied vind je voorbeelden van gebouwen, landbouwgrond, mijnwagens en rails, betoveringen, drankjes, handelaren, smidsen en nog veel meer! - - - - Je voedselbalk is nu zo leeg dat je gezondheid niet langer automatisch wordt hersteld. - @@ -3584,102 +1445,20 @@ Kan ook worden gebruikt voor matige verlichting. Gebruiken - - Terug + + In dit gebied vind je omgevingen waar je uitleg krijgt over vissen, boten, zuigers en roodsteen. - - Afsluiten + + Buiten dit gebied vind je voorbeelden van gebouwen, landbouwgrond, mijnwagens en rails, betoveringen, drankjes, handelaren, smidsen en nog veel meer! - - Annuleren - - - Meedoen annuleren - - - Lijst online games verversen - - - Party-games - - - Alle games - - - Andere groep - - - Inventaris tonen - - - Beschrijving tonen - - - Ingrediënten tonen - - - Produceren - - - Maken - - - Pakken/plaatsen + + + Je voedselbalk is nu zo leeg dat je gezondheid niet langer automatisch wordt hersteld. + Pakken - - Alles pakken - - - De helft pakken - - - Plaatsen - - - Alles plaatsen - - - Eén plaatsen - - - Laten vallen - - - Alles laten vallen - - - Eén laten vallen - - - Verwisselen - - - Snel plaatsen - - - Werkbalk leegmaken - - - Wat is dit? - - - Delen op Facebook - - - Ander filter - - - Vriendverzoek versturen - - - Pagina omlaag - - - Pagina omhoog - Volgende @@ -3689,18 +1468,18 @@ Kan ook worden gebruikt voor matige verlichting. Speler verwijderen + + Vriendverzoek versturen + + + Pagina omlaag + + + Pagina omhoog + Verven - - Uitgraven - - - Voeden - - - Temmen - Genezen @@ -3710,1067 +1489,823 @@ Kan ook worden gebruikt voor matige verlichting. Volg mij - - Eruit + + Uitgraven - - Leeg + + Voeden - - Zadel + + Temmen - + + Ander filter + + + Alles plaatsen + + + Eén plaatsen + + + Laten vallen + + + Alles pakken + + + De helft pakken + + Plaatsen - - Slaan + + Alles laten vallen - - Melken + + Werkbalk leegmaken - - Oppakken + + Wat is dit? - - Eten + + Delen op Facebook - - Slapen + + Eén laten vallen - - Ontwaken + + Verwisselen - - Spelen - - - Rijden - - - Varen - - - Kweken - - - Omhoog zwemmen - - - Openen - - - Andere toonhoogte - - - Laten ontploffen - - - Lezen - - - Hangen - - - Gooien - - - Planten - - - Bewerken - - - Oogsten - - - Doorgaan - - - Volledige game ontgrendelen - - - Opslagbestand verwijderen - - - Verwijderen - - - Opties - - - Vrienden uitnodigen - - - Accepteren - - - Knippen - - - Wereld uitsluiten - - - Skin selecteren - - - Aansteken - - - Navigeren - - - Volledige versie installeren - - - Testversie installeren - - - Installeren - - - Opnieuw installeren - - - Opties - - - Opdracht uitvoeren - - - Creatief - - - Ingrediënt verplaatsen - - - Brandstof verplaatsen - - - Gereedschap verplaatsen - - - Pantser verplaatsen - - - Wapen verplaatsen - - - In uitrusting - - - Spannen - - - Loslaten - - - Privileges - - - Afweren - - - Pagina omhoog - - - Pagina omlaag - - - Verliefd - - - Drinken - - - Draaien - - - Verbergen - - - Alle vakjes leegmaken - - - OK - - - Annuleren - - - Minecraft Store - - - Weet je zeker dat je de huidige game wilt verlaten om mee te doen met de nieuwe game? Niet opgeslagen voortgang gaat dan verloren. - - - Game afsluiten - - - Game opslaan - - - Afsluiten zonder opslaan - - - Weet je zeker dat je eventuele opslagbestanden voor deze wereld wilt overschrijven met de huidige versie van deze wereld? - - - Weet je zeker dat je wilt afsluiten zonder op te slaan? Je raakt al je voortgang kwijt in deze wereld! - - - Game starten - - - Beschadigd opslagbestand - - - Dit opslagbestand is beschadigd. Wil je het verwijderen? - - - 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. - - - Afsluiten en opslaan - - - Afsluiten zonder opslaan - - - Weet je zeker dat je naar het hoofdmenu wilt gaan? Niet opgeslagen voortgang gaat verloren. - - - Weet je zeker dat je naar het hoofdmenu wilt gaan? Je voortgang gaat dan verloren. - - - Nieuwe wereld maken - - - Speluitleg spelen - - - Speluitleg - - - Naam van je wereld - - - Geef je wereld een naam - - - Voer de basis van je wereld in - - - Opgeslagen wereld laden - - - Druk START om mee te doen - - - De game wordt afgesloten - - - Er is een fout opgetreden. Terug naar het hoofdmenu. - - - Verbinding mislukt - - - Verbinding verbroken - - - Verbinding met de server is verbroken. Terug naar het hoofdmenu. - - - Verbinding verbroken door de server - - - Je bent uit de game verwijderd - - - Je bent uit de game verwijderd omdat je vloog - - - Verbinding maken duurde te lang - - - De server is vol - - - De host heeft de game verlaten. - - - Je kunt niet meedoen met deze game omdat niemand in de game een vriend van je is. - - - Je kunt niet meedoen met deze game omdat je al een keer bent verwijderd door de host. - - - Je kunt niet meedoen met deze game omdat de andere speler een oudere versie van de game heeft. - - - Je kunt niet meedoen met deze game omdat de andere speler een nieuwere versie van de game heeft. - - - Nieuwe wereld - - - 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: - - - Vrienden - - - Mijn score - - - Algemeen - - - Aantal: - - - Positie - - - Opslaan wereld voorbereiden - - - Segmenten samenstellen... - - - Afwerken... - - - Terrein aanleggen - - - De wereld simuleren - - - Server activeren - - - Terugkeerlocatie genereren - - - Terugkeerlocatie laden - - - Naar de Onderwereld - - - De Onderwereld verlaten - - - Terugkeren - - - Wereld genereren - - - Wereld laden - - - Spelers opslaan - - - Verbinden met host - - - Terrein downloaden - - - Naar offline game - - - Wacht tot de host de game heeft opgeslagen - - - Naar het Einde - - - Het Einde verlaten - - - Dit bed is bezet - - - Je kunt alleen 's nachts slapen - - - %s slaapt in een bed. Om het meteen dag te laten worden, moeten alle spelers tegelijkertijd in hun bed slapen. - - - Het bed in je huis ontbreekt of is geblokkeerd - - - Je kunt nu niet rusten. Er zijn monsters in de buurt - - - Je slaapt in een bed. Om het meteen dag te laten worden, moeten alle spelers tegelijkertijd in hun bed slapen. - - - Gereedschap en wapens - - - Wapens - - - Voedsel - - - Bouwmaterialen - - - Pantser - - - Mechanismen - - - Vervoer - - - Decoraties - - - Bouwblokken - - - Roodsteen en transport - - - Diversen - - - Brouwen - - - Gereedschap, wapens en pantser - - - Materialen - - - Afgemeld - - - Moeilijkheid - - - Muziek - - - Geluid - - - Gamma - - - Gevoeligheid game - - - Gevoeligheid interface - - - Vredig - - - Makkelijk - - - Normaal - - - Moeilijk - - - Je wordt vanzelf weer gezond en er zijn geen vijanden in de omgeving. - - - Er verschijnen vijanden in de omgeving, maar ze richten minder schade aan dan op het niveau Normaal. - - - Er verschijnen vijanden in de omgeving die een normale hoeveelheid schade aanrichten. - - - 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! - - - Testversie verlopen - - - Game vol - - - Aansluiten bij de game is mislukt omdat er geen ruimte meer is - - - Tekst invoeren op bord - - - Voer een tekstregel in voor je bord - - - Titel invoeren - - - Voer een titel in voor je bericht - - - Bijschrift toevoegen - - - Voer een bijschrift in voor je bericht - - - Beschrijving invoeren - - - Voer een beschrijving in voor je bericht - - - Inventaris - - - Ingrediënten - - - Brouwrek - - - Kist - - - Betoveren - - - Oven - - - Ingrediënt - - - Brandstof - - - Automaat - - - Er is op dit moment geen downloadbare content van dit type beschikbaar voor deze titel. - - - %s doet mee met de game. - - - %s heeft de game verlaten. - - - %s is verwijderd uit de game. - - - Weet je zeker dat je dit opslagbestand wilt verwijderen? - - - Wachten op goedkeuring - - - Gecensureerd - - - Huidig nummer: - - - Standaardinstellingen herstellen - - - Weet je zeker dat je de standaardinstellingen wilt herstellen? - - - Fout tijdens het laden - - - Game van %s - - - Game van onbekende host - - - Gast afgemeld - - - Een gastspeler heeft zich afgemeld, waardoor alle gastspelers uit de game zijn verwijderd. - - - Aanmelden - - - Je bent niet aangemeld. Om deze game te kunnen spelen, moet je zijn aangemeld. Wil je je nu aanmelden? - - - Multiplayer niet toegestaan - - - Game maken mislukt - - - Automatisch geselecteerd - - - Geen pakket: Standaardskins - - - Favoriete skins - - - Uitgesloten wereld - - - 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. - - - Deze wereld uitsluiten? - - - 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. - - - Verwijderen van lijst met uitgesloten werelden - - - Interval automatisch opslaan - - - Interval automatisch opslaan: UIT - - - min. - - - Dit kan hier niet geplaatst worden! - - - Je mag geen lava in de buurt van een terugkeerlocatie plaatsen, omdat verschijnende spelers anders direct doodgaan. - - - Doorzichtigheid interface - - - Automatisch opslaan wereld voorbereiden - - - Formaat Scherminfo - - - Formaat Scherminfo (gedeeld scherm) - - - Basis - - - Skinpakket ontgrendelen - - - Om de geselecteerde skin te kunnen gebruiken, moet je dit skinpakket ontgrendelen. -Wil je dit skinpakket nu ontgrendelen? - - - Texturepakket ontgrendelen - - - Om dit texturepakket te kunnen gebruiken voor je wereld, moet je het ontgrendelen. -Wil je het nu ontgrendelen? - - - Testversie texturepakket - - - 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? - - - Texturepakket niet aanwezig - - - Volledige versie ontgrendelen - - - Testversie downloaden - - - Volledige versie downloaden - - - Deze wereld gebruikt een combinatiepakket of texturepakket dat je niet hebt! -Wil je het combinatiepakket of texturepakket nu installeren? - - - Testversie downloaden - - - Volledige versie downloaden - - - Speler verwijderen - - - Weet je zeker dat je deze speler uit de game wilt verwijderen? De speler kan pas weer meedoen als je de wereld opnieuw start. - - - Gamerafbeelding-pakketten - - - Thema's - - - Skinpakketten - - - Vrienden van vrienden toestaan - - - Je kunt niet meedoen met deze game omdat alleen vrienden van de host mogen meedoen. - - - Je kunt niet meedoen - - - Geselecteerd - - - Geselecteerde skin: - - - Downloadbare content beschadigd - - - 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. - - - 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. - - - Je speltype is veranderd - - - Je wereld hernoemen - - - Voer de nieuwe naam in voor je wereld - - - Speltype: Survival - - - Speltype: Creatief - - - Survival - - - Creatief - - - Gemaakt in het speltype Survival - - - Gemaakt in het speltype Creatief - - - Wolken renderen - - - Wat wil je doen met dit opslagbestand? - - - Opslagbestand hernoemen - - - Automatisch opslaan over %d... - - - Aan - - - Uit - - - Normaal - - - Supervlak - - - Als deze optie is ingeschakeld zal het een online spel worden. - - - Als deze optie is ingeschakeld, mogen alleen uitgenodigde spelers meedoen. - - - Als deze optie is ingeschakeld, mogen vrienden van spelers op je Vriendenlijst meedoen. - - - Als deze optie is ingeschakeld, kunnen spelers andere spelers verwonden. Alleen voor het speltype Survival. - - - Als deze optie is uitgeschakeld, mogen andere spelers pas na toestemming bouwen of uitgraven. - - - Als deze optie is ingeschakeld, kan vuur overslaan naar brandbare blokken in de buurt. - - - Als deze optie is ingeschakeld, ontploft TNT als het wordt geactiveerd. - - - Als deze optie is ingeschakeld, wordt de Onderwereld opnieuw gegenereerd. Dit is handig als je een ouder opslagbestand zonder Onderwereld-forten hebt. - - - Als deze optie is ingeschakeld, worden bouwwerken als dorpen en vestingen gegenereerd in de wereld. - - - Als deze optie is ingeschakeld, wordt een volledig vlakke Bovenwereld en Onderwereld gegenereerd. - - - Als deze optie is ingeschakeld, staat er een kist met handige voorwerpen bij de terugkeerlocatie van de speler. + + Snel plaatsen Skinpakketten - - Thema's + + Rood raam - - Gamerafbeeldingen + + Groen raam - - Avatarvoorwerpen + + Bruin raam - - Texturepakketten + + Wit glas - - Combinatiepakketten + + Gekleurd raam - - {*PLAYER*} is verteerd door het vuur + + Zwart raam - - {*PLAYER*} brandde dood + + Blauw raam - - {*PLAYER*} wilde zwemmen in de lava + + Grijs raam - - {*PLAYER*} stikte in een muur + + Roze raam - - {*PLAYER*} verdronk + + Lichtgroen raam - - {*PLAYER*} verhongerde + + Paars raam - - {*PLAYER*} is doodgeprikt + + Cyaanblauw raam - - {*PLAYER*} kwam te hard neer + + Lichtgrijs raam - - {*PLAYER*} viel uit de wereld + + Oranje glas - - {*PLAYER*} is dood + + Blauw glas - - {*PLAYER*} werd opgeblazen + + Paars glas - - {*PLAYER*} werd gedood door magische krachten + + Cyaanblauw glas - - {*PLAYER*} werd gedood door de adem van de Einder-draak + + Rood glas - - {*PLAYER*} werd gedood door {*SOURCE*} + + Groen glas - - {*PLAYER*} werd gedood door {*SOURCE*} + + Bruin glas - - {*PLAYER*} is doodgeschoten door {*SOURCE*} + + Lichtgrijs glas - - {*PLAYER*} werd gedood door een vuurbal van {*SOURCE*} + + Geel glas - - {*PLAYER*} is doodgeslagen door {*SOURCE*} + + Lichtblauw glas - - {*PLAYER*} is gedood door {*SOURCE*} + + Magenta glas - - Grondsteenmist + + Grijs glas - - Scherminfo weergeven + + Roze glas - - Hand weergeven + + Lichtgroen glas - - Doodsmeldingen + + Geel raam - - Geanimeerd personage + + Lichtgrijs - - Passende skinanimatie + + Grijs - - Je kunt geen voorwerpen meer uitgraven of gebruiken + + Roze - - Je kunt nu voorwerpen uitgraven en gebruiken + + Blauw - - Je kunt geen blokken meer plaatsen + + Paars - - Je kunt nu blokken plaatsen + + Cyaankleurig - - Je kunt nu deuren en schakelaars gebruiken + + Lichtgroen - - Je kunt geen deuren en schakelaars meer gebruiken + + Oranje - - Je kunt nu houders (zoals kisten) gebruiken + + Wit - - Je kunt geen houders (zoals kisten) meer gebruiken + + Aangepast - - Je kunt geen mobs meer aanvallen + + Geel - - Je kunt nu mobs aanvallen + + Lichtblauw - - Je kunt geen spelers meer aanvallen + + Magenta - - Je kunt nu spelers aanvallen + + Bruin - - Je kunt geen dieren meer aanvallen + + Wit raam - - Je kunt nu dieren aanvallen + + Kleine bal - - Je bent nu een moderator + + Grote bal - - Je bent geen moderator meer + + Lichtblauw raam - - Je kunt nu vliegen + + Magenta raam - - Je kunt niet meer vliegen + + Oranje raam - - Je kunt niet langer uitgeput raken + + Stervormig - - Je kunt nu uitgeput raken + + Zwart - - Je bent nu onzichtbaar + + Rood - - Je bent niet langer onzichtbaar + + Groen - - Je bent nu onkwetsbaar + + Creeper-vormig - - Je bent niet langer onkwetsbaar + + Ontploffing - - %d MSP + + Onbekende vorm - - Einder-draak + + Zwart glas - - %s is nu in het Einde + + IJzeren paardenharnas - - %s heeft het Einde verlaten + + Gouden paardenharnas - + + Diamanten paardenharnas + + + Roodsteenvergelijker + + + Mijnwagen met TNT + + + Mijnwagen met hopper + + + Riem + + + Baken + + + Opgeladen kist + + + Verzwaarde drukplaat (licht) + + + Naamplaatje + + + Houten planken (elk type) + + + Opdrachtblok + + + Vuurwerk-ster + + + Deze dieren kun je temmen en vervolgens berijden. Je kunt er een kist aan bevestigen. + + + Muilezel + + + Worden geboren als een paard en een ezel paren. Deze dieren kun je temmen en vervolgens berijden. Ook kunnen ze kisten dragen. + + + Paard + + + Deze dieren kun je temmen en vervolgens berijden. + + + Ezel + + + Zombiepaard + + + Lege kaart + + + Onderwereld-ster + + + Vuurpijl + + + Skeletpaard + + + Wither + + + Deze worden gemaakt van Wither-schedels en drijfzand. Ze schieten exploderende schedels op je af. + + + Verzwaarde drukplaat (zwaar) + + + Lichtgrijze klei + + + Grijze klei + + + Roze klei + + + Blauwe klei + + + Paarse klei + + + Cyaanblauwe klei + + + Lichtgroene klei + + + Oranje klei + + + Witte klei + + + Gekleurd glas + + + Gele klei + + + Lichtblauwe klei + + + Magenta klei + + + Bruine klei + + + Hopper + + + Activeringsrails + + + Dropper + + + Roodsteenvergelijker + + + Daglichtsensor + + + Roodsteenblok + + + Gekleurde klei + + + Zwarte klei + + + Rode klei + + + Groene klei + + + Hooibaal + + + Geharde klei + + + Steenkoolblok + + + Vervagen tot + + + 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. + + + Als deze optie is ingeschakeld, behouden spelers hun inventaris als ze doodgaan. + + + Als deze optie is uitgeschakeld, spawnen mobs niet automatisch. + + + Speltype: Avontuur + + + Avontuur + + + Voer een basis in om hetzelfde terrein nogmaals te genereren. Laat leeg voor een willekeurige wereld. + + + Als deze optie is uitgeschakeld, laten monsters en dieren geen buit achter (Creepers laten bijvoorbeeld geen buskruit achter). + + + {*PLAYER*} viel van een ladder + + + {*PLAYER*} is van klimplanten gevallen + + + {*PLAYER*} viel uit het water + + + Als deze optie is uitgeschakeld, laten blokken geen voorwerpen achter als ze worden vernietigd (stenen blokken laten bijvoorbeeld geen keien achter). + + + Als deze optie is uitgeschakeld, wordt de gezondheid van spelers niet vanzelf hersteld. + + + Als deze optie is uitgeschakeld, zijn er geen wisselende dagdelen. + + + Mijnwagen + + + Vastmaken + + + Loslaten + + + Bevestigen + + + Afstijgen + + + Kist bevestigen + + + Lanceren + + + Naam + + + Baken + + + Primaire kracht + + + Secundaire kracht + + + Paard + + + Dropper + + + Hopper + + + {*PLAYER*} viel van grote hoogte + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal vleermuizen in deze wereld. + + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende paarden. + + + Game-opties + + + {*PLAYER*} werd gedood door een vuurbal van {*SOURCE*} met een {*ITEM*} + + + {*PLAYER*} is doodgeslagen door {*SOURCE*} met een {*ITEM*} + + + {*PLAYER*} is gedood door {*SOURCE*} met een {*ITEM*} + + + Omgevingsinvloed mobs + + + Voorwerpen van blokken + + + Automatische regeneratie + + + Daglichtcyclus + + + Inventaris behouden + + + Spawnen van mobs + + + Buit van mobs + + + {*PLAYER*} is doodgeschoten door {*SOURCE*} met een {*ITEM*} + + + {*PLAYER*} viel te diep en werd gedood door {*SOURCE*} + + + {*PLAYER*} viel te diep en werd gedood door {*SOURCE*} met een {*ITEM*} + + + {*PLAYER*} kwam in vuur terecht tijdens het gevecht tegen {*SOURCE*} + + + {*SOURCE*} liet {*PLAYER*} vallen + + + {*SOURCE*} liet {*PLAYER*} vallen + + + {*SOURCE*} heeft {*PLAYER*} laten vallen door een {*ITEM*} + + + {*PLAYER*} verbrandde tijdens het gevecht tegen {*SOURCE*} + + + {*PLAYER*} is opgeblazen door {*SOURCE*} + + + {*PLAYER*} is gedood door de Wither + + + {*PLAYER*} is gedood door {*SOURCE*} met een {*ITEM*} + + + {*PLAYER*} probeerde in lava te zwemmen om te ontsnappen aan {*SOURCE*} + + + {*PLAYER*} verdronk in een poging om te ontsnappen aan {*SOURCE*} + + + {*PLAYER*} liep tegen een cactus aan in een poging om te ontsnappen aan {*SOURCE*} + + + Bestijgen + + -{*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*} +Om een paard te besturen, moet je het uitrusten met een zadel. Dit kun je kopen van dorpelingen of vinden in verborgen kisten. + + + +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. + + + +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. + + + +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. + + + +Als ze zijn getemd, verschijnen er hartjes om hen heen en zullen ze niet langer proberen om je van hun rug te gooien. + + + +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*}. + + + +Hier kun je proberen om paarden en ezels te temmen. Ook vind je er kisten met zadels, paardenharnassen en andere handige voorwerpen voor paarden. + + + +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. + + + +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. + + + Op de top van deze piramide vind je een inactief baken. + + + +Dit is de baken-interface, waar je de krachten kiest die je baken afgeeft. + + + +{*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. + + + +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. + + + +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. + + + +Dit is de inventaris-interface van het paard. + + + +{*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. + + + +In de inventaris van het paard kun je voorwerpen geven aan je paard, ezel of muilezel, of ze hiermee uitrusten. + + + Fonkeling + + + Spoor + + + Duur vlucht: + + + +Zadel je paard op door een zadel in het zadelvakje te plaatsen. Je kunt paarden bepantseren door een paardenharnas te plaatsen in het pantservakje. + + + Je hebt een muilezel gevonden. + + + + {*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. + + + +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. + + + +Je kunt in dit menu ook voorwerpen uitwisselen tussen je eigen inventaris en de zadeltassen die zijn bevestigd aan ezels en muilezels. + + + Je hebt een paard gevonden. + + + Je hebt een ezel gevonden. + + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over bakens. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over bakens. + + + +Je produceert vuurwerk-sterren door buskruit en kleurstof in het productieraster te plaatsen. + + + +De kleurstof bepaalt de kleur van de exploderende vuurwerk-ster. + + + Je bepaalt de vorm van de vuurwerk-ster door er een vuurbal, goudklomp, veer of mobhoofd aan toe te voegen. + + + +Eventueel kun je meerdere vuurwerk-sterren in het productieraster toevoegen aan je vuurwerk. + + + +Hoe meer vakjes je in het productieraster vult met buskruit, des te hoger zullen de vuurwerk-sterren exploderen. + + + Haal het vuurwerk uit het resultaatvakje als je het wilt produceren. + + + +Je kunt een spoor of een fonkeling toevoegen door diamanten of gloeisteenstof te gebruiken. + + + +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. + + + +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. + + + +Maak eens wat vuurwerk bij de werkbank met de ingrediënten die je vindt in de kisten. + + + +Nadat je een vuurwerk-ster hebt geproduceerd, kun je de uitdovingskleur bepalen door er kleurstof aan toe te voegen. + + + +In deze kisten vind je verschillende voorwerpen die je nodig hebt om VUURWERK te maken! + + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over vuurwerk. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over vuurwerk. + + + +Om vuurwerk te produceren, plaats je buskruit en papier in het productieraster van 3x3 boven je inventaris. + + + In deze ruimte vind je hoppers + + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over hoppers. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over hoppers. + + + Hoppers worden gebruikt om voorwerpen in en uit containers te plaatsen en om voorwerpen die er naartoe worden gegooid automatisch op te vangen. + + + +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. + + + +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. + + + +Stel het baken nu in met de krachten die hij moet afgeven. Je kunt betalen met de ijzerstaven. + + + +Ze kunnen worden gebruikt met brouwrekken, kisten, automaten, droppers, mijnwagens met kisten, mijnwagens met hoppers en andere hoppers. + + + +In deze ruimte vind je diverse handige hopper-configuraties waarmee je kunt experimenteren. + + + +Dit is de vuurwerk-interface, waarmee je vuurwerk en vuurwerk-sterren kunt produceren. + + + +{*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. + + + 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. + + + +Als een hopper echter wordt aangedreven door roodsteen, wordt hij inactief en zal hij niet langer voorwerpen opzuigen of plaatsen. + + + +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. + + + 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. + + + Je hebt al het maximale aantal schilderijen/voorwerplijsten in deze wereld. + + + Je kunt geen vijanden spawnen als je speelt op het niveaus Vredig. + + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende varkens, schapen, koeien, katten en paarden. + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal inktvissen in deze wereld. + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal vijanden in deze wereld. + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal dorpelingen in deze wereld. + + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende wolven. + + + Je hebt al het maximale aantal mobhoofden in deze wereld. + + + Kijken omkeren + + + Linkshandig + + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende kippen. + + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende zwamkoeien. + + + Je hebt al het maximale aantal boten in deze wereld. + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal kippen in deze wereld. @@ -4822,9 +2357,62 @@ Wil je het combinatiepakket of texturepakket nu installeren? Onderwereld resetten + + %s is nu in het Einde + + + %s heeft het Einde verlaten + + + +{*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*} + 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! + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal varkens, schapen, koeien, katten en paarden. + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal zwamkoeien. + + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal wolven in deze wereld. + Onderwereld resetten @@ -4832,113 +2420,11 @@ Wil je het combinatiepakket of texturepakket nu installeren? Onderwereld niet resetten - Je kunt deze zwamkoe nu niet scheren. Je hebt al het maximale aantal varkens, schapen, koeien en katten. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal varkens, schapen, koeien en katten. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal zwamkoeien. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal wolven in deze wereld. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal kippen in deze wereld. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal inktvissen in deze wereld. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal vijanden in deze wereld. - - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal dorpelingen in deze wereld. - - - Je hebt al het maximale aantal schilderijen/voorwerplijsten in deze wereld. - - - Je kunt geen vijanden spawnen als je speelt op het niveaus Vredig. - - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende varkens, schapen, koeien en katten. - - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende wolven. - - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende kippen. - - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende zwamkoeien. - - - Je hebt al het maximale aantal boten in deze wereld. - - - Je hebt al het maximale aantal mobhoofden in deze wereld. - - - Kijken omkeren - - - Linkshandig + Je kunt deze zwamkoe nu niet scheren. Je hebt al het maximale aantal varkens, schapen, koeien, katten en paarden. Je bent dood! - - Terugkeren - - - Beschikbare downloadbare content - - - Andere skin - - - Instructies - - - Besturing - - - Instellingen - - - Credits - - - Content opnieuw installeren - - - Debug-instellingen - - - Overslaande branden - - - TNT-explosies - - - Speler tegen speler - - - Spelers vertrouwen - - - Privileges host - - - Bouwwerken genereren - - - Supervlakke wereld - - - Bonuskist - Wereldopties @@ -4948,17 +2434,17 @@ Wil je het combinatiepakket of texturepakket nu installeren? Kan deuren en schakelaars gebruiken + + Bouwwerken genereren + + + Supervlakke wereld + + + Bonuskist + - Kan houders openen - - - Kan spelers aanvallen - - - Kan dieren aanvallen - - - Moderator + Kan containers openen Speler verwijderen @@ -4969,185 +2455,303 @@ Wil je het combinatiepakket of texturepakket nu installeren? Uitputting uitschakelen + + Kan spelers aanvallen + + + Kan dieren aanvallen + + + Moderator + + + Privileges host + + + Instructies + + + Besturing + + + Instellingen + + + Terugkeren + + + Beschikbare downloadbare content + + + Andere skin + + + Credits + + + TNT-explosies + + + Speler tegen speler + + + Spelers vertrouwen + + + Content opnieuw installeren + + + Debug-instellingen + + + Overslaande branden + + + Einder-draak + + + {*PLAYER*} werd gedood door de adem van de Einder-draak + + + {*PLAYER*} werd gedood door {*SOURCE*} + + + {*PLAYER*} werd gedood door {*SOURCE*} + + + {*PLAYER*} is dood + + + {*PLAYER*} werd opgeblazen + + + {*PLAYER*} werd gedood door magische krachten + + + {*PLAYER*} is doodgeschoten door {*SOURCE*} + + + Grondsteenmist + + + Scherminfo weergeven + + + Hand weergeven + + + {*PLAYER*} werd gedood door een vuurbal van {*SOURCE*} + + + {*PLAYER*} is doodgeslagen door {*SOURCE*} + + + {*PLAYER*} is gedood door de magische krachten van {*SOURCE*} + + + {*PLAYER*} viel uit de wereld + + + Texturepakketten + + + Combinatiepakketten + + + {*PLAYER*} is verteerd door het vuur + + + Thema's + + + Gamerafbeeldingen + + + Avatarvoorwerpen + + + {*PLAYER*} brandde dood + + + {*PLAYER*} verhongerde + + + {*PLAYER*} is doodgeprikt + + + {*PLAYER*} kwam te hard neer + + + {*PLAYER*} wilde zwemmen in de lava + + + {*PLAYER*} stikte in een muur + + + {*PLAYER*} verdronk + + + Doodsmeldingen + + + Je bent geen moderator meer + + + Je kunt nu vliegen + + + Je kunt niet meer vliegen + + + Je kunt geen dieren meer aanvallen + + + Je kunt nu dieren aanvallen + + + Je bent nu een moderator + + + Je kunt niet langer uitgeput raken + + + Je bent nu onkwetsbaar + + + Je bent niet langer onkwetsbaar + + + %d MSP + + + Je kunt nu uitgeput raken + + + Je bent nu onzichtbaar + + + Je bent niet langer onzichtbaar + + + Je kunt nu spelers aanvallen + + + Je kunt nu voorwerpen uitgraven en gebruiken + + + Je kunt geen blokken meer plaatsen + + + Je kunt nu blokken plaatsen + + + Geanimeerd personage + + + Passende skinanimatie + + + Je kunt geen voorwerpen meer uitgraven of gebruiken + + + Je kunt nu deuren en schakelaars gebruiken + + + Je kunt geen mobs meer aanvallen + + + Je kunt nu mobs aanvallen + + + Je kunt geen spelers meer aanvallen + + + Je kunt geen deuren en schakelaars meer gebruiken + + + Je kunt nu containers (zoals kisten) gebruiken + + + Je kunt geen containers (zoals kisten) meer gebruiken + Onzichtbaar - - Host-opties + + Bakens - - Spelers/uitnodigen + + {*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*} - - Online game + + Vuurwerk - - Alleen op uitnodiging + + Talen - - Meer opties + + Paarden - - Laden + + {*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*} - - Nieuwe wereld + + {*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. - - Naam wereld + + {*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. - - Basis voor nieuwe wereld + + 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. - - Leeg laten voor een willekeurige basis + + Wordt achtergelaten door de Wither, wordt gebruikt voor het produceren van bakens. - - Spelers + + Hoppers - - Meedoen aan game + + {*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*} - - Game starten + + Droppers - - Geen games gevonden - - - Game spelen - - - Klassementen - - - Hulp en opties - - - Volledige game kopen - - - Game hervatten - - - Game opslaan - - - Moeilijkheid: - - - Speltype: - - - Bouwmaterialen: - - - Type wereld: - - - Speler tegen Speler: - - - Spelers vertrouwen: - - - TNT: - - - Overslaande branden: - - - Thema opnieuw installeren - - - Gamerafbeelding 1 opnieuw installeren - - - Gamerafbeelding 2 opnieuw installeren - - - Avatarvoorwerp 1 opnieuw installeren - - - Avatarvoorwerp 2 opnieuw installeren - - - Avatarvoorwerp 3 opnieuw installeren - - - Opties - - - Geluid - - - Gevoeligheid - - - Graphics - - - Gebruikersinterface - - - Resetten - - - Camerabeweging - - - Hints - - - Tooltips in de game - - - 2 spelers op verticaal gedeeld scherm - - - Klaar - - - Tekst bord wijzigen: - - - Voer de informatie over je screenshot in - - - Bijschrift - - - Screenshot uit het spel - - - Tekst bord wijzigen: - - - De klassieke textures, pictogrammen en gebruikersinterface van Minecraft! - - - Alle combinatiewerelden weergeven - - - Geen effect - - - Snelheid - - - Vertraging - - - Sneller graven - - - Trager graven - - - Kracht - - - Verzwakking + + NIET GEBRUIKT Directe genezing @@ -5158,62 +2762,3318 @@ Wil je het combinatiepakket of texturepakket nu installeren? Sprongkracht + + Trager graven + + + Kracht + + + Verzwakking + Misselijkheid + + NIET GEBRUIKT + + + NIET GEBRUIKT + + + NIET GEBRUIKT + Regeneratie Weerstand - - Vuurbestendigheid + + Basis voor nieuwe wereld zoeken - - Onder water ademen + + 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. - - Onzichtbaarheid + + Een soort rails die mijnwagens met hoppers kunnen activeren en deactiveren, en mijnwagens met TNT kunnen detoneren. - - Blindheid + + Wordt gebruikt om voorwerpen te bewaren of te laten vallen, of om voorwerpen in een andere container te duwen als ze een roodsteenlading krijgen. - - Nachtzicht + + Kleurrijke blokken die worden geproduceerd door geharde klei te kleuren. - - Honger + + Genereert een roodsteenlading. De lading is sterker als je meerdere voorwerpen op de plaat legt. Vereist meer gewicht dan de lichte plaat. + + + Wordt gebruikt als energiebron voor roodsteen. Kan weer worden omgezet in roodsteen. + + + Wordt gebruikt om voorwerpen te vangen of om voorwerpen in en uit containers te transporteren. + + + Kan worden gevoerd aan paarden, ezels of muilezels voor het aanvullen van maximaal 10 hartjes. Versnelt de groei van veulens. + + + Vleermuis + + + Deze vliegende wezens vind je in grotten en andere grote afgesloten ruimten. + + + Heks + + + Wordt gemaakt door klei te smelten in een oven. + + + Wordt gemaakt van glas en een kleurstof. + + + Wordt gemaakt van gekleurd glas + + + Genereert een roodsteenlading. De lading is sterker als je meerdere voorwerpen op de plaat legt. + + + Een blok dat een roodsteensignaal afgeeft dat wordt gegenereerd door zonlicht (of juist door een gebrek hieraan). + + + Een speciaal soort mijnwagen die op dezelfde manier functioneert als de hopper. Hij verzamelt voorwerpen op de rails en uit containers erboven. + + + Een speciaal soort pantser waarmee een paard kan worden uitgerust. Geeft 5 pantser. + + + Wordt gebruikt om kleuren, effecten en vormen van vuurwerk te bepalen. + + + Wordt gebruikt in roodsteencircuits voor het onderhouden, vergelijken of verminderen van de signaalsterkte, of voor het bepalen van de status van blokken. + + + Een soort mijnwagen die functioneert als een bewegend TNT-blok. + + + Een speciaal soort pantser waarmee een paard kan worden uitgerust. Geeft 7 pantser. + + + Wordt gebruikt voor het uitvoeren van opdrachten. + + + Projecteert een lichtstraal in de lucht en heeft statuseffecten op spelers in de buurt. + + + 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. + + + Een speciaal soort pantser waarmee een paard kan worden uitgerust. Geeft 11 pantser. + + + Wordt gebruikt om mobs door de speler te laten leiden of aan hekken vast te binden. + + + Wordt gebruikt om mobs in de wereld een naam te geven. + + + Sneller graven + + + Volledige game kopen + + + Game hervatten + + + Game opslaan + + + Game spelen + + + Klassementen + + + Hulp en opties + + + Moeilijkheid: + + + Speler tegen Speler: + + + Spelers vertrouwen: + + + TNT: + + + Speltype: + + + Bouwmaterialen: + + + Type wereld: + + + Geen games gevonden + + + Alleen op uitnodiging + + + Meer opties + + + Laden + + + Host-opties + + + Spelers/uitnodigen + + + Online game + + + Nieuwe wereld + + + Spelers + + + Meedoen aan game + + + Game starten + + + Naam wereld + + + Basis voor nieuwe wereld + + + Leeg laten voor een willekeurige basis + + + 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 + + + Dit is een grote zwarte draak, die je aantreft in het Einde. + + + Blaze + + + Deze vijanden tref je aan in de Onderwereld, meestal in Onderwereld-forten. Ze laten Blaze-staven achter als ze worden gedood. + + + Sneeuwgolem + + + Je kunt sneeuwgolems maken van sneeuwblokken en pompoenen. Vervolgens gooien ze sneeuwballen naar je vijanden. + + + Einder-draak + + + Magmakubus + + + 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. + + + IJzergolem + + + IJzergolems verdedigen dorpen. Je kunt ze maken met ijzerblokken en pompoenen. + + + Magmakubussen komen voor in de Onderwereld. Net als slijmkubussen splitsen ze zich op in kleinere kubussen als ze worden geraakt. + + + Dorpeling + + + Ocelot + + + Door deze rond een tovertafel te plaatsen, kun je krachtigere betoveringen maken. + + + {*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. + + + + {*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. + + + + {*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. + + + {*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. + + + + {*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. + + + + {*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? + + + Niemand bij Mojang heeft junkboy ooit gezien. + + + Weet je dat er ook een Minecraft-wiki is? + + + Kijk niet direct naar de bugs. + + + Creepers zijn het resultaat van een programmeerfout. + + + Is het een kip of een eend? + + + Het nieuwe kantoor van Mojang is cool! + + + {*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. + + + {*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*}. + + + {*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. + + + Minecon 2013 vond plaats in Orlando, Florida. + + + .party() was geweldig! + + + Ga er altijd vanuit dat geruchten niet kloppen en neem ze nooit zomaar voor waar aan. + + + Vorige pagina + + + Handelen + + + Aambeeld + + + Het Einde + + + Werelden uitsluiten + + + Speltype Creatief + + + Opties voor host en spelers + + + {*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. + + + {*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*} + + + + Richt meer schade aan dan je vuisten. + + + 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. + + + Sprinten + + + Nieuwe functies + + + {*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*} + + + + Screenshots delen + + + Kisten + + + Produceren + + + Oven + + + De basis + + + Scherminfo + + + Inventaris + + + Automaat + + + Betoveren + + + Onderwereld-portaal + + + Multiplayer + + + Dieren houden + + + Veeteelt + + + Brouwen + + + deadmau5 houdt van Minecraft! + + + Bigmensen vallen je alleen aan als jij ze eerst aanvalt. + + + Je kunt de terugkeerlocatie van je game veranderen en het meteen ochtend laten worden door te gaan slapen in een bed. + + + Sla die vuurballen terug naar de Ghast! + + + Maak wat fakkels om 's nachts de omgeving te verlichten. Monsters blijven uit de buurt van fakkels. + + + Bereik je bestemming sneller met een mijnwagen en rails. + + + Als je jonge boompjes plant, groeien ze uit tot grote bomen. + + + Door een portaal te bouwen, reis je naar een andere dimensie: de Onderwereld. + + + Recht naar beneden of naar boven graven is geen goed idee. + + + Bottenmeel wordt gemaakt van skelettenbotten en kan worden gebruikt als mest om gewassen meteen te laten groeien. + + + Creepers exploderen als ze bij je in de buurt komen! + + + Druk op{*CONTROLLER_VK_B*} om het voorwerp dat je in je hand hebt te laten vallen. + + + Gebruik voor elke klus het juiste gereedschap. + + + Als je geen kolen kunt vinden voor je fakkels, kun je in een oven altijd houtskool maken van bomen. + + + Gebraden varkensvlees geeft je meer gezondheid dan rauw varkensvlees. + + + Als je de moeilijkheid instelt op Vredig, wordt je gezondheid automatisch hersteld en verschijnen er 's nachts geen monsters! + + + Voer een bot aan een wolf om hem te temmen. Je kunt de wolf dan laten zitten of laten volgen. + + + Vanuit het inventarismenu kun je voorwerpen laten vallen door de aanwijzer naast het menu te plaatsen en op{*CONTROLLER_VK_A*} te drukken. + + + Er is nieuwe downloadbare content beschikbaar! Ga via het hoofdmenu naar de Minecraft Store. + + + 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. + + + Pas de gamma-instellingen aan om de game lichter of donkerder te maken. + + + Door 's nachts in een bed te slapen, wordt het meteen ochtend. In een multiplayergame moeten alle spelers tegelijk in hun bed liggen. + + + Gebruik een schoffel om grond voor te bereiden op landbouw. + + + Spinnen vallen je overdag niet aan, tenzij je hen zelf aanvalt. + + + In aarde of zand graven, gaat sneller met een schop dan met de hand! + + + Maak vlees van varkens, kook het en eet het op om je gezondheid te herstellen. + + + Maak leer van koeien en gebruik het om pantser van te maken. + + + Als je een lege emmer hebt, kun je deze vullen met melk van een koe, met water of met lava! + + + Obsidiaan ontstaat als stromend water in contact komt met een lavablok. + + + Er zijn nu stapelbare hekken in de game! + + + Sommige dieren volgen je als je tarwe in je hand hebt. + + + Als dieren zich in elke richting niet meer dan 20 blokken kunnen verplaatsen, zullen ze nooit verdwijnen uit de wereld. + + + De gezondheid van tamme wolven kun je aflezen aan de stand van hun staart. Voer ze vlees om ze te genezen. + + + Kook een cactus in een oven om groene kleurstof te krijgen. + + + Lees het gedeelte 'Nieuwe functies' in het menu Instructies voor het laatste nieuws over updates voor de game. + + + Muziek van C418! + + + Wie is Notch? + + + Mojang heeft meer prijzen dan medewerkers. + + + Er zijn hele beroemde mensen die Minecraft spelen. + + + Notch heeft meer dan een miljoen volgers op Twitter! + + + Niet alle Zweden zijn blond. Jens van Mojang heeft zelfs rood haar! + + + Er komt nog wel een keer een update voor deze game. + + + Als je twee kisten naast elkaar zet, krijg je één grote kist. + + + Pas goed op als je in de open lucht iets van wol maakt, omdat wol kan verbranden door een blikseminslag tijdens een onweersbui. + + + Met één emmer lava kun je in een oven 100 blokken smelten. + + + Het instrument dat wordt gespeeld door een nootblok is afhankelijk van het materiaal eronder. + + + Het kan enkele minuten duren voordat de lava helemaal is verdwenen als het blok is verwijderd. + + + Keien zijn bestand tegen Ghast-vuurballen, waardoor ze zeer geschikt zijn om portalen te beschermen. + + + Blokken die je als lichtbron kunt gebruiken, kunnen ook sneeuw en ijs smelten. Denk daarbij aan fakkels, gloeisteen en pompoenlampionnen. + + + Zombies en Skeletten kunnen tegen daglicht als ze zich in het water bevinden. + + + Kippen leggen elke 5 tot 10 minuten een ei. + + + Obsidiaan kan alleen worden uitgegraven met een diamanten houweel. + + + Creepers zijn de gemakkelijkste manier om buskruit te verkrijgen. + + + Als je een wolf aanvalt, worden andere wolven in de directe omgeving agressief en vallen ze je aan. Ook zombie-bigmensen doen dit. + + + Wolven kunnen niet naar de Onderwereld. + + + Wolven vallen geen Creepers aan. + + + Dit heb je nodig om verschillende stenen blokken en erts uit te graven. + + + Wordt gebruikt in het taartrecept en als ingrediënt bij het brouwen van drankjes. + + + Wordt gebruikt om een elektrische lading aan of uit te zetten. Blijft aan of uit staan tot je de hendel weer gebruikt. + + + 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. + + + Herstelt 2{*ICON_SHANK_01*} en er kan een gouden appel van worden gemaakt. + + + Herstelt 2{*ICON_SHANK_01*} en herstelt 4 seconden lang je gezondheid. Wordt gemaakt van een appel en goudklompen. + + + Herstelt 2{*ICON_SHANK_01*}. Het kan je wel vergiftigen. + + + Wordt in roodsteencircuits gebruikt als versterker, delayer en/of diode. + + + Worden gebruikt als spoorweg voor mijnwagens. + + + Als deze rails stroom hebben, versnellen ze mijnwagens. Zonder stroom komen mijnwagens tot stilstand. + + + Werkt als een drukplaat (zendt een roodsteensignaal uit als het stroom heeft), maar kan alleen worden geactiveerd door een mijnwagen. + + + Druk hierop om een elektrische lading af te geven. Blijft ongeveer een seconde geactiveerd en gaat dan weer uit. + + + Bevat voorwerpen en werpt deze in willekeurige volgorde uit als de automaat een roodsteensignaal krijgt. + + + 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. + + + Herstelt 2,5{*ICON_SHANK_01*}. Wordt gemaakt door rauwe vis te bereiden in een oven. + + + Herstelt 1{*ICON_SHANK_01*}. + + + Herstelt 1{*ICON_SHANK_01*}. + + + Herstelt 3{*ICON_SHANK_01*}. + + + Wordt gebruikt als munitie voor bogen. + + + Herstelt 2,5{*ICON_SHANK_01*}. + + + Herstelt 1{*ICON_SHANK_01*}. Kan 6 keer worden gebruikt. + + + Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Het kan je wel vergiftigen. + + + Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. + + + Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door varkensvlees te bereiden in een oven. + + + Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Je kunt er een ocelot mee temmen. + + + Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door rauwe kip te bereiden in een oven. + + + Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. + + + Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door rauw rundvlees te bereiden in een oven. + + + Wordt gebruikt om jezelf, een dier of een monster over rails te vervoeren. + + + Wordt gebruikt als kleurstof voor lichtblauwe wol. + + + Wordt gebruikt als kleurstof voor cyaankleurige wol. + + + Wordt gebruikt als kleurstof voor paarse wol. + + + Wordt gebruikt als kleurstof voor lichtgroene wol. + + + Wordt gebruikt als kleurstof voor grijze wol. + + + 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.) + + + Wordt gebruikt als kleurstof voor magenta wol. + + + Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. + + + Wordt gebruikt om boeken en kaarten te maken. + + + Kan worden gebruikt voor het maken van boekenplanken en worden betoverd voor het maken van betoverde boeken. + + + Wordt gebruikt als kleurstof voor blauwe wol. + + + Speelt muziekplaten af. + + + Wordt gebruikt om zeer sterke gereedschappen, wapens en pantser te maken. + + + Wordt gebruikt als kleurstof voor oranje wol. + + + Wordt verkregen door een schaap te scheren en kan worden gekleurd met kleurstoffen. + + + Wordt gebruikt als bouwmateriaal en kan worden gekleurd met kleurstoffen. Dit recept is wat overbodig, omdat wol eenvoudig kan worden verkregen van een schaap. + + + Wordt gebruikt als kleurstof voor zwarte wol. + + + Wordt gebruikt om goederen over rails te vervoeren. + + + Verplaatst zich over rails en duwt andere mijnwagens als er steenkool in zit. + + + Hiermee kun je je sneller over het water verplaatsen dan door te zwemmen. + + + Wordt gebruikt als kleurstof voor groene wol. + + + Wordt gebruikt als kleurstof voor rode wol. + + + Wordt gebruikt om meteen gewassen, bomen, hoog gras, grote paddenstoelen en bloemen te laten ontstaan en kan worden gebruikt om kleurstoffen te maken. + + + Wordt gebruikt als kleurstof voor roze wol. + + + Wordt gebruikt als kleurstof voor bruine wol, als ingrediënt van koekjes of voor het kweken van cacaovruchten. + + + Wordt gebruikt als kleurstof voor zilveren wol. + + + Wordt gebruikt als kleurstof voor gele wol. + + + Hiermee kun je van afstand aanvallen door pijlen af te schieten. + + + Versterkt het pantser van de drager met 5. + + + Versterkt het pantser van de drager met 3. + + + Versterken het pantser van de drager met 1. + + + Versterkt het pantser van de drager met 5. + + + Versterken het pantser van de drager met 2. + + + Versterkt het pantser van de drager met 2. + + + Versterkt het pantser van de drager met 3. + + + Een glanzende staaf die kan worden gebruikt om gereedschappen van dit materiaal te produceren. Ontstaat door erts te smelten in een oven. + + + 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 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. + + + Versterkt het pantser van de drager met 8. + + + Versterkt het pantser van de drager met 6. + + + Versterken het pantser van de drager met 3. + + + Versterkt het pantser van de drager met 6. + + + IJzeren deuren kunnen alleen worden geopend met roodsteen, knoppen of schakelaars. + + + Versterkt het pantser van de drager met 1. + + + Versterkt het pantser van de drager met 3. + + + Hiermee kun je sneller dan met de hand houten blokken kappen. + + + Hiermee kun je aarde en grasblokken voorbewerken voor gewassen. + + + Je activeert houten deuren door ze te gebruiken, door op ze te slaan of met roodsteen. + + + Versterkt het pantser van de drager met 2. + + + Versterkt het pantser van de drager met 4. + + + Versterken het pantser van de drager met 1. + + + Versterkt het pantser van de drager met 2. + + + Versterken het pantser van de drager met 1. + + + Versterkt het pantser van de drager met 2. + + + Versterkt het pantser van de drager met 5. + + + Wordt gebruikt voor korte trappen. + + + Wordt gebruikt om paddenstoelenstoofpot in te doen. Als de stoofpot op is, mag je de kom houden. + + + Wordt gebruikt om water, lava en melk in te doen en te vervoeren. + + + Wordt gebruikt om water in te doen en te vervoeren. + + + Is voorzien van tekst die is ingevoerd door jou of een andere speler. + + + Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. + + + Wordt gebruikt om explosies te veroorzaken. Na plaatsing te activeren door aan te steken met een aansteker of een elektrische lading. + + + Wordt gebruikt om lava in te doen en te vervoeren. + + + Laat de posities van de zon en de maan zien. + + + Wijst je de weg naar je startpunt. + + + 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. + + + Wordt gebruikt om vuur te maken, TNT te laten ontploffen en een portaal te openen. + + + Wordt gebruikt om vis te vangen. + + + 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. + + + Worden gebruikt als bouwmateriaal waarmee je van alles kunt maken. Kan worden geproduceerd uit alle soorten hout. + + + Wordt gebruikt als bouwmateriaal. In tegenstelling tot gewoon zand is het niet gevoelig voor zwaartekracht. + + + Wordt gebruikt als bouwmateriaal. + + + Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + + Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok van dubbele platen. + + + Wordt gebruik om licht te maken. Met fakkels kun je ook sneeuw en ijs smelten. + + + Wordt gebruikt voor het produceren van fakkels, pijlen, borden, ladders en hekken, en als handgrepen van gereedschap en wapens. + + + 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. + + + 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. + + + Wordt gebruikt om verticaal te klimmen. + + + 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. + + + Hiermee kun je een grotere selectie voorwerpen produceren. + + + Hiermee kun je erts smelten, houtskool en glas maken en vis en varkensvlees bereiden. + + + IJzeren bijl + + + Roodsteenlamp + + + Tropenhouten trap + + + Berkenhouten trap + + + Huidige besturing + + + Schedel + + + Kokospalm + + + Sparrenhouten trap + + + Drakenei + + + Einde-steen + + + Einde-portaalblok + + + Zandstenen trap + + + Varen + + + Struik + + + Configuratie + + + Produceren + + + Gebruiken + + + Actie + + + Sluipen/Omlaag vliegen + + + Sluipen + + + Laten vallen + + + Voorwerp veranderen + + + Pauze + + + Rondkijken + + + Verplaatsen/rennen + + + Inventaris + + + Springen/Omhoog vliegen + + + Springen + + + Einde-portaal + + + Pompoenplant + + + Meloen + + + Raam + + + Poortje + + + Klimplanten + + + Meloenplant + + + IJzeren hek + + + Gebarsten blokstenen + + + Mossige blokstenen + + + Blokstenen + + + Paddenstoel + + + Paddenstoel + + + Gebeitelde blokstenen + + + Bakstenen trap + + + Onderwereld-wrat + + + Onderwereld-stenen trap + + + Onderwereld-stenen hek + + + Ketel + + + Brouwrek + + + Tovertafel + + + Onderwereld-steen + + + Zilverviskei + + + Zilvervissteen + + + Blokstenen trap + + + Plompenblad + + + Zwamvlok + + + Zilvervisbloksteen + + + Andere camera + + + 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. + + + 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. + + + In de inventaris worden voorwerpen opgenomen die je verzamelt en produceert.{*B*} + Druk op{*CONTROLLER_ACTION_INVENTORY*} om de inventaris te openen. + + + Je kunt planken produceren van het hout dat je hebt verzameld. Open de productie-interface om ze te maken.{*PlanksIcon*} + + + 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*} + + + 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. + + + Druk op{*CONTROLLER_ACTION_CRAFTING*} om de productie-interface te openen. + + + 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. + + + Gebruik{*CONTROLLER_ACTION_MOVE*} om je te verplaatsen. + + + Gebruik{*CONTROLLER_ACTION_LOOK*} om omhoog, omlaag en rond te kijken. + + + 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. + + + 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. + + + Druk op{*CONTROLLER_ACTION_JUMP*} om te springen. + + + Om iets te produceren, zijn vaak meerdere stappen nodig. Nu je planken hebt, kun je meer voorwerpen produceren. Maak een werkbank.{*CraftingTableIcon*} + + + 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. + + + Open de container. + + + 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*} + + + 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 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. + + + + + Er is een verlaten mijnwerkersschuilplaats in de buurt die je kunt afmaken, zodat je je kunt verschuilen voor de nacht. + + + + 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*} + + + 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. + + + Neem een ander voorwerp in je hand met{*CONTROLLER_ACTION_LEFT_SCROLL*} en{*CONTROLLER_ACTION_RIGHT_SCROLL*}. + + + 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*} + + + 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*} + + + Beweeg het richtkruis naar de werkbank en druk op {*CONTROLLER_ACTION_USE*} om 'm te openen. + + + Selecteer de werkbank, beweeg het richtkruis naar de plek waar je de werkbank wilt plaatsen en druk op{*CONTROLLER_ACTION_USE*}. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Configuratie 1 + + + Verplaatsen (vliegend) + + + Spelers/uitnodigen + + + + + + Configuratie 3 + + + Configuratie 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. + + + + + + + + + + + + + + + + + + + + + + + + + + + Zilvervisblok + + + Steenplaat + + + Een compacte manier om ijzer op te slaan. + + + IJzerblok + + + Eikenhouten plaat + + + Zandsteenplaat + + + Steenplaat + + + Een compacte manier om goud op te slaan. + + + Bloem + + + Witte wol + + + Oranje wol + + + Goudblok + + + Paddenstoel + + + Roos + + + Keiplaat + + + Boekenplank + + + TNT + + + Bakstenen + + + Fakkel + + + Obsidiaan + + + Mossige steen + + + Onderwereld-steenplaat + + + Eikenhouten plaat + + + Bloksteenplaat + + + Baksteenplaat + + + Tropenhouten plaat + + + Berkenhouten plaat + + + Sparrenhouten plaat + + + Magenta wol + + + Berkenbladeren + + + Sparrenbladeren + + + Eikenbladeren + + + Glas + + + Spons + + + Tropische bladeren + + + Bladeren + + + Eik + + + Spar + + + Berk + + + Sparrenhout + + + Berkenhout + + + Tropisch hout + + + Wol + + + Roze wol + + + Grijze wol + + + Lichtgrijze wol + + + Lichtblauwe wol + + + Gele wol + + + Lichtgroene wol + + + Cyaankleurige wol + + + Groene wol + + + Rode wol + + + Zwarte wol + + + Paarse wol + + + Blauwe wol + + + Bruine wol + + + Fakkel (steenkool) + + + Gloeisteen + + + Drijfzand + + + Onderwereld-blok + + + Lapis lazuli-blok + + + Lapis lazuli-erts + + + Portaal + + + Pompoenlampion + + + Suikerriet + + + Klei + + + Cactus + + + Pompoen + + + Hek + + + Jukebox + + + Een compacte manier om lapis lazuli op te slaan. + + + Valluik + + + Afgesloten kist + + + Diode + + + Plakzuiger + + + Zuiger + + + Wol (elke kleur) + + + Verdorde struik + + + Taart + + + Nootblok + + + Automaat + + + Hoog gras + + + Web + + + Bed + + + IJs + + + Werkbank + + + Een compacte manier om diamanten op te slaan. + + + Diamantblok + + + Oven + + + Akker + + + Gewassen + + + Diamanterts + + + Monsterkooi + + + Vuur + + + Fakkel (houtskool) + + + Roodsteenstof + + + Kist + + + Eikenhouten trap + + + Bord + + + Roodsteenerts + + + IJzeren deur + + + Drukplaat + + + Sneeuw + + + Toets + + + Roodsteenfakkel + + + Hendel + + + Rails + + + Ladder + + + Houten deur + + + Stenen trap + + + Detectierails + + + Aangedreven rails + + + Je hebt genoeg keien verzameld om een oven te kunnen bouwen. Gebruik hiervoor je werkbank. + + + Hengel + + + Klok + + + Gloeisteenstof + + + Mijnwagen met oven + + + Ei + + + Kompas + + + Rauwe vis + + + Rozenrood + + + Cactusgroen + + + Cacaobonen + + + Gebakken vis + + + Kleurstof + + + Inktzak + + + Mijnwagen met kist + + + Sneeuwbal + + + Boot + + + Leer + + + Mijnwagen + + + Zadel + + + Roodsteen + + + Emmer melk + + + Papier + + + Boek + + + Slijmbal + + + Baksteen + + + Klei + + + Suikerriet + + + Lapis lazuli + + + Kaart + + + Muziekplaat - '13' + + + Muziekplaat - 'Cat' + + + Bed + + + Roodsteenversterker + + + Koekje + + + Muziekplaat - 'Blocks' + + + Muziekplaat - 'Mellohi' + + + Muziekplaat - 'Stal' + + + Muziekplaat - 'Strad' + + + Muziekplaat - 'Chirp' + + + Muziekplaat - 'Far' + + + Muziekplaat - 'Mall' + + + Taart + + + Grijze kleurstof + + + Roze kleurstof + + + Lichtgroene kleurstof + + + Paarse kleurstof + + + Cyaan-kleurstof + + + Lichtgrijze kleurstof + + + Paardenbloemgeel + + + Bottenmeel + + + Bot + + + Suiker + + + Lichtblauwe kleurstof + + + Magenta kleurstof + + + Oranje kleurstof + + + Bord + + + Leren tuniek + + + IJzeren borstplaat + + + Diamanten borstplaat + + + IJzeren helm + + + Diamanten helm + + + Gouden helm + + + Gouden borstplaat + + + Gouden beenbeschermers + + + Leren laarzen + + + IJzeren laarzen + + + Leren broek + + + IJzeren beenbeschermers + + + Diamanten beenbeschermers + + + Leren kap + + + Stenen schoffel + + + IJzeren schoffel + + + Diamanten schoffel + + + Diamanten bijl + + + Gouden bijl + + + Houten schoffel + + + Gouden schoffel + + + Maliënborstplaat + + + Maliënbeenbeschermers + + + Maliënlaarzen + + + Houten deur + + + IJzeren deur + + + Maliënhelm + + + Diamanten laarzen + + + Veer + + + Buskruit + + + Tarwezaden + + + Kom + + + Paddenstoelenstoofpot + + + Draad + + + Tarwe + + + Gebraden varkensvlees + + + Schilderij + + + Gouden appel + + + Brood + + + Vuursteen + + + Rauw varkensvlees + + + Stok + + + Emmer + + + Emmer water + + + Emmer lava + + + Gouden laarzen + + + IJzerstaaf + + + Goudstaaf + + + Aansteker + + + Steenkool + + + Houtskool + + + Diamant + + + Appel + + + Boog + + + Pijl + + + Muziekplaat - 'Ward' + + + + Druk op{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*} om een andere voorwerpgroep te kiezen. Selecteer de groep Bouwmaterialen.{*StructuresIcon*} + + + + + 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*} + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + 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*} + + + + 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. + + + + + 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. + + + + + 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. + + + + + Je ziet nu een lijst met de ingrediënten die je nodig hebt om het geselecteerde voorwerp te produceren. + + + + + Je ziet nu de beschrijving van het geselecteerde voorwerp. Dit geeft je een idee van de mogelijke toepassingen. + + + + + 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. + + + + + Sommige voorwerpen maak je niet met de werkbank, maar met de oven. Maak nu een oven.{*FurnaceIcon*} + + + + Grind + + + Gouderts + + + IJzererts + + + Lava + + + Zand + + + Zandsteen + + + Steenkoolerts + + + {*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. + + + + + 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. + + + + + 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. + + + + Hout + + + Eikenhout + + + + 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. + + + + {*B*} + Druk op{*CONTROLLER_VK_X*} om je inventaris weer te openen. + + + + {*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. + + + + + 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. + + + + + {*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. + + + + + Als je de aanwijzer buiten de interface plaatst, laat je het voorwerp vallen. + + + + + 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. + + + + + 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*}. + + + + + Je hebt het eerste deel van de speluitleg voltooid. + + + + 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. + + + 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. + + + Gebruik{*CONTROLLER_ACTION_USE*} om de oven in de wereld te plaatsen. Daarna open je de oven. + + + 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*} + + + Gebruik{*CONTROLLER_ACTION_USE*} om de deur te plaatsen. Met{*CONTROLLER_ACTION_USE*} kun je een houten deur in de wereld openen en dichtdoen. + + + Een goede schuilplaats heeft een deur, zodat je naar binnen en buiten kunt zonder muren uit te graven. Maak nu een houten deur.{*WoodenDoorIcon*} + + + + Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + + Dit is de productie-interface. Met deze interface kun je verzamelde voorwerpen met elkaar combineren om nieuwe voorwerpen te maken. + + + + + Druk nu op{*CONTROLLER_VK_B*} om de inventaris in het speltype Creatief te sluiten. + + + + + Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + {*B*} + Druk op{*CONTROLLER_VK_X*} om te zien welke ingrediënten je nodig hebt om het geselecteerde voorwerp te maken. + + + + {*B*} + Druk op{*CONTROLLER_VK_X*} voor een beschrijving van het voorwerp. + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al weet hoe je moet produceren. + + + + + Blader door de voorwerpgroepen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, en selecteer de groep met het voorwerp dat je wilt pakken. + + + + {*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. + + + + + Dit is de inventaris in het speltype Creatief. Je ziet de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je kunt kiezen. + + + + + Druk nu op{*CONTROLLER_VK_B*} om de inventaris te sluiten. + + + + + 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. + + + + + 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. + + + + 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. + + + Water + + + Glazen fles + + + Fles water + + + Spinnenoog + + + Goudklomp + + + Onderwereld-wrat + + + {*splash*}{*prefix*}Drankje {*postfix*} + + + Gegist spinnenoog + + + Ketel + + + Einder-oog + + + Glinsterende meloen + + + Blaze-poeder + + + Magmacrème + + + Brouwrek + + + Ghast-traan + + + Pompoenzaden + + + Meloenzaden + + + Rauwe kip + + + Muziekplaat - '11' + + + Muziekplaat - 'Where are we now' + + + Schaar + + + Gebraden kip + + + Einder-parel + + + Stuk meloen + + + Blaze-staf + + + Rauw rundvlees + + + Biefstuk + + + Bedorven vlees + + + Priesterfles + + + Eikenhouten planken + + + Sparrenhouten planken + + + Berkenhouten planken + + + Grasblok + + + Aarde + + + Kei + + + Tropenhouten planken + + + Jonge berk + + + Jonge tropische boom + + + Grondsteen + + + Jong boompje + + + Jonge eik + + + Jonge spar + + + Steen + + + Voorwerplijst + + + {*CREATURE*} spawnen + + + Onderwereld-steen + + + Vuurbal + + + Vuurbal (houtskool) + + + Vuurbal (steenkool) + + + Schedel + + + Hoofd + + + Hoofd van %s + + + Creeper-hoofd + + + Schedel skelet + + + Schedel Onderwereld-skelet + + + Zombiehoofd + + + 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 trager graven + + + voor sneller graven + + + voor verzwakking + + + voor kracht + + + Vuurbestendigheid + + + Verzadiging + voor weerstand - - voor vuurbestendigheid + + voor sprongkracht - - voor onder water ademen + + Wither - - voor onzichtbaarheid + + Gezondheidsboost - - voor blindheid - - - voor nachtzicht - - - voor honger - - - voor vergiftiging + + Absorptie @@ -5254,9 +6123,78 @@ Wil je het combinatiepakket of texturepakket nu installeren? III + + voor onzichtbaarheid + IV + + voor onder water ademen + + + voor vuurbestendigheid + + + voor nachtzicht + + + voor vergiftiging + + + voor honger + + + voor absorptie + + + voor verzadiging + + + voor gezondheidsboost + + + voor blindheid + + + voor verval + + + Natuurlijk + + + Dun + + + Diffuus + + + Helder + + + Melkachtig + + + Vreemd + + + Boterzacht + + + Glad + + + Verprutst + + + Verschaald + + + Grof + + + Mild + Explosief @@ -5266,50 +6204,14 @@ Wil je het combinatiepakket of texturepakket nu installeren? Oninteressant - - Mild + + Zwierig - - Helder + + Hartelijk - - Melkachtig - - - Diffuus - - - Natuurlijk - - - Dun - - - Vreemd - - - Verschaald - - - Grof - - - Verprutst - - - Boterzacht - - - Glad - - - Zacht - - - Opwekkend - - - Dik + + Betoverend Elegant @@ -5317,149 +6219,152 @@ Wil je het combinatiepakket of texturepakket nu installeren? Luxe - - Betoverend - - - Zwierig - - - Verfijnd - - - Hartelijk - Sprankelend - - Krachtig - - - Bedorven - - - Reukloos - Ranzig Scherp + + Reukloos + + + Krachtig + + + Bedorven + + + Zacht + + + Verfijnd + + + Dik + + + Opwekkend + + + Herstelt geleidelijk de gezondheid van spelers, dieren en monsters. + + + Verlaagt meteen de gezondheid van spelers, dieren en monsters. + + + 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. + 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. + + + Wordt gebruikt als de basis voor alle drankjes. Gebruik dit in een brouwrek om drankjes te maken. + Smerig Stinkend - - Wordt gebruikt als de basis voor alle drankjes. Gebruik dit in een brouwrek om drankjes te maken. - - - 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. - - - Maakt spelers, dieren en monsters langzamer. Spelers krijgen bovendien een kleiner blikveld en kunnen minder snel sprinten en minder ver springen. - - - Zorgt ervoor dat spelers en monsters meer schade veroorzaken wanneer ze aanvallen. - - - Zorgt ervoor dat spelers en monsters minder schade veroorzaken wanneer ze aanvallen. - - - Herstelt meteen de gezondheid van spelers, dieren en monsters. - - - Verlaagt meteen de gezondheid van spelers, dieren en monsters. - - - Herstelt geleidelijk de gezondheid van spelers, dieren en monsters. - - - Maakt de spelers, dieren en monsters immuun voor schade door vuur, lava en Blaze-aanvallen van afstand. - - - Verlaagt geleidelijk de gezondheid van spelers, dieren en monsters. + + Dreun Scherpte - - Dreun + + Verlaagt geleidelijk de gezondheid van spelers, dieren en monsters. - - Verdelging van geleedpotigen + + Aanvalsschade Impact - - Vuurbron + + Verdelging van geleedpotigen - - Bescherming + + Snelheid - - Vuurbestendigheid + + Zombie-versterkingen - - Zachte val + + Sprongkracht paard - - Explosiebescherming + + Indien gebruikt: - - Bescherming tegen projectielen + + Weerstand tegen impact - - Ademhaling + + Volgbereik mobs - - Waterrat - - - Efficiëntie + + Max. gezondheid Magische vingers - - Duurzaamheid + + Efficiëntie - - Plundering + + Waterrat Geluk - - Kracht + + Plundering - - Brandende pijlen + + Duurzaamheid - - Impact + + Vuurbestendigheid - - Onuitputtelijke pijlen + + Bescherming - - I + + Vuurbron - - II + + Zachte val - - III + + Ademhaling + + + Bescherming tegen projectielen + + + Explosiebescherming IV @@ -5470,23 +6375,29 @@ Wil je het combinatiepakket of texturepakket nu installeren? VI + + Impact + VII - - VIII + + III - - IX + + Brandende pijlen - - X + + Kracht - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om smaragden te verkrijgen. + + Onuitputtelijke pijlen - - Vergelijkbaar met een kist. Voorwerpen die worden geplaatst in een Einder-kist zijn echter beschikbaar in al je Einder-kisten, zelfs in andere dimensies. + + II + + + I Wordt geactiveerd als iets of iemand een verbonden struikeldraad passeert. @@ -5497,44 +6408,59 @@ Wil je het combinatiepakket of texturepakket nu installeren? Een compacte manier om smaragden op te slaan. - - Een muur die is gemaakt van keien. + + Vergelijkbaar met een kist. Voorwerpen die worden geplaatst in een Einder-kist zijn echter beschikbaar in al je Einder-kisten, zelfs in andere dimensies. - - Kan worden gebruikt voor het repareren van wapens, gereedschap en pantsers. + + IX - - Kan worden omgesmolten in een oven tot Onderwereld-kwarts. + + VIII - - Wordt gebruikt als decoratie. + + Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om smaragden te verkrijgen. - - Kan worden gebruikt om te handelen met dorpelingen. - - - Wordt gebruikt als decoratie. Er kunnen bloemen, jonge boompjes, cactussen en paddenstoelen in worden geplant. + + X Herstelt 2{*ICON_SHANK_01*} en er kan een gouden wortel van worden gemaakt. Kan worden geplant op een akker. + + Wordt gebruikt als decoratie. Er kunnen bloemen, jonge boompjes, cactussen en paddenstoelen in worden geplant. + + + Een muur die is gemaakt van keien. + Herstelt 0.5{*ICON_SHANK_01*} of kan worden bereid in een oven. Kan worden geplant op een akker. - - Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door een aardappel te bereiden in een oven. + + Kan worden omgesmolten in een oven tot Onderwereld-kwarts. + + + Kan worden gebruikt voor het repareren van wapens, gereedschap en pantsers. + + + Kan worden gebruikt om te handelen met dorpelingen. + + + Wordt gebruikt als decoratie. + + + Herstelt 4{*ICON_SHANK_01*}. - 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. + 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 4{*ICON_SHANK_01*}. + + Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door een aardappel te bereiden in een oven. + + + Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt van een wortel en goudklompen. Te gebruiken op een aambeeld om wapens, gereedschap en pantsers te betoveren. @@ -5542,6 +6468,15 @@ Wil je het combinatiepakket of texturepakket nu installeren? 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 + + Pompoentaart - - Aardappel - - - 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,72 +6615,77 @@ 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. + + + + Halsband verven + + + + Plaats om te beginnen het voorwerp in het eerste invoervakje. @@ -5764,9 +6695,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de aambeeld-interface. - + - Plaats om te beginnen het voorwerp in het eerste invoervakje. + Je kunt ook een identiek voorwerp in het tweede vakje plaatsen om de twee voorwerpen met elkaar te combineren. @@ -5774,24 +6705,14 @@ Wil je het combinatiepakket of texturepakket nu installeren? Nadat de vereiste grondstoffen zijn geplaatst in het tweede invoervakje (bijvoorbeeld ijzerstaven voor een beschadigd ijzeren zwaard), verschijnt het gerepareerde voorwerp in het resultaatvakje. - + - Je kunt ook een identiek voorwerp in het tweede vakje plaatsen om de twee voorwerpen met elkaar te combineren. + Je ziet de kosten in ervaringsniveaus onder het uitvoervakje. Als je onvoldoende ervaringsniveaus hebt, kan de reparatie niet worden uitgevoerd. Om voorwerpen te betoveren op het aambeeld, plaats je een betoverd boek in het tweede uitvoervakje. - - - - - 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. @@ -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. + + + + 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. Het gebruik van het aambeeld kost ervaringsniveaus en bij elk gebruik kan het aambeeld beschadigd raken. - - - - - 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. @@ -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,22 +6782,32 @@ Wil je het combinatiepakket of texturepakket nu installeren? Transacties zijn rood en niet beschikbaar als je niet de vereiste voorwerpen hebt. + + + 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. + In de twee vakjes links zie je de hoeveelheid en de typen van de voorwerpen die je aan de dorpeling geeft. - - In de twee vakjes links zie je het totaal aantal voorwerpen dat nodig is voor de transactie. + + + In dit gebied vind je een dorpeling en een kist met papier waarmee je voorwerpen kunt kopen. + Druk op{*CONTROLLER_VK_A*} om de voorwerpen met de dorpeling te ruilen. - + - In dit gebied vind je een dorpeling en een kist met papier waarmee je voorwerpen kunt kopen. + Je kunt voorwerpen uit je inventaris verhandelen met dorpelingen. @@ -5886,19 +6817,14 @@ Wil je het combinatiepakket of texturepakket nu installeren? Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over handel. - + - Je kunt voorwerpen uit je inventaris verhandelen met dorpelingen. + 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. - - - - - Door verschillende transacties uit te voeren, wordt het aanbod van de dorpeling willekeurig uitgebreid of bijgewerkt. @@ -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,37 +1,124 @@  - - 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 + + + Online-id's op gedeeld scherm + + + Trofeeën + + + 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. + + + 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. + + + Online-id's: + + + 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. + + + + Patch 1.04 (titel-update 14) + + + Online-id's in de game + + + Kijk eens wat ik heb gemaakt in Minecraft: PlayStation®Vita Edition! + + + Download mislukt. Probeer het later opnieuw. + + + Aansluiten bij de game is mislukt wegens een beperkend NAT-type. Controleer je netwerkinstellingen. + + + Upload mislukt. Probeer het later opnieuw. + + + Download voltooid! + + + +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. + + + + Opslaan niet voltooid + + + Minecraft: PlayStation®Vita Edition beschikt niet over genoeg ruimte voor opslaggegevens. Verwijder andere opslagbestanden van Minecraft: PlayStation®Vita Edition om ruimte te maken. + + + Uploaden geannuleerd + + + Je hebt het uploaden van dit opslagbestand naar de overdrachtslocatie geannuleerd. + + + Opslagbestand voor PS3™/PS4™ uploaden + + + Gegevens uploaden: %d%% + + + "PSN" + + + PS3™-data downloaden + + + Gegevens downloaden: %d%% + + + Opslaan... + + + Upload voltooid! + + + Weet je zeker dat je dit opslagbestand wilt uploaden? Als de overdrachtslocatie al een opslagbestand bevat, wordt dit overschreven. + + + Gegevens converteren... + + + NIET GEBRUIKT + + + NIET GEBRUIKT {*T3*}INSTRUCTIES: SPELTYPE CREATIEF{*ETW*}{*B*}{*B*} @@ -46,32 +133,80 @@ naar links gaan met{*CONTROLLER_ACTION_DPAD_LEFT*} en naar rechts gaan met{*CONT 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. - - NIET GEBRUIKT - - - NIET GEBRUIKT - "NIET GEBRUIKT" - - "NIET GEBRUIKT" - - - Vrienden uitnodigen - 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? 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? - - Deze wereld is al eens opgeslagen in het speltype Creatief, waardoor trofeeën en klassementen zijn uitgeschakeld. + + "NIET GEBRUIKT" - - 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? + + Vrienden uitnodigen + + + Op minecraftforum is er een speciaal gedeelte voor de PlayStation®Vita Edition. + + + Volg @4JStudios en @Kappische op Twitter voor het laatste nieuws over deze game! + + + NOT USED + + + Gebruik het touchscreen van het PlayStation®Vita-systeem om door de menu's te bladeren. + + + Kijk een Einder-man nooit aan! + + + {*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. + + + {*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. + + + We weten het niet zeker, maar we vermoeden dat 4J Studios Herobrine uit de PlayStation®Vita-versie heeft verwijderd. + + + Minecraft: PlayStation®Vita Edition heeft veel records gebroken! + + + De testversie van Minecraft: PlayStation®Vita Edition is verlopen! Wil je de volledige versie kopen, zodat je verder kunt spelen? + + + "Minecraft: PlayStation®Vita Edition" kan niet worden geladen en kan niet verdergaan. + + + Brouwen + + + Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". + + + De game kan niet worden geladen omdat een of meer spelers niet online mogen spelen wegens chatbeperkingen van hun Sony Entertainment Network-account. + + + 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. + + + 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. + + + 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. + + + Je kunt je niet aansluiten bij deze game-sessie omdat je niet online mag spelen wegens chatbeperkingen van je Sony Entertainment Network-account. Verbinding met "PSN" is verbroken. Terug naar het hoofdmenu. @@ -79,10 +214,22 @@ Terwijl je vliegt, hou je{*CONTROLLER_ACTION_JUMP*} ingedrukt om te stijgen en{* Verbinding met "PSN" is verbroken. + + Deze wereld is al eens opgeslagen in het speltype Creatief, waardoor trofeeën en klassementen zijn uitgeschakeld. + + + 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? + 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? + + Gastspelers kunnen de volledige game niet ontgrendelen. Meld je aan met een Sony Entertainment Network-account. + + + Online-id + 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". @@ -92,151 +239,7 @@ Wil je nu de volledige versie kopen? 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? - - Gastspelers kunnen de volledige game niet ontgrendelen. Meld je aan met een Sony Entertainment Network-account. - - - Online-id - - - Brouwen - - - Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". - - - De testversie van Minecraft: PlayStation®Vita Edition is verlopen! Wil je de volledige versie kopen, zodat je verder kunt spelen? - - - "Minecraft: PlayStation®Vita Edition" kan niet worden geladen en kan niet verdergaan. - - - De game kan niet worden geladen omdat een of meer spelers niet online mogen spelen wegens chatbeperkingen van hun Sony Entertainment Network-account. - - - 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. - - - Je kunt je niet aansluiten bij deze game-sessie omdat je niet online mag spelen wegens chatbeperkingen van je Sony Entertainment Network-account. - - - 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. - - - 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. - - - 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. - - - 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. - - - Online-id's op gedeeld scherm - - - Trofeeën - - - Online-id's: - - - Online-id's in de game - - - Kijk eens wat ik heb gemaakt in Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Patch 1.04 (titel-update 14) - - - SELECT - - - 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. - - - Wil je je nu aanmelden bij "PSN"? - - - 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. - - - PlayStation®Vita-systeem - - - Netwerkmodus wijzigen - - - Kies Netwerk - - - 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. - - - Ad hoc-netwerk - - - "PSN" - - - PlayStation®3-systeem data downloaden - - - Opslagbestand voor PlayStation®3/PlayStation®4-systeem uploaden - - - Uploaden geannuleerd - - - Je hebt het uploaden van dit opslagbestand naar de overdrachtslocatie geannuleerd. - - - Gegevens uploaden: %d%% - - - Gegevens downloaden: %d%% - - - Weet je zeker dat je dit opslagbestand wilt uploaden? Als de overdrachtslocatie al een opslagbestand bevat, wordt dit overschreven. - - - Gegevens converteren... - - - Opslaan... - - - Upload voltooid! - - - Upload mislukt. Probeer het later opnieuw. - - - Download voltooid! - - - Download mislukt. Probeer het later opnieuw. - - - Aansluiten bij de game is mislukt wegens een beperkend NAT-type. Controleer je netwerkinstellingen. - - - - 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. - - - - Opslaan niet voltooid - - - Minecraft: PlayStation®Vita Edition beschikt niet over genoeg ruimte voor opslaggegevens. Verwijder andere opslagbestanden van Minecraft: PlayStation®Vita Edition om ruimte te maken. + + 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". - - - Denne kampen ble avbrutt fordi du logget ut av "PSN". - - - Online-ID-en er ikke online for øyeblikket. - - - Dette spillet har noen funksjoner som krever at du er logget inn på "PSN". Du er for øyeblikket offline. - - - Ad Hoc-nettverket er offline - - - 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 - - - Troféfeil - - - Det oppsto et problem med tilgang til Sony Entertainment Network-kontoen, så du fikk dessverre ikke trofeet ditt. + + Det oppsto en feil under lagring av innstillingene på Sony Entertainment Network-kontoen din. Problem med Sony Entertainment Network-konto - - Det oppsto en feil under lagring av innstillingene på Sony Entertainment Network-kontoen din. + + Det oppsto et problem med tilgang til Sony Entertainment Network-kontoen, så du fikk dessverre ikke trofeet ditt. 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? + + Koble til Ad Hoc-nettverket + + + Spillet har noen funksjoner som krever tilkobling til Ad Hoc-nettverket, men du er for øyeblikket offline. + + + Ad Hoc-nettverket er offline + + + Troféfeil + + + Denne kampen ble avbrutt fordi du logget ut av "PSN". + + + Du ble sendt tilbake til startskjermen fordi du logget ut av "PSN". + + + Du har ikke nok ledig plass på systemminne til å lagre spillet. + + + 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,3298 +1,745 @@  - - 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! - - - Ikke alle svensker er blonde. Det finnes til og med noen rødhåringer, som for eksempel Jens fra Mojang! - - - Det kommer snart en oppdatering til dette spillet! - - - Hvem er Notch? - - - Mojang har flere priser enn ansatte! - - - Det finnes noen kjendiser som spiller Minecraft! - - - deadmau5 liker Minecraft! - - - Ikke se rett på insektene. - - - Smygere ble til etter en kodefeil. - - - Er det en høne eller en and? - - - Var du på Minecon? - - - Ingen på Mojang har noensinne sett ansiktet til Junkboy. - - - Visste du at det finnes en Minecraft Wiki? - - - Mojangs nye lokaler er kule! - - - Minecon 2013 var i Orlando i Florida! - - - .party() var glimrende! - - - Gå alltid ut fra at rykter er usanne snarere enn sanne! - - - {*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*}. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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*} - - - {*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. - - - {*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. - - - {*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: 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. - - - {*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. - - - Neste side - - - Forrige side - - - Grunnleggende - - - HUD - - - Inventar - - - Kister - - - Utforming - - - Smelteovn - - - Dispenser - - - Dyrehold - - - Dyreavl - - + Brygging - - Fortryllelse - - - Portaler - - - Flerspiller - - - Dele skjermbilder - - - Sperre nivåer - - - Kreativ modus - - - Verts- og spilleralternativer - - - Handel - - - Ambolt - - - Slutten - - - {*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. - - - Spurte - - - Nyheter - - - {*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*} - - - - {*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*} - - - Påfører mer skade enn med hendene. - - - Brukes til å grave i jord, gress, sand, grus og snø raskere enn for hånd. Spader kreves for å grave opp snøballer. - - - Kreves for å hugge ut steinrelaterte blokker og malm. - - - Brukes til å hugge ut trerelaterte blokker raskere enn for hånd. - - - Brukes til å gjøre jord- og gressblokker klare til dyrking. - - - Tredører aktiveres ved å bruke dem, slå på dem eller ved hjelp av rødstein. - - - Jerndører kan kun åpnes med rødstein, knapper eller brytere. - - - - - - - - - - - - - - - Gir brukeren 1 i rustning. + + Verktøy, våpen og rustning - - Gir brukeren 3 i rustning. + + Materialer - - Gir brukeren 2 i rustning. + + Byggeblokker - - Gir brukeren 1 i rustning. + + Rødstein og transport - - Gir brukeren 2 i rustning. + + Diverse - - Gir brukeren 5 i rustning. + + Oppføringer: - - Gir brukeren 4 i rustning. + + Avslutt uten å lagre - - Gir brukeren 1 i rustning. + + Er du sikker på at du vil gå ut av hovedmenyen? All ulagret fremdrift vil gå tapt. - - Gir brukeren 2 i rustning. + + Er du sikker på at du vil gå ut av hovedmenyen? All fremdrift vil gå tapt. - - Gir brukeren 6 i rustning. + + Denne lagringen er ødelagt eller skadet. Vil du slette den? - - Gir brukeren 5 i rustning. + + Er du sikker på at du vil avslutte til hovedmenyen? Alle spillere vil bli koblet fra spillet, og all ulagret fremdrift vil gå tapt. - - Gir brukeren 2 i rustning. + + Avslutt og lagre - - Gir brukeren 2 i rustning. + + Opprett ny verden - - Gir brukeren 5 i rustning. + + Skriv inn et navn på verdenen din. - - Gir brukeren 3 i rustning. + + Angi seeden for verdensgenerering - - Gir brukeren 1 i rustning. + + Last inn lagret verden - - Gir brukeren 3 i rustning. + + Spill opplæring - - Gir brukeren 8 i rustning. + + Opplæring - - Gir brukeren 6 i rustning. + + Gi verdenen navn - - Gir brukeren 3 i rustning. + + Skadet lagring - - En skinnende barre som kan brukes til å utforme verktøy laget av dette materialet. Lages ved å smelte malm i en smelteovn. + + OK - - 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. + + Avbryt - - 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. + + Minecraft-butikken - - Brukes til kompakte trapper. + + Roter - - Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + Gjem deg - - Brukes til å lage lange trapper. To heller plassert oppå hverandre skaper en helleblokk av vanlig størrelse. + + Tøm alle felter - - Brukes til å lage lys. Fakler kan også smelte snø og is. + + 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. - - Brukes som et bygningsmateriale og kan lages om til mange ting. Kan utformes av alle typer tre. + + Er du sikker på at du vil overskrive en tidligere lagring av denne verdenen med den gjeldende versjonen? - - Brukes som et bygningsmateriale. Påvirkes ikke av tyngdekraft slik som vanlig sand. + + Er du sikker på at du vil avslutte uten å lagre? All ulagret fremdrift i denne verdenen vil gå tapt! - - Brukes som et bygningsmateriale. + + Starte spill - - Brukes til å lage fakler, piler, skilt, stiger, gjerder samt skaft til verktøy og våpen. + + Avslutt spill - - 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. + + Lagre spill - - Gjør det mulig å utforme et mer variert utvalg av gjenstander enn ved vanlig utforming. + + Avslutte uten å lagre - - Gjør det mulig å smelte malm, lage trekull og glass, og tilberede fisk og koteletter. + + Trykk på START for å bli med i spill - - Til oppbevaring av blokker og gjenstander. Plasser to kister ved siden av hverandre for å lage en større kiste med dobbel kapasitet. + + Hurra – du har fått et spillerbilde av Steve fra Minecraft! - - 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. + + Hurra – du har fått et spillerbilde av en smyger! - - Brukes til å klatre sidelengs. + + Lås opp fullversjon - - 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. + + Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en nyere versjon av spillet. - - Viser tekst som du eller andre spillere har skrevet inn. + + Ny verden - - Brukes til å oppnå et skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. + + Belønning låst opp! - - Brukes til å skape eksplosjoner. Aktiveres etter utplassering ved å tennes med tennstål eller med en elektrisk ladning. + + Du spiller prøveversjonen, og du må ha fullversjonen for å kunne lagre spillet. +Vil du låse opp fullversjonen av spillet nå? - - Brukes til å ha soppstuing oppi. Du beholder bollen når stuingen er spist opp. + + Venner - - Brukes til å oppbevare og frakte vann, lava og melk. + + Min poengsum - - Brukes til å oppbevare og frakte vann. + + Totalt - - Brukes til å oppbevare og frakte lava. + + Vent litt - - Brukes til å oppbevare og frakte melk. + + Ingen resultater - - Brukes til å lage ild, tenne TNT og åpne portaler etter at de er bygget. + + Filter: - - Brukes til å fange fisk. + + Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en eldre versjon av spillet. - - Viser solens og månens posisjon. + + Forbindelse brutt. - - Peker mot startpunktet ditt. + + Forbindelsen til serveren er brutt. Går tilbake til hovedmenyen. - - Gir deg et bilde av et utforsket område. Kan brukes til å finne vei. + + Koblet fra serveren. - - Kan brukes med piler til angrep fra langt hold. + + Avslutter spillet - - Brukes som ammunisjon til buer. + + Det har oppstått en feil. Går tilbake til hovedmenyen. - - Gir deg 2,5 {*ICON_SHANK_01*}. + + Tilkobling mislyktes. - - Gir deg 1 {*ICON_SHANK_01*}. Kan brukes 6 ganger. + + Du ble sparket ut av spillet. - - Gir deg 1 {*ICON_SHANK_01*}. + + Verten har avsluttet spillet. - - Gir deg 1 {*ICON_SHANK_01*}. + + Du kan ikke bli med i dette spillet fordi du ikke er venn med noen i det. - - Gir deg 3 {*ICON_SHANK_01*}. + + Du kan ikke bli med i dette spillet fordi du har blitt sparket ut av verten tidligere. - - Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan gjøre deg syk. + + Du ble sparket ut av spillet for å ha flydd. - - Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede rå kylling i en smelteovn. + + Tilkoblingen tok for lang tid. - - Gir deg 1,5 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. + + Serveren er full. - - Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede rått oksekjøtt i en smelteovn. + + 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! - - Gir deg 1,3 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. + + Temaer - - Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede en rå svinekotelett i en smelteovn. + + Skallpakker - - Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan også brukes til å mate og temme en ozelot. + + Tillat venner av venner - - Gir deg 2,5 {*ICON_SHANK_01*}. Lages ved å tilberede en rå fisk i en smelteovn. + + Spark ut spiller - - Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage et gulleple. + + 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. - - Gir deg 2 {*ICON_SHANK_01*} og regenererer helsen din i 4 sekunder. Lages av et eple og gullklumper. + + Spillerbildepakker - - Gir deg 2 {*ICON_SHANK_01*}. Kan føre til matforgiftning. + + Du kan ikke bli med i dette spillet fordi det er begrenset til spillere som er venn med verten. - - Brukes i kakeoppskriften og som ingrediens for å brygge eliksirer. + + Nedlastbart innhold ødelagt - - 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. + + Dette nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. - - 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. + + Deler av det nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. - - Brukes i rødsteinkretser som repeater, forsinker og/eller diode. + + Kan ikke bli med i spill - - 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. + + Valgt - - Brukes til å fylles med og mate ut gjenstander i tilfeldig rekkefølge etter at den gis en rødsteinladning. + + Valgt skall: - - Spiller en note ved utløsning. Slå den for å endre tonehøyde. Ved å plassere den på ulike blokker endrer du typen instrument som brukes. + + Last ned fullversjon - - Brukes til å kjøre gruvevogner på. + + Lås opp teksturpakke - - Når den forsynes med kraft, akselererer gruvevogner på den. Når den ikke forsynes med kraft, stopper gruvevogner på den. + + Du må låse opp denne teksturpakken for å kunne bruke den. +Vil du låse den opp nå? - - Fungerer som en trykkplate (sender et rødsteinsignal når den forsynes med kraft), men kan kun aktiveres av gruvevogner. + + Prøveversjon av teksturpakke - - Brukes til å transportere deg, et dyr eller et monster på skinnene. + + Seed - - Brukes til å transportere varer på skinnene. + + Lås opp skallpakke - - Går på skinner og kan drive andre gruvevogner når du skuffer kull inn i den. + + Du må låse opp denne skallpakken for å kunne bruke det valgte skallet. +Vil du låse den opp nå? - - Brukes til å komme deg fortere fram i vann enn ved å svømme. + + 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? - - Fås fra sauer og kan farges med fargestoffer. + + Last ned fullversjon - - Brukes som et bygningsmateriale og kan farges med fargestoffer. Denne oppskriften anbefales ikke, ettersom ull enkelt kan fås fra sauer. + + Denne verdenen bruker en flettepakke eller teksturpakke som du ikke har! +Vil du installere flettepakken eller teksturpakken nå? - - Brukes som fargestoff for å lage svart ull. + + Last ned prøveversjon - - Brukes som fargestoff for å lage grønn ull. + + Teksturpakke finnes ikke - - Brukes som fargestoff for å lage brun ull, som ingrediens i kjeks, eller til å dyrke kakaofrukter. + + Lås opp fullversjon - - Brukes som fargestoff for å lage sølvfarget ull. + + Last ned prøveversjon - - Brukes som fargestoff for å lage gul ull. + + Spillmodusen er endret. - - Brukes som fargestoff for å lage rød ull. + + Når dette er aktivert, kan kun inviterte spillere bli med. - - Brukes til å få avlinger, trær, høyt gress, digre sopper og blomster til å vokse umiddelbart, og kan i tillegg brukes til farging. + + Når dette er aktivert, kan venner av dine venner bli med i spillet. - - Brukes som fargestoff for å lage rosa ull. + + Når dette er aktivert, kan spillerne skade hverandre. Påvirker bare overlevelsesmodus. - - Brukes som fargestoff for å lage oransje ull. + + Normal - - Brukes som fargestoff for å lage limegrønn ull. + + Superflat - - Brukes som fargestoff for å lage grå ull. + + Når dette er aktivert, blir spillet et onlinespill. - - 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.) + + Når dette er deaktivert, kan ikke spillere som blir med, bygge eller utvinne før de får godkjenning. - - Brukes som fargestoff for å lage lyseblå ull. + + Når dette er aktivert, vil byggverk som landsbyer og festninger bli generert i verdenen. - - Brukes som fargestoff for å lage turkis ull. + + Når dette er aktivert, genereres en helt flat verden i oververdenen og underverdenen. - - Brukes som fargestoff for å lage lilla ull. + + Når dette er aktivert, dukker det opp en kiste med noen nyttige gjenstander i nærheten av spillernes returneringspunkt. - - Brukes som fargestoff for å lage magentarød ull. + + Når dette er aktivert, kan ild spre seg til brennbare blokker i nærheten. - - Brukes som fargestoff for å lage blå ull. + + Når dette er aktivert, vil TNT eksplodere etter aktivering. - - Spiller musikkplater + + Når dette er aktivert, vil underverdenen bli gjenskapt. Dette er kjekt hvis du har en eldre lagring uten fort i underverdenen. - - Bruk disse til å lage ekstra sterke verktøy, våpen eller rustninger. + + Av - - Brukes til å lage skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. + + Spillmodus: Kreativ - - Brukes til å lage bøker og kart. + + Overlevelse - - Kan brukes til å lage bokhyller eller fortrylles om til fortryllede bøker. + + Kreativ - - Gjør det mulig å lage sterkere fortryllelser hvis den plasseres ved fortryllelsesbordet. + + Gi nytt navn til verden - - Brukes som dekorasjon. + + Skriv inn det nye navnet på verdenen din. - - Kan utvinnes med med en jernhakke eller bedre, og deretter smeltes i en smelteovn for å lage gullbarrer. + + Spillmodus: Overlevelse - - Kan utvinnes med med en steinhakke eller bedre, og deretter smeltes i en smelteovn for å lage jernbarrer. + + Laget i overlevelsesmodus - - Kan utvinnes med en hakke for å få kull. + + Endre navn på lagring - - Kan utvinnes med en steinhakke eller bedre for å få lasurstein. + + Automatisk lagring om %d ... - - Kan utvinnes med en jernhakke eller bedre for å få diamanter. + + - - Kan utvinnes med en jernhakke eller bedre for å få rødsteinstøv. + + Laget i kreativ modus - - Kan utvinnes med en hakke for å få brostein. + + Vis skyer - - Samles ved hjelp av spade. Kan brukes til bygging. + + Hva vil du gjøre med denne lagringen? - - Kan plantes og blir til slutt til et tre. + + HUD-størrelse (delt skjerm) - - Uknuselig. + + Ingrediens - - Setter fyr på alt som kommer i kontakt med det. Kan samles i bøtter. + + Brensel - - 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. - - - 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. - - - 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. - - - 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. - - - En kompakt måte å oppbevare snøballer på. - - - 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. - - - 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. - - - Plasseres på bakken for å føre elektrisk strøm. Ved brygging sammen med en eliksir økes effektens varighet. - - - 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. - - - 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. - - - Forsinker alt og alle som går over den. - - - 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. - - - 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! - - - Høstes inn fra avlinger og kan brukes til å utforme 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 å 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. - - - Fås ved å utvinne fra glødestein og kan utformes til nye glødesteinblokker eller brygges sammen med en eliksir for å øke effektens varighet. - - - 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. - - - 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. - - - 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 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. - - - Som en dør, men brukes hovedsakelig sammen med gjerder. - - - Kan utformes fra melonskiver. - - - Gjennomsiktige blokker som kan brukes som et alternativ til glassblokker. - - - Kan plantes for å dyrke gresskar. - - - 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. - - - 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. - - - Vokser i lang tid når den blir utplassert. Kan samles ved hjelp sauesaks. Kan klatres på som en stige. - - - 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. - - - 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. - - - Kan ha ulike effekter avhengig av hva de brukes på. - - - 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. - - - 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. - - - Fylles med vann ved hjelp av regn eller en bøtte, og kan deretter brukes til å fylle glassflasker med vann. - - - 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å. - - - Flyter på vannet og kan gås på. - - - Brukes til å bygge fort i underverdenen. Immun mot ildkuler fra geister. - - - Brukes i fort i underverdenen. - - - Finnes i fort i underverdenen og avgir underverdenvorter når den ødelegges. - - - 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. - - - 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. - - - Brukes til å tenne på ting eller starte tilfeldige branner ved utskyting fra en dispenser. - - - 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. - - - 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. - - - Kan dyrkes for å gi kakaobønner. - - - Vesenhoder kan utplasseres som dekorasjon eller brukes som en maske på hjelmplassen. - - - Blekksprut - - - Slipper blekkposer når de blir drept. - - - Ku - - - Slipper skinn når de blir drept. Kan også melkes ved hjelp av en bøtte. - - - Sau - - - Slipper ull når de blir klipt (hvis de ikke er klipt allerede). Kan farges for å gi ull av en annen farge. - - - Høne - - - Slipper fjær når de blir drept, og legger også egg fra tid til annen. - - - Gris - - - 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. - - - Smyger - - - Eksploderer hvis du kommer for nær! - - - Skjelett - - - Skyter piler på deg. Slipper piler når de blir drept. - - - Edderkopp - - - Angriper deg når du kommer for nær. Kan klatre opp vegger. Slipper hyssing når de blir drept. - - - Zombie - - - Angriper deg når du kommer for nær. - - - Zombie-grisemann - - - I utgangspunktet føyelige, men angriper i grupper hvis du angriper en av dem. - - - Geist - - - Skyter ildkuler på deg som eksploderer når de treffer. - - - Slim - - - Deler seg i mindre slimer når de blir skadet. - - - Endermann - - - 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. - - - Huleedderkopp - - - Har giftig bitt. - - - Soppku - - - Kan lages om til soppstuing med en bolle. Slipper sopp og blir til vanlige kuer når de klippes. - - - 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 - - - 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. - - - Magmakube - - - Finnes i underverdenen. På samme måte som slimer deler de seg i mindre biter når de blir drept. - - - Landsbyboer - - - Ozelot - - - 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. - - - Jerngolem - - - Finnes i landsbyer for beskyttelse. Kan lages ved hjelp av jernblokker og gresskar. - - - Eksplosjonsanimatør - - - Konsepttegner - - - Tallknusing og statistikk - - - Bøllekoordinator - - - Original design og kode av - - - Prosjektleder/produsent - - - Resten av Mojang-kontoret - - - Sjefsprogrammerer Minecraft PC - - - Ninjakoder - - - CEO - - - Hvitsnippsarbeider - - - Kundestøtte - - - Kontor-DJ - - - Designer/programmerer Minecraft – Pocket Edition - - - Utvikler - - - Sjefsarkitekt - - - Kunstnerisk utvikler - - - Spillutvikler - - - Sjef for moroa - - - Musikk og lyder - - - Programmering - - - Kunst - - - Kvalitetssikring - - - Eksekutiv produsent - - - Sjefsprodusent - - - Produsent - - - Testleder - - - Sjefstester - - - Designteam - - - Utviklingsteam - - - Utgivelsesansvarlig - - - Direktør, XBLA-publisering - - - Forretningsutvikling - - - Porteføljedirektør - - - Produktleder - - - Markedsføring - - - Nettsamfunnansvarlig - - - Lokaliseringsteam i Europa - - - Lokaliseringsteam i Redmond - - - Lokaliseringsteam i Asia - - - Brukerundersøkelsesteam - - - MGS Central-team - - - Godkjenningstester - - - Særlig takk - - - Testleder - - - Senior testleder - - - SDET - - - Prosjekt-STE - - - Ekstra STE - - - Testmedarbeidere - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Tresverd - - - Steinsverd - - - Jernsverd - - - Diamantsverd - - - Gullsverd - - - Trespade - - - Steinspade - - - Jernspade - - - Diamantspade - - - Gullspade - - - Trehakke - - - Steinhakke - - - Jernhakke - - - Diamanthakke - - - Gullhakke - - - Treøks - - - Steinøks - - - Jernøks - - - Diamantøks - - - Gulløks - - - Trekrafse - - - Steinkrafse - - - Jernkrafse - - - Diamantkrafse - - - Gullkrafse - - - Tredør - - - Jerndør - - - Brynjehjelm - - - Brynjebrystplate - - - Brynjebukser - - - Brynjestøvler - - - Skinnhatt - - - Jernhjelm - - - Diamanthjelm - - - Gullhjelm - - - Skinnkjortel - - - Brystplate av jern - - - Diamantbrystplate - - - Brystplate av gull - - - Skinnbukser - - - Bukser av jern - - - Bukser av diamant - - - Bukser av gull - - - Skinnstøvler - - - Jernstøvler - - - Diamantstøvler - - - Gullstøvler - - - Jernbarre - - - Gullbarre - - - Bøtte - - - Vannbøtte - - - Lavabøtte - - - Tennstål - - - Eple - - - Bue - - - Pil - - - Kull - - - Trekull - - - Diamant - - - Pinne - - - Bolle - - - Soppstuing - - - Hyssing - - - Fjær - - - Krutt - - - Hvetefrø - - - Hvete - - - Brød - - - Flint - - - Rå kotelett - - - Tilberedt kotelett - - - Maleri - - - Gulleple - - - Skilt - - - Gruvevogn - - - Sal - - - Rødstein - - - Snøball - - - Båt - - - Skinn - - - Melkespann - - - Murstein - - - Leire - - - Sukkerrør - - - Papir - - - Bok - - - Slimball - - - Gruvevogn med kiste - - - Gruvevogn med ovn - - - Egg - - - Kompass - - - Fiskestang - - - Klokke - - - Glødesteinstøv - - - Rå fisk - - - Tilberedt fisk - - - Fargestoff - - - Blekkpose - - - Rosenrød - - - Kaktusgrønn - - - Kakaobønner - - - Lasurstein - - - Lilla fargestoff - - - Turkis fargestoff - - - Lysegrått fargestoff - - - Grått fargestoff - - - Rosa fargestoff - - - Limegrønt fargestoff - - - Løvetanngul - - - Lyseblått fargestoff - - - Magenta fargestoff - - - Oransje fargestoff - - - Beinmel - - - Bein - - - Sukker - - - Kake - - - Seng - - - Rødsteinrepeater - - - Kjeks - - - Kart - - - Musikkplate – "13" - - - Musikkplate – "cat" - - - Musikkplate – "blocks" - - - Musikkplate – "chirp" - - - Musikkplate – "far" - - - Musikkplate – "mall" - - - Musikkplate – "mellohi" - - - Musikkplate – "stal" - - - Musikkplate – "strad" - - - Musikkplate – "ward" - - - Musikkplate – "11" - - - Musikkplate – "where are we now" - - - Sauesaks - - - Gresskarfrø - - - Melonfrø - - - Rå kylling - - - Tilberedt kylling - - - Rått kjøtt - - - Biff - - - Råttent kjøtt - - - Enderperle - - - Melonskive - - - Blusstav - - - Geisttåre - - - Gullklump - - - Underverdenvorte - - - {*splash*}{*prefix*}eliksir {*postfix*} - - - Glassflaske - - - Vannflaske - - - Edderkoppøye - - - Gjæret edderkoppøye - - - Blusspulver - - - Magmakrem - - - Bryggeapparat - - - Gryte - - - Enderøye - - - Strålende melon - - - Flaske med fortryllelse - - - Ildladning - - - Ildladning (trekull) - - - Ildladning (kull) - - - Gjenstandsramme - - - Yngler {*CREATURE*} - - - Underverdenstein - - - Hodeskalle - - - Skjelettskalle - - - Vissenskjelettskalle - - - Zombiehode - - - Hode - - - %s sitt hode - - - Smygerhode - - - Stein - - - Gressblokk - - - Jord - - - Brostein - - - Planker av eik - - - Planker av gran - - - Planker av bjørk - - - Planker av jungeltre - - - Ungtre - - - Ungeik - - - Unggran - - - Ungbjørk - - - Ungt jungeltre - - - Grunnfjell - - - Vann - - - Lava - - - Sand - - - Sandstein - - - Grus - - - Gullmalm - - - Jernmalm - - - Kullmalm - - - Tre - - - Eiketre - - - Grantre - - - Bjørketre - - - Jungeltre - - - Eik - - - Gran - - - Bjørk - - - Løv - - - Eikeløv - - - Granløv - - - Bjørkeløv - - - Jungeltreløv - - - Svamp - - - Glass - - - Ull - - - Svart ull - - - Rød ull - - - Grønn ull - - - Brun ull - - - Blå ull - - - Lilla ull - - - Turkis ull - - - Lysegrå ull - - - Grå ull - - - Rosa ull - - - Limegrønn ull - - - Gul ull - - - Lyseblå ull - - - Magentarød ull - - - Oransje ull - - - Hvit ull - - - Blomst - - - Rose - - - Sopp - - - Gullblokk - - - En kompakt måte å lagre gull på. - - - Jernblokk - - - En kompakt måte å lagre jern på. - - - Steinhelle - - - Steinhelle - - - Sandsteinhelle - - - Eiketrehelle - - - Brosteinshelle - - - Teglsteinshelle - - - Mursteinshelle - - - Eikehelle - - - Granhelle - - - Bjørkehelle - - - Jungeltrehelle - - - Underverdensteinshelle - - - Teglsteiner - - - TNT - - - Bokhylle - - - Mosestein - - - Obsidian - - - Fakkel - - - Fakkel (kull) - - - Fakkel (trekull) - - - Ild - - - Monsteryngler - - - Eiketrapper - - - Kiste - - - Rødsteinstøv - - - Diamantmalm - - - Diamantblokk - - - En kompakt måte å lagre diamanter på. - - - Utformingsbord - - - Avlinger - - - Dyrkbar jord - - - Smelteovn - - - Skilt - - - Tredør - - - Stige - - - Skinne - - - Kraftskinne - - - Detektorskinne - - - Steintrapp - - - Spak - - - Trykkplate - - - Jerndør - - - Rødsteinmalm - - - Rødsteinfakkel - - - Knapp - - - Snø - - - Is - - - Kaktus - - - Leire - - - Sukkerrør - - - Platespiller - - - Gjerde - - - Gresskar - - - Gresskarlykt - - - Underverdenstein - - - Sjelesand - - - Glødestein - - - Portal - - - Lasursteinmalm - - - Lasursteinblokk - - - En kompakt måte å lagre lasurstein på. - - + Dispenser - - Noteblokk + + Kiste - - Kake + + Fortrylle - - Seng + + Smelteovn - - Spindelvev + + Det er for øyeblikket ingen tilbud på nedlastbart innhold av denne typen til dette spillet. - - Høyt gress + + Er du sikker på at du vil slette denne lagringen? - - Død busk + + Venter på godkjenning - - Diode + + Sensurert - - Låst kiste + + %s har blitt med i spillet. - - Fallem + + %s har forlatt spillet. - - Ull (alle farger) + + %s ble sparket ut fra spillet. - - Stempel - - - Klistrestempel - - - Sølvkreblokk - - - Mursteiner - - - Mosegrodde mursteiner - - - Sprukne mursteiner - - - Meislede mursteiner - - - Sopp - - - Sopp - - - Jernstenger - - - Glassrute - - - Melon - - - Gresskarstilk - - - Melonstilk - - - Slyngplante - - - Grind - - - Teglsteinstrapp - - - Mursteinstrapp - - - Sølvkrestein - - - Sølvkrebrostein - - - Sølvkremurstein - - - Mycelium - - - Liljeplatting - - - Underverdenstein - - - Underverdensteinsgjerde - - - Underverdensteinstrapp - - - Underverdenvorte - - - Fortryllelsesbord - - + Bryggeapparat - - Gryte + + Skriv inn skilttekst - - Sluttportal + + Skriv inn tekst som skal vises på skiltet ditt. - - Sluttportalramme + + Skriv inn tittel - - Sluttstein + + Prøveperioden er over - - Drageegg + + Spillet er fullt - - Kratt + + Kunne ikke bli med i spillet fordi det ikke var flere plasser igjen. - - Bregne + + Skriv inn en tittel på innlegget ditt. - - Sandsteintrapp + + Skriv inn en beskrivelse for innlegget ditt. - - Grantrapp - - - Bjørketrapp - - - Jungeltretrapp - - - Rødsteinlampe - - - Kakao - - - Hodeskalle - - - Gjeldende kontroller - - - Oppsett - - - Gå/spurt - - - Se - - - Pause - - - Hopp - - - Hopp / fly opp - - + Inventar - - Bytt gjenstand + + Ingredienser - - Handling + + Skriv inn bildetekst - - Bruk + + Skriv inn en bildetekst for innlegget ditt. - - Utforming + + Skriv inn beskrivelse - - Slipp + + Spiller nå: - - Snik + + 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. - - Snik / fly ned + + Fjernet fra liste over sperrede nivåer - - Endre kameramodus + + Intervall for automatisk lagring - - Spillere/invitasjon + + Sperret nivå - - Bevegelse (under flyvning) + + 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. - - Oppsett 1 + + Sperre dette nivået? - - Oppsett 2 + + Intervall for automatisk lagring: AV - - Oppsett 3 + + Gjennomsiktighet for grensesnitt - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Gjør klart til automatisk lagring av nivå - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + HUD-størrelse - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Minutter - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Kan ikke plasseres her! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Det er ikke tillatt å plassere lava i nærheten av ynglepunktet på grunn av faren for at spillerne dør rett etter yngling. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Favorittskall - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + %s sitt spill - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Ukjent vertsspill - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Gjest logget ut - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Tilbakestill innstillinger - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Er du sikker på at du vil tilbakestille innstillingene til standardverdiene? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Innlastingsfeil - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + En gjestespiller har logget ut, slik at alle gjestespillere er fjernet fra spillet. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Kunne ikke opprette spill - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Automatisk valgt - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Ingen pakke: Standardskall - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Logg inn - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Du er ikke logget inn, noe du må være for å kunne spille. Vil du logge inn nå? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Flerspiller ikke tillatt - - <![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;]]> + + Drikk - - {*B*}Trykk på {*CONTROLLER_VK_A*} for å fortsette. - - - {*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. - - - 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. - - - Bruk {*CONTROLLER_ACTION_LOOK*} for å se opp, ned og rundt deg. - - - Bruk {*CONTROLLER_ACTION_MOVE*} for å bevege deg. - - - 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. - - - Trykk på {*CONTROLLER_ACTION_JUMP*} for å hoppe. - - - 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. - - - 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. - - - Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne Utforming. - - - Etter hvert som du samler og lager flere ting, vil inventaret ditt fylles opp.{*B*} - Trykk på {*CONTROLLER_ACTION_INVENTORY*} for å åpne inventaret. - - - 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. - - - 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. - - - 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. - - - 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*} - - - Trevirket du har samlet inn, kan utformes til planker. Åpne utformingsgrensesnittet for å gjøre dette.{*PlanksIcon*} - - - 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*} - - - 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*} - - - Bruk {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for å endre hva du holder i hånden. - - - 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. - - - Når du har valgt utformingsbordet, peker du markøren på ønsket sted og velger {*CONTROLLER_ACTION_USE*} for å utplassere et utformingsbord. - - - Pek markøren på utformingsbordet, og trykk på {*CONTROLLER_ACTION_USE*} for å åpne det. - - - 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*} - - - 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*} - - - 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*} - - - Åpne beholderen - - - 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. - - - - I nærheten er det et forlatt gruveskur som du kan bygge opp og bruke som tilfluktssted for natten. - - - - 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. - - - - 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 har samlet nok brosteiner til å bygge en smelteovn. Lag en på utformingsbordet. - - - Bruk {*CONTROLLER_ACTION_USE*} for å plassere smelteovnen i verdenen, og så kan du åpne den. - - - 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. - - - 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. - - - 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*} - - - Bruk {*CONTROLLER_ACTION_USE*} for å plassere døren. Du kan bruke {*CONTROLLER_ACTION_USE*} for å åpne og lukke tredører i verdenen. - - - 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*} - - + - Du har fullført første del av opplæringen. + 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. - - - {*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. - - - - 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. - - - + {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker inventaret. + 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. - - 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. - + + 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. - - 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. + + Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne inventaret for kreativ modus. - - Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. - + + Kom deg over på motsatt side av dette hullet for å fortsette. - + + Du har nå fullført opplæringen for kreativ modus. + + + 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. + + + 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*} + + + 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*} + + + Beinmel kan brukes til å få avlinger helt utvokste eller til å få sopper til å vokse seg til digre sopper.{*ICON*}351:15{*/ICON*} + + + 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*} + + + 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. + + + 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*} + + + 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. + + - Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_VK_BACK*}. + 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. - + - Trykk nå på {*CONTROLLER_VK_B*} for å gå ut av inventaret. + I dette området er det en portal til underverdenen! - - - Dette er inventaret for kreativ modus. Her finner du gjenstander du kan ta i hånden, og andre ting du kan velge. - - - + {*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. - - - - 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. - - - - -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. - - - - 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*}. - - - - 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. - - - - Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_VK_BACK*} . - - - - Trykk på {*CONTROLLER_VK_B*} nå for å gå ut av inventaret for kreativ modus. - - - - -Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har samlet, og lage nye gjenstander. - - - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du utformer ting. - - - - {*B*} - Trykk på {*CONTROLLER_VK_X*} for å se en beskrivelse av gjenstanden. - - - - {*B*} - Trykk på {*CONTROLLER_VK_X*} for å se hvilke ingredienser som kreves for å lage den aktuelle gjenstanden. - - - - {*B*} - Trykk på {*CONTROLLER_VK_X*} for å vise inventaret igjen. - - - - 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. - - - - 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. - - - - - 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. - - - - - 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. - - - - - Nå ser du en beskrivelse av den valgte gjenstanden. Beskrivelsen kan gi deg en pekepinn på hva gjenstanden kan brukes til. - - - - - Du får så se en liste over hvilke ingredienser som kreves for å lage den valgte gjenstanden. - - - - Trevirket du har samlet inn, kan utformes til planker. Velg plankeikonet og trykk på {*CONTROLLER_VK_A*} for å gjøre dette.{*PlanksIcon*} - - - - 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. - - - - - Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Verktøy-gruppen.{*ToolsIcon*} - - - - - Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Byggverk-gruppen.{*ToolsIcon*} - - - - - 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*} - - - - 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*} - - - - 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. - - - - - Visse gjenstander kan ikke lages med utformingsbordet, men krever en smelteovn. Lag en smelteovn nå.{*FurnaceIcon*} - - - - - 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. - - - - - Dette er smelteovngrensesnittet. Med en smelteovn kan du omskape gjenstander. Du kan for eksempel gjøre jernmalm om til jernbarrer. - - - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker en smelteovn. - - - - 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. - - - - - 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. - - - - 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. - - - - - 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. - - - - - Trekull kan brukes som brensel eller utformes til fakler med pinner. - - - - - Hvis du plasserer sand på ingrediensplassen, kan du lage glass. Lag noen glassblokker som du kan bruke som vindu i tilfluktsstedet ditt. - - - - - Dette er bryggegrensesnittet. Her kan du lage eliksirer med en rekke ulike virkninger. - - - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker bryggeapparatet. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Lag en eliksir med ildmotstand ved først å ta en vannflaske og legge til underverdenvorte, og deretter legge til magmakrem. - - - - - Trykk på {*CONTROLLER_VK_B*} for å gå ut av bryggegrensesnittet. - - - - - Her er det et bryggeapparat, en gryte og en kiste full av bryggegjenstander. - - - - {*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. - - - - - Første steg når du skal brygge en eliksir, er å lage en vannflaske. Ta en glassflaske fra kisten. - - - - - 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*}. - - - - - Dersom gryten blir tom, kan du fylle den igjen med en vannbøtte. - - - - - Bruk bryggeapparatet til å lage en eliksir med ildmotstand. Til det vil du trenge en vannflaske, en underverdenvorte og magmakrem. - - - - - 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. - - - - - Bruk en eliksir med ildmotstand på deg selv. - - - - - Nå som du er motstandsdyktig mot ild og lava, kan du se om du finner noen steder du ikke kunne komme til før. - - - - - Dette er fortryllelsesgrensesnittet. Her kan du legge fortryllelser på våpen, rustning og noen typer verktøy. - - - - {*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. - - - - - 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. - - - - - Når en gjenstand plasseres på fortryllelsesplassen, vil knappene til høyre endres til å vise et utvalg med tilfeldige fortryllelser. - - - - - 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. - - - - - Velg en fortryllelse, og trykk på {*CONTROLLER_VK_A*} for å bruke den på gjenstanden. Dette vil redusere erfaringsnivået ditt med prisen på fortryllelsen. - - - - - 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. - - - - - Her er det et fortryllelsesbord og noen andre ting som kan bruke til å lære mer om fortryllelse. - - - - {*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. - - - - - 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. - - - - - Hvis du plasserer bokhyller rundt fortryllelsesbordet, får det økt kraft og du får tilgang til fortryllelser på høyere nivå. - - - - - Å 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. - - - - - 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. - - - - - 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. - - - - - 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*} - - - - {*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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - {*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. - - - - - Med en båt kan du reise raskere på vann. Den kan styres med {*CONTROLLER_ACTION_MOVE*} and {*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - - - Du holder nå en fiskestang. Trykk på {*CONTROLLER_ACTION_USE*} for å bruke den.{*FishingRodIcon*} - - - - {*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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - {*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. - - - - - 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*} - - - - - 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*} - - - - - 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. - - - - {*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. - - - - - 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. - - - - - 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. + 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. @@ -3312,41 +759,10 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa 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*} - - - - 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. - - - - - I dette området er det en portal til underverdenen! - - - - {*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. - Portaler lages ved å plassere obsidianblokker i en ramme som er fire blokker bred og fem blokker høy. Hjørneblokker trengs ikke. - - - - - 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. - - - - - 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. - - - - - 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. @@ -3365,56 +781,76 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om kreativ modus. - - 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. - - - Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne inventaret for kreativ modus. - - - Kom deg over på motsatt side av dette hullet for å fortsette. - - - Du har nå fullført opplæringen for kreativ modus. - - + - 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. + 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. - - {*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. + + + 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. - - 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. - - - 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. - - - 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*} - - - 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. - - - 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*} - - - 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*} - - - 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*} - - - Beinmel kan brukes til å få avlinger helt utvokste eller til å få sopper til å vokse seg til digre sopper.{*ICON*}351:15{*/ICON*} + + + 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. + Du har nå fullført opplæringen for gårdsdrift. + + Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en øks til å hugge trestammer. + + + 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. + + + Noen verktøy fungerer bedre enn andre til å angripe fiender. Det kan lønne seg å bruke et sverd når du skal angripe. + + + Jerngolemer finnes også naturlig som beskyttelse av landsbyer, og disse angriper deg hvis du angriper noen av landsbyboerne. + + + Du kan ikke forlate dette området før du har fullført opplæringen. + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. + + + Hold inne {*CONTROLLER_ACTION_JUMP*} for å svømme opp. + + + 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. + + + 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. + + + 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. + + + 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. + + + + Etter at dyrene har vært i elskovsmodus, vil de ikke kunne gå tilbake til denne modusen før etter ca. 5 minutter. + I dette områdene er dyrene inngjerdet. Du kan avle dyr slik at de lager babyversjoner av seg selv. @@ -3429,19 +865,21 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa For å avle frem dyr må du fôre dem riktig slik at de går inn i en "elskovsmodus". - - 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. - - - 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. - - - - Etter at dyrene har vært i elskovsmodus, vil de ikke kunne gå tilbake til denne modusen før etter ca. 5 minutter. - 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*} + + {*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. + + + + Golemer lages ved å plassere et gresskar oppå en stabel med blokker. + + + 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. + 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. @@ -3455,63 +893,525 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa I dette området er det noen gresskar og blokker som kan brukes til å lage en snøgolem eller jerngolem. - - {*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. + + + 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. - - Golemer lages ved å plassere et gresskar oppå en stabel med blokker. + + + Dersom gryten blir tom, kan du fylle den igjen med en vannbøtte. + - - 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. + + + Bruk bryggeapparatet til å lage en eliksir med ildmotstand. Til det vil du trenge en vannflaske, en underverdenvorte og magmakrem. + - - 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. + + + 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. + - - Jerngolemer finnes også naturlig som beskyttelse av landsbyer, og disse angriper deg hvis du angriper noen av landsbyboerne. + + {*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. + - - Du kan ikke forlate dette området før du har fullført opplæringen. + + + Første steg når du skal brygge en eliksir, er å lage en vannflaske. Ta en glassflaske fra kisten. + - - 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. + + + 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*}. + - - Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en øks til å hugge trestammer. + + + Bruk en eliksir med ildmotstand på deg selv. + - - 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. + + + 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. + - - Noen verktøy fungerer bedre enn andre til å angripe fiender. Det kan lønne seg å bruke et sverd når du skal angripe. + + + Når en gjenstand plasseres på fortryllelsesplassen, vil knappene til høyre endres til å vise et utvalg med tilfeldige fortryllelser. + - - 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. + + + 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. + - - 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. + + + Nå som du er motstandsdyktig mot ild og lava, kan du se om du finner noen steder du ikke kunne komme til før. + - - Hold inne {*CONTROLLER_ACTION_JUMP*} for å svømme opp. + + + Dette er fortryllelsesgrensesnittet. Her kan du legge fortryllelser på våpen, rustning og noen typer verktøy. + - - 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. + + {*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. + - - 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. + + + Her er det et bryggeapparat, en gryte og en kiste full av bryggegjenstander. + - - 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. + + + Trekull kan brukes som brensel eller utformes til fakler med pinner. + - - 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. + + + Hvis du plasserer sand på ingrediensplassen, kan du lage glass. Lag noen glassblokker som du kan bruke som vindu i tilfluktsstedet ditt. + + + + + Dette er bryggegrensesnittet. Her kan du lage eliksirer med en rekke ulike virkninger. + + + + + 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. + + + + 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. + + + + + 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. + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker 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. + + + + + Lag en eliksir med ildmotstand ved først å ta en vannflaske og legge til underverdenvorte, og deretter legge til magmakrem. + + + + + Trykk på {*CONTROLLER_VK_B*} for å gå ut av bryggegrensesnittet. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + Velg en fortryllelse, og trykk på {*CONTROLLER_VK_A*} for å bruke den på gjenstanden. Dette vil redusere erfaringsnivået ditt med prisen på fortryllelsen. + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + Med en båt kan du reise raskere på vann. Den kan styres med {*CONTROLLER_ACTION_MOVE*} and {*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Du holder nå en fiskestang. Trykk på {*CONTROLLER_ACTION_USE*} for å bruke den.{*FishingRodIcon*} + + + + {*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. + + + + + 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*} + + + + + 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. + + + + {*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. + + + + + 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. + + + + {*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. + + + + + 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*} + + + + + 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*} + + + + {*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. + + + + + 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. + + + + + Hvis du plasserer bokhyller rundt fortryllelsesbordet, får det økt kraft og du får tilgang til fortryllelser på høyere nivå. + + + + + Å 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. + + + + + 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. + + + + + Her er det et fortryllelsesbord og noen andre ting som kan bruke til å lære mer om fortryllelse. + + + + {*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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + 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. + + + + + 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*} + + + + {*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. + Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. + + Les + + + Heng + + + Kast + + + Åpne + + + Endre tonehøyde + + + Detoner + + + Plant + + + Lås opp fullversjon + + + Slett lagring + + + Slett + + + Kultiver + + + Høst inn + + + Fortsett + + + Svøm opp + + + Slå + + + Melk + + + Samle inn + + + Tøm + + + Sal + + + Plasser + + + Spis + + + Ri + + + Seil + + + Dyrk + + + Sov + + + Våkne + + + Spill + + + Alternativer + + + Flytt rustning + + + Flytt våpen + + + Bruk + + + Flytt ingrediens + + + Flytt brensel + + + Flytt verktøy + + + Spenn + + + En side opp + + + En side ned + + + Elskovsmodus + + + Slipp + + + Rettigheter + + + Blokk + + + Kreativ + + + Sperr nivå + + + Velg skall + + + Tenn på + + + Inviter venner + + + Aksepter + + + Klipp + + + Naviger + + + Installer på nytt + + + Lagringsalt. + + + Utfør kommando + + + Installer fullversjon + + + Installer prøveversjon + + + Installer + + + Løs ut + + + Oppdater liste over onlinespill + + + Partyspill + + + Alle spill + + + Avslutt + + + Avbryt + + + Avbryt forespørsel + + + Bytt gruppe + + + Utforming + + + Lag + + + Ta/plasser + + + Vis inventar + + + Vis beskrivelse + + + Vis ingredienser + + + Tilbake + + + Husk: + + + + + + Den siste versjonen av spillet har en rekke nye funksjoner, deriblant nye områder i opplæringsverdenen. + Du har ikke alle ingrediensene som kreves for å lage denne gjenstanden. I boksen nederst til venstre ser du hvilke de er. @@ -3523,29 +1423,9 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa {*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. - - Husk: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Den siste versjonen av spillet har en rekke nye funksjoner, deriblant nye områder i opplæringsverdenen. - {*B*}Trykk på {*CONTROLLER_VK_A*} for å spille gjennom opplæringen som vanlig.{*B*} Trykk på {*CONTROLLER_VK_B*} for å hoppe over hovedopplæringen. - - - I dette området finner du områder hvor du kan lære om fisking, båter, stempler og rødstein. - - - Utenfor dette området finner du eksempler på bygninger, gårdsdrift, gruvevogner og skinner, fortryllelse, brygging, handel, smiing og masse annet! - - - - Matlinjen har falt ned til et nivå hvor du ikke lenger blir helbredet. - {*B*} @@ -3559,102 +1439,20 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa Bruk - - Tilbake + + I dette området finner du områder hvor du kan lære om fisking, båter, stempler og rødstein. - - Avslutt + + Utenfor dette området finner du eksempler på bygninger, gårdsdrift, gruvevogner og skinner, fortryllelse, brygging, handel, smiing og masse annet! - - Avbryt - - - Avbryt forespørsel - - - Oppdater liste over onlinespill - - - Partyspill - - - Alle spill - - - Bytt gruppe - - - Vis inventar - - - Vis beskrivelse - - - Vis ingredienser - - - Utforming - - - Lag - - - Ta/plasser + + + Matlinjen har falt ned til et nivå hvor du ikke lenger blir helbredet. + Ta - - Ta alle - - - Ta halvparten - - - Plasser - - - Plasser alle - - - Plasser én - - - Slipp - - - Slipp alle - - - Slipp én - - - Bytt - - - Hurtigflytting - - - Fjern hurtigvalg - - - Hva er dette? - - - Del på Facebook - - - Endre filter - - - Send venneforespørsel - - - En side ned - - - En side opp - Neste @@ -3664,18 +1462,18 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa Spark ut spiller + + Send venneforespørsel + + + En side ned + + + En side opp + Farg - - Utvinn - - - Fôr - - - Tem - Helbred @@ -3685,1069 +1483,792 @@ Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har sa Følg meg - - Løs ut + + Utvinn - - Tøm + + Fôr - - Sal + + Tem - - Plasser + + Endre filter - - Slå + + Plasser alle - - Melk + + Plasser én - - Samle inn - - - Spis - - - Sov - - - Våkne - - - Spill - - - Ri - - - Seil - - - Dyrk - - - Svøm opp - - - Åpne - - - Endre tonehøyde - - - Detoner - - - Les - - - Heng - - - Kast - - - Plant - - - Kultiver - - - Høst inn - - - Fortsett - - - Lås opp fullversjon - - - Slett lagring - - - Slett - - - Alternativer - - - Inviter venner - - - Aksepter - - - Klipp - - - Sperr nivå - - - Velg skall - - - Tenn på - - - Naviger - - - Installer fullversjon - - - Installer prøveversjon - - - Installer - - - Installer på nytt - - - Lagringsalt. - - - Utfør kommando - - - Kreativ - - - Flytt ingrediens - - - Flytt brensel - - - Flytt verktøy - - - Flytt rustning - - - Flytt våpen - - - Bruk - - - Spenn - - + Slipp - - Rettigheter + + Ta alle - - Blokk + + Ta halvparten - - En side opp + + Plasser - - En side ned + + Slipp alle - - Elskovsmodus + + Fjern hurtigvalg - - Drikk + + Hva er dette? - - Roter + + Del på Facebook - - Gjem deg + + Slipp én - - Tøm alle felter + + Bytt - - OK - - - Avbryt - - - Minecraft-butikken - - - 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. - - - Avslutt spill - - - Lagre spill - - - Avslutte uten å lagre - - - Er du sikker på at du vil overskrive en tidligere lagring av denne verdenen med den gjeldende versjonen? - - - Er du sikker på at du vil avslutte uten å lagre? All ulagret fremdrift i denne verdenen vil gå tapt! - - - Starte spill - - - Skadet lagring - - - Denne lagringen er ødelagt eller skadet. Vil du slette den? - - - Er du sikker på at du vil avslutte til hovedmenyen? Alle spillere vil bli koblet fra spillet, og all ulagret fremdrift vil gå tapt. - - - Avslutt og lagre - - - Avslutt uten å lagre - - - Er du sikker på at du vil gå ut av hovedmenyen? All ulagret fremdrift vil gå tapt. - - - Er du sikker på at du vil gå ut av hovedmenyen? All fremdrift vil gå tapt. - - - Opprett ny verden - - - Spill opplæring - - - Opplæring - - - Gi verdenen navn - - - Skriv inn et navn på verdenen din. - - - Angi seeden for verdensgenerering - - - Last inn lagret verden - - - Trykk på START for å bli med i spill - - - Avslutter spillet - - - Det har oppstått en feil. Går tilbake til hovedmenyen. - - - Tilkobling mislyktes. - - - Forbindelse brutt. - - - Forbindelsen til serveren er brutt. Går tilbake til hovedmenyen. - - - Koblet fra serveren. - - - Du ble sparket ut av spillet. - - - Du ble sparket ut av spillet for å ha flydd. - - - Tilkoblingen tok for lang tid. - - - Serveren er full. - - - Verten har avsluttet spillet. - - - Du kan ikke bli med i dette spillet fordi du ikke er venn med noen i det. - - - Du kan ikke bli med i dette spillet fordi du har blitt sparket ut av verten tidligere. - - - Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en eldre versjon av spillet. - - - Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en nyere versjon av spillet. - - - Ny verden - - - Belønning låst opp! - - - 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 - - - Min poengsum - - - Totalt - - - Oppføringer: - - - Rang - - - Forbereder lagring av nivå - - - Forbereder segmenter ... - - - Fullfører ... - - - Bygger terreng - - - Simulerer verdenen litt - - - Initialiserer server - - - Genererer startpunkt - - - 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 - - - Bytter til offlinespill - - - Vent litt mens verten lagrer spillet - - - Entrer Slutten - - - Forlater Slutten - - - Denne sengen er opptatt. - - - Du kan bare sove om natten. - - - %s sover i en seng. For å kunne spole frem til neste morgen må alle spillerne sove i hver sin seng samtidig. - - - Sengen din manglet eller var blokkert. - - - Du kan ikke hvile nå – det er monstre i nærheten. - - - Du sover i en seng. For å kunne spole frem til neste morgen må alle spillerne sove i hver sin seng samtidig. - - - Verktøy og våpen - - - Våpen - - - Mat - - - Byggverk - - - Rustning - - - Mekanismer - - - Transport - - - Dekorasjoner - - - Byggeblokker - - - Rødstein og transport - - - Diverse - - - Brygging - - - Verktøy, våpen og rustning - - - Materialer - - - Logget ut - - - Vanskelighetsgrad - - - Musikk - - - Lyd - - - Gamma - - - Spillfølsomhet - - - Grensesnittfølsomhet - - - Fredelig - - - Lett - - - Normal - - - Vanskelig - - - I denne modusen gjenvinner du helsen over tid, og det er ingen fiender i omgivelsene. - - - I denne modusen lurker fiender i omgivelsene, men de påfører deg mindre skade enn i modusen Normal. - - - I denne modusen lurker fiender i omgivelsene og påfører deg standard mengde skade. - - - 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! - - - Prøveperioden er over - - - Spillet er fullt - - - Kunne ikke bli med i spillet fordi det ikke var flere plasser igjen. - - - Skriv inn skilttekst - - - Skriv inn tekst som skal vises på skiltet ditt. - - - Skriv inn tittel - - - Skriv inn en tittel på innlegget ditt. - - - Skriv inn bildetekst - - - Skriv inn en bildetekst for innlegget ditt. - - - Skriv inn beskrivelse - - - Skriv inn en beskrivelse for innlegget ditt. - - - Inventar - - - Ingredienser - - - Bryggeapparat - - - Kiste - - - Fortrylle - - - Smelteovn - - - Ingrediens - - - Brensel - - - Dispenser - - - Det er for øyeblikket ingen tilbud på nedlastbart innhold av denne typen til dette spillet. - - - %s har blitt med i spillet. - - - %s har forlatt spillet. - - - %s ble sparket ut fra spillet. - - - Er du sikker på at du vil slette denne lagringen? - - - Venter på godkjenning - - - Sensurert - - - Spiller nå: - - - Tilbakestill innstillinger - - - Er du sikker på at du vil tilbakestille innstillingene til standardverdiene? - - - Innlastingsfeil - - - %s sitt spill - - - Ukjent vertsspill - - - Gjest logget ut - - - En gjestespiller har logget ut, slik at alle gjestespillere er fjernet fra spillet. - - - Logg inn - - - Du er ikke logget inn, noe du må være for å kunne spille. Vil du logge inn nå? - - - Flerspiller ikke tillatt - - - Kunne ikke opprette spill - - - Automatisk valgt - - - Ingen pakke: Standardskall - - - Favorittskall - - - Sperret nivå - - - 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. - - - Sperre dette nivået? - - - 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. - - - Fjernet fra liste over sperrede nivåer - - - Intervall for automatisk lagring - - - Intervall for automatisk lagring: AV - - - Minutter - - - Kan ikke plasseres her! - - - Det er ikke tillatt å plassere lava i nærheten av ynglepunktet på grunn av faren for at spillerne dør rett etter yngling. - - - Gjennomsiktighet for grensesnitt - - - Gjør klart til automatisk lagring av nivå - - - HUD-størrelse - - - HUD-størrelse (delt skjerm) - - - Seed - - - Lås opp skallpakke - - - Du må låse opp denne skallpakken for å kunne bruke det valgte skallet. -Vil du låse den opp nå? - - - Lås opp teksturpakke - - - Du må låse opp denne teksturpakken for å kunne bruke den. -Vil du låse den opp nå? - - - Prøveversjon av teksturpakke - - - 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? - - - Teksturpakke finnes ikke - - - Lås opp fullversjon - - - Last ned prøveversjon - - - Last ned fullversjon - - - Denne verdenen bruker en flettepakke eller teksturpakke som du ikke har! -Vil du installere flettepakken eller teksturpakken nå? - - - Last ned prøveversjon - - - Last ned fullversjon - - - 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 - - - Temaer - - - Skallpakker - - - Tillat venner av venner - - - Du kan ikke bli med i dette spillet fordi det er begrenset til spillere som er venn med verten. - - - Kan ikke bli med i spill - - - Valgt - - - Valgt skall: - - - Nedlastbart innhold ødelagt - - - Dette nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. - - - Deler av det nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. - - - Spillmodusen er endret. - - - Gi nytt navn til verden - - - Skriv inn det nye navnet på verdenen din. - - - Spillmodus: Overlevelse - - - Spillmodus: Kreativ - - - Overlevelse - - - Kreativ - - - Laget i overlevelsesmodus - - - Laget i kreativ modus - - - Vis skyer - - - Hva vil du gjøre med denne lagringen? - - - Endre navn på lagring - - - Automatisk lagring om %d ... - - - - - - Av - - - Normal - - - Superflat - - - Når dette er aktivert, blir spillet et onlinespill. - - - Når dette er aktivert, kan kun inviterte spillere bli med. - - - Når dette er aktivert, kan venner av dine venner bli med i spillet. - - - Når dette er aktivert, kan spillerne skade hverandre. Påvirker bare overlevelsesmodus. - - - Når dette er deaktivert, kan ikke spillere som blir med, bygge eller utvinne før de får godkjenning. - - - Når dette er aktivert, kan ild spre seg til brennbare blokker i nærheten. - - - Når dette er aktivert, vil TNT eksplodere etter aktivering. - - - Når dette er aktivert, vil underverdenen bli gjenskapt. Dette er kjekt hvis du har en eldre lagring uten fort i underverdenen. - - - Når dette er aktivert, vil byggverk som landsbyer og festninger bli generert i verdenen. - - - Når dette er aktivert, genereres en helt flat verden i oververdenen og underverdenen. - - - Når dette er aktivert, dukker det opp en kiste med noen nyttige gjenstander i nærheten av spillernes returneringspunkt. + + Hurtigflytting Skallpakker - - Temaer + + Rødfarget glassrute - - Spillerbilder + + Grønnfarget glassrute - - Avatarelementer + + Brunfarget glassrute - - Teksturpakker + + Hvitfarget glass - - Flettepakker + + Farget glassrute - - {*PLAYER*} gikk opp i flammer. + + Sortfarget glassrute - - {*PLAYER*} brant i hjel. + + Blåfarget glassrute - - {*PLAYER*} prøvde å svømme i lava. + + Gråfarget glassrute - - {*PLAYER*} ble kvalt i en vegg. + + Rosafarget glassrute - - {*PLAYER*} druknet. + + Limefarget glassrute - - {*PLAYER*} sultet i hjel. + + Lillafarget glassrute - - {*PLAYER*} ble spiddet til døde. + + Cyanfarget glassrute - - {*PLAYER*} traff bakken med for mye kraft. + + Lysegråfarget glassrute - - {*PLAYER*} falt ut av verdenen. + + Oransjefarget glass - - {*PLAYER*} døde. + + Blåfarget glass - - {*PLAYER*} ble sprengt i filler. + + Lillafarget glass - - {*PLAYER*} ble drept av magi. + + Cyanfarget glass - - {*PLAYER*} ble drept av enderdragens ånde. + + Rødfarget glass - - {*PLAYER*} ble drept av {*SOURCE*}. + + Grønnfarget glass - - {*PLAYER*} ble drept av {*SOURCE*}. + + Brunfarget glass - - {*PLAYER*} ble skutt av {*SOURCE*}. + + Lysegråfarget glass - - {*PLAYER*} ble tatt av {*SOURCE*} sin ildkule. + + Gulfarget glass - - {*PLAYER*} ble dengt av {*SOURCE*}. + + Lysblåfarget glass - - {*PLAYER*} ble drept av {*SOURCE*}. + + Magentafarget glass - - Grunnfjelltåke + + Gråfarget glass - - Vis HUD + + Rosafarget glass - - Vis hånd + + Limefarget glass - - Dødsmeldinger + + Gulfarget glassrute - - Animert karakter + + Lysegrå - - Spesialanimasjon for skall + + Grå - - Du kan ikke lenger utvinne fra eller bruke gjenstander. + + Rosa - - Du kan nå utvinne fra eller bruke gjenstander. + + Blå - - Du kan ikke lenger utplassere blokker. + + Lilla - - Du kan nå utplassere blokker. + + Cyan - - Du kan nå bruke dører og brytere. + + Lime - - Du kan ikke bruke dører og brytere lenger. + + Oransje - - Du kan nå bruke beholdere (f.eks. kister). + + Hvit - - Du kan ikke bruke beholdere (f.eks. kister) lenger. + + Tilpasset - - Du kan ikke angripe vesener lenger. + + Gul - - Du kan nå angripe vesener. + + Lyseblå - - Du kan ikke angripe spillere lenger. + + Magenta - - Du kan nå angripe spillere. + + Brun - - Du kan ikke angripe dyr lenger. + + Hvitfarget glassrute - - Du kan nå angripe dyr. + + Liten ball - - Du er nå moderator. + + Stor ball - - Du er ikke moderator lenger. + + Lyseblåfarget glassrute - - Du kan nå fly. + + Magentafarget glassrute - - Du kan ikke fly lenger. + + Oransjefarget glassrute - - Du kan ikke bli utmattet lenger. + + Stjerneformet - - Du kan nå bli utmattet. + + Sort - - Du er nå usynlig. + + Rød - - Du er ikke usynlig lenger. + + Grønn - - Du er nå usårbar. + + Smygerformet - - Du er ikke usårbar lenger. + + Sprengning - - %d MSP + + Ukjent form - - Enderdragen + + Sortfarget glass - - %s har entret Slutten. + + Hesterustning av jern - - %s har forlatt Slutten. + + Hesterustning av gull - + + Hesterustning av diamant + + + Rødsteinskomparator + + + Gruvevogn med TNT + + + Gruvevogn med trakt + + + Reim + + + Lyssignal + + + Kiste med felle + + + Vektet trykkplate (lett) + + + Navnemerke + + + Treplanker (alle typer) + + + Kommandoblokk + + + Fyrverkeristjerne + + + Disse dyrene kan temmes og deretter ris på. De kan ha en kiste festet til seg. + + + Muldyr + + + 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. + + + Hest + + + Disse dyrene kan temmes og deretter ris på. + + + Esel + + + Zombiehest + + + Tomt kart + + + Underverdenstjerne + + + Fyrverkerirakett + + + Skjeletthest + + + Wither + + + Disse utformes fra Wither-hodeskaller og sjelesand. De skyter eksploderende hodeskaller mot deg. + + + Vektet trykkplate (tung) + + + Lysegråfarget leire + + + Gråfarget leire + + + Rosafarget leire + + + Blåfarget leire + + + Lillafarget leire + + + Cyanfarget leire + + + Limefarget leire + + + Oransjefarget leire + + + Hvitfarget leire + + + Farget glass + + + Gulfarget leire + + + Lyseblåfarget leire + + + Magentafarget leire + + + Brunfarget leire + + + Trakt + + + Aktivatorskinne + + + Dropper + + + Rødsteinskomparator + + + Dagslyssensor + + + Rødsteinsblokk + + + Farget leire + + + Sortfarget leire + + + Rødfarget leire + + + Grønnfarget leire + + + Høyballe + + + Herdet leire + + + Kullblokk + + + Ton til + + + 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. + + + Når dette er aktivert, beholder spillerne inventaret sitt selv om de dør. + + + Når dette er deaktivet, vil ikke vesener yngle naturlig. + + + Spillmodus: Eventyr + + + Eventyr + + + Skriv inn en seed for å skape det samme terrenget igjen. Ikke skriv noe hvis du vil ha en tilfeldig verden. + + + Når dette er deaktivert, slipper ikke monstre og dyr loot (smygere slipper for eksempel ikke krutt). + + + {*PLAYER*} falt fra en stige + + + {*PLAYER*} falt av noen slyngplanter + + + {*PLAYER*} falt ut av vannet + + + Når dette er aktivert, slipper ikke blokker gjenstander når de ødelegges (steinblokker slipper for eksempel ikke brosteiner). + + + Når dette er deaktivert, vil ikke spillere regenerere helse naturlig. + + + Når dette er deaktivert, endres ikke tiden på døgnet. + + + Gruvevogn + + + Binde fast + + + Slipp + + + Fest + + + Stig av + + + Fest kiste + + + Avfyr + + + Navngi + + + Lyssignal + + + Hovedkraft + + + Sekundærkraft + + + Hest + + + Dropper + + + Trakt + + + {*PLAYER*} falt fra et høyt sted + + + Kan ikke bruke yngleegg. Det maksimale antallet flaggermus er nådd. + + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende hester er nådd. + + + Spillalternativer + + + {*PLAYER*} ble skutt med ildkule av {*SOURCE*} med {*ITEM*} + + + {*PLAYER*} ble dengt av {*SOURCE*} med {*ITEM*} + + + {*PLAYER*} ble drept av {*SOURCE*} med {*ITEM*} + + + Destruktive vesener + + + Blokker slipper + + + Naturlig regenerasjon + + + Dagslyssyklus + + + Behold inventar + + + Vesenyngling + + + Vesenloot + + + {*PLAYER*} ble skutt av {*SOURCE*} med {*ITEM*} + + + {*PLAYER*} falt for langt og fikk sitt endelikt av {*SOURCE*} + + + {*PLAYER*} falt for langt og fikk sitt endelikt av {*SOURCE*} med {*ITEM*} + + + {*PLAYER*} gikk inn i ilden under kamp med {*SOURCE*} + + + {*PLAYER*} ble dømt til å falle av {*SOURCE*} + + + {*PLAYER*} ble dømt til å falle av {*SOURCE*} + + + {*PLAYER*} ble dømt til å falle av {*SOURCE*}, som brukte {*ITEM*} + + + {*PLAYER*} ble brent til døde i kamp med {*SOURCE*} + + + {*PLAYER*} ble sprengt i filler av {*SOURCE*} + + + {*PLAYER*} visnet hen + + + {*PLAYER*} ble slaktet av {*SOURCE*} med {*ITEM*} + + + {*PLAYER*} prøvde å svømme i lava for å komme seg unna {*SOURCE*} + + + {*PLAYER*} druknet under forsøket på å flykte fra {*SOURCE*} + + + {*PLAYER*} gikk inn i en kaktus under forsøket på å flykte fra {*SOURCE*} + + + Stig på + + + 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. + + + Fest en kiste for å gi tamme esler og muldyr saltasker. Du får tilgang til disse taskene mens du rir eller sniker. + + + 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. + + + 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. + + + Når de er temmet, vil kjærlighetshjerter dukke opp rundt dem, og de vil ikke lenger prøve å kaste spilleren av. + + -{*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*} +Prøv å ri denne hesten nå. Bruk {*CONTROLLER_ACTION_USE*} uten gjenstander eller verktøy i hånden for å stige på den. + + + + Her kan du forsøke å temme hestene og eslene, og det finnes også kister her med saler, hesterustninger og andre nyttige gjenstander til hester. + + + Et lyssignal på en pyramide med minst 4 nivåer gir deg også enten den sekundære kraften Regenerasjon eller en sterkere hovedkraft. + + + 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. + + + På toppen av denne pyramiden er det et inaktivt lyssignal. + + + Dette er lyssignalgrensesnittet, som du kan bruke til å velge kreftene som lyssignalet skal skjenke. + + + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å fortsette. + {*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker lyssignalgrensesnittet. + + + + I lyssignalmenyen kan du velge 1 hovedkraft for lyssignalet ditt. Desto flere nivåer pyramiden har, jo flere krefter får du å velge mellom. + + + 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. + + + Dette er grensesnittet for hesteinventaret. + + + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å fortsette. + {*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede vet hvordan du skal bruke hesteinventaret. + + + + Med hesteinventaret kan du overføre eller utruste gjenstander på hesten, eselet eller muldyret ditt. + + + Funkle + + + Spor + + + Flygetid: + + + Sal opp hesten din ved å plassere en sal i salplassen. Du kan gi hester rustning ved å plassere hesterustning i rustningsplassen. + + + Du har funnet et muldyr. + + + +{*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. + + + + Hester og esler finner du som oftest på åpne sletter. Muldyr kan avles fra et esel og en hest, men er ikke fruktbare selv. + + + I denne menyen kan du også overføre gjenstander mellom ditt eget inventar og saltaskene som er festet til esler og muldyr. + + + Du har funnet en hest. + + + Du har funnet et esel. + + + {*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. + + + Fyrverkeristjerner utformes ved å plassere krutt og fargestoff i utformingsnettet. + + + Fargestoffet bestemmer fargen fyrverkeristjernen får når den eksploderer. + + + Formen på fyrverkeristjernen angis ved å legge til enten en ildladning, gullklump, fjær eller vesenhode. + + + Hvis du ønsker, kan du plassere flere fyrverkeristjerner i utformingsnettet for å legge dem til fyrverkeriet. + + + Fyller du flere plasser i utformingsnettet med krutt, øker høyden som alle fyrverkeristjernene eksploderer i. + + + Du kan deretter ta det ferdige fyrverkeriet ut av utgangsfeltet når du ønsker å utforme det. + + + Spor eller funkling kan legges til ved å bruke diamanter eller glødesteinstøv. + + + + + + Fyrverkeristjernenes farger, uttoning, form, størrelse og effekter (slik som spor og funkling) kan tilpasses ved å bruke tilleggsingredienser under utformingen. + + + + + + Når en fyrverkeristjerne er ferdig utformet, kan du angi fyrverkeristjernens uttoningsfarge ved å utforme den med fargestoff. + + + I kistene her finnes det ulike gjenstander som brukes til å lage FYRVERKERI! + + + {*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. + + + For å utforme fyrverkeri plasserer du krutt og papir i 3x3-utformingsnettet som vises over inventaret ditt. + + + Dette rommet inneholder trakter + + + {*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. + + Trakter brukes til å legge i eller fjerne gjenstander fra beholdere, og til å automatisk plukke opp gjenstander som kastes inn i dem. + + + 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. + + + 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. + + + Prøv å bruke lyssignalet til å angi kreftene det gir. Du kan bruke jernbarrer til nødvendig betaling. + + + De kan påvirke bryggeapparater, kister, dispensere, droppere, gruvevogner med kister, gruvevogner med trakter samt andre trakter. + + + I dette rommet finnes det ulike nyttige traktdesign du kan se på og eksperimentere med. + + + Dette er fyrverkerigrensesnittet, som du kan bruke til å utforme fyrverkeri og fyrverkeristjerner. + + + +{*B*}Trykk på{*CONTROLLER_VK_A*} for å fortsette. +{*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker fyrverkerigrensesnittet. + + + + 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. + + + Men hvis en trakt får kraft av rødstein, blir den inaktiv og slutter både å suge og legge inn gjenstander. + + + 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. + + + Disse fiendene finnes i sumper, og de angriper deg ved å kaste eliksirer. De slipper eliksirer når de blir drept. + + + Det maksimale antallet malerier/gjenstandsrammer i en verden er nådd. + + + Du kan ikke yngle fiender i Fredelig modus. + + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende griser, sauer, kuer, katter og hester er nådd. + + + Kan ikke bruke yngleegg. Det maksimale antallet blekkspruter i en verden er nådd. + + + Kan ikke bruke yngleegg. Det maksimale antallet fiender i en verden er nådd. + + + Kan ikke bruke yngleegg. Det maksimale antallet landsbyboere i en verden er nådd. + + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende ulver er nådd. + + + Det maksimale antallet vesenhoder i en verden er nådd. + + + Inverter visning + + + Keivhendt + + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende høner er nådd. + + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende soppkuer er nådd. + + + Det maksimale antallet båter i en verden er nådd. + + + Kan ikke bruke yngleegg. Det maksimale antallet høner i en verden er nådd. + {*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*} @@ -4800,9 +2321,63 @@ Vil du installere flettepakken eller teksturpakken nå? Tilbakestille underverdenen + + %s har entret Slutten. + + + %s har forlatt Slutten. + + + +{*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*} + + Er du sikker på at du vil tilbakestille underverdenen i denne lagringen til standardinnstillinger? Du vil miste alt du har bygget i underverdenen! + + Kan ikke bruke yngleegg. Det maksimale antallet griser, sauer, kuer, katter og hester er nådd. + + + Kan ikke bruke yngleegg. Det maksimale antallet soppkuer er nådd. + + + Kan ikke bruke yngleegg. Det maksimale antallet ulver i en verden er nådd. + Tilbakestill underverdenen @@ -4810,113 +2385,11 @@ Vil du installere flettepakken eller teksturpakken nå? Ikke tilbakestill underverdenen - Kan ikke klippe denne soppkua. Det maksimale antallet griser, sauer, kuer og katter er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet griser, sauer, kuer og katter er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet soppkuer er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet ulver i en verden er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet høner i en verden er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet blekkspruter i en verden er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet fiender i en verden er nådd. - - - Kan ikke bruke yngleegg. Det maksimale antallet landsbyboere i en verden er nådd. - - - Det maksimale antallet malerier/gjenstandsrammer i en verden er nådd. - - - Du kan ikke yngle fiender i Fredelig modus. - - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende griser, sauer, kuer og katter er nådd. - - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende ulver er nådd. - - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende høner er nådd. - - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende soppkuer er nådd. - - - Det maksimale antallet båter i en verden er nådd. - - - Det maksimale antallet vesenhoder i en verden er nådd. - - - Inverter visning - - - Keivhendt + Kan ikke klippe denne soppkua. Det maksimale antallet griser, sauer, kuer, katter og hester er nådd. Du døde! - - Gjenoppstå - - - Tilbud på nedlastbart innhold - - - Bytt skall - - - Slik spiller du - - - Kontroller - - - Innstillinger - - - Medvirkende - - - Installer innhold på nytt - - - Innstillinger for feilretting - - - Spredning av ild - - - TNT-eksplosjon - - - Spiller mot spiller - - - Stol på spillere - - - Vertsrettigheter - - - Generer byggverk - - - Superflat verden - - - Bonuskiste - Verdensinnstillinger @@ -4926,18 +2399,18 @@ Vil du installere flettepakken eller teksturpakken nå? Kan bruke dører og brytere + + Generer byggverk + + + Superflat verden + + + Bonuskiste + Kan åpne beholdere - - Kan angripe spillere - - - Kan angripe dyr - - - Moderator - Spark ut spiller @@ -4947,185 +2420,299 @@ Vil du installere flettepakken eller teksturpakken nå? Deaktiver utmattelse + + Kan angripe spillere + + + Kan angripe dyr + + + Moderator + + + Vertsrettigheter + + + Slik spiller du + + + Kontroller + + + Innstillinger + + + Gjenoppstå + + + Tilbud på nedlastbart innhold + + + Bytt skall + + + Medvirkende + + + TNT-eksplosjon + + + Spiller mot spiller + + + Stol på spillere + + + Installer innhold på nytt + + + Innstillinger for feilretting + + + Spredning av ild + + + Enderdragen + + + {*PLAYER*} ble drept av enderdragens ånde. + + + {*PLAYER*} ble drept av {*SOURCE*}. + + + {*PLAYER*} ble drept av {*SOURCE*}. + + + {*PLAYER*} døde. + + + {*PLAYER*} ble sprengt i filler. + + + {*PLAYER*} ble drept av magi. + + + {*PLAYER*} ble skutt av {*SOURCE*}. + + + Grunnfjelltåke + + + Vis HUD + + + Vis hånd + + + {*PLAYER*} ble tatt av {*SOURCE*} sin ildkule. + + + {*PLAYER*} ble dengt av {*SOURCE*}. + + + {*PLAYER*} ble drept av {*SOURCE*} med magi + + + {*PLAYER*} falt ut av verdenen. + + + Teksturpakker + + + Flettepakker + + + {*PLAYER*} gikk opp i flammer. + + + Temaer + + + Spillerbilder + + + Avatarelementer + + + {*PLAYER*} brant i hjel. + + + {*PLAYER*} sultet i hjel. + + + {*PLAYER*} ble spiddet til døde. + + + {*PLAYER*} traff bakken med for mye kraft. + + + {*PLAYER*} prøvde å svømme i lava. + + + {*PLAYER*} ble kvalt i en vegg. + + + {*PLAYER*} druknet. + + + Dødsmeldinger + + + Du er ikke moderator lenger. + + + Du kan nå fly. + + + Du kan ikke fly lenger. + + + Du kan ikke angripe dyr lenger. + + + Du kan nå angripe dyr. + + + Du er nå moderator. + + + Du kan ikke bli utmattet lenger. + + + Du er nå usårbar. + + + Du er ikke usårbar lenger. + + + %d MSP + + + Du kan nå bli utmattet. + + + Du er nå usynlig. + + + Du er ikke usynlig lenger. + + + Du kan nå angripe spillere. + + + Du kan nå utvinne fra eller bruke gjenstander. + + + Du kan ikke lenger utplassere blokker. + + + Du kan nå utplassere blokker. + + + Animert karakter + + + Spesialanimasjon for skall + + + Du kan ikke lenger utvinne fra eller bruke gjenstander. + + + Du kan nå bruke dører og brytere. + + + Du kan ikke angripe vesener lenger. + + + Du kan nå angripe vesener. + + + Du kan ikke angripe spillere lenger. + + + Du kan ikke bruke dører og brytere lenger. + + + Du kan nå bruke beholdere (f.eks. kister). + + + Du kan ikke bruke beholdere (f.eks. kister) lenger. + Usynlig - - Vertsalternativer + + Lyssignaler - - Spillere/invitasjon + + {*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*} - - Onlinespill + + Fyrverkeri - - Kun inviterte + + Språk - - Flere alternativer + + Hester - - Last inn + + {*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*} - - Ny verden + + {*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. + - - Navn på verden + + {*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. - - Seed for verdensgenerator + + 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. - - La være blank for tilfeldig seed. + + Slippes av Wither, brukes til å utforme lyssignaler. - - Spillere + + Trakter - - Bli med i spill + + {*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*} - - Start spill + + Droppere - - Fant ingen spill - - - Spill - - - Poengtavler - - - Hjelp og alternativer - - - Lås opp fullversjon - - - Fortsett spill - - - Lagre spill - - - Vanskelighetsgrad: - - - Spilltype - - - Byggverk: - - - Nivåtype: - - - PvP: - - - Stol på spillere: - - - TNT: - - - Spredning av ild: - - - Installer tema på nytt - - - Installer spillerbilde 1 på nytt - - - Installer spillerbilde 2 på nytt - - - Installer avatarelement 1 på nytt - - - Installer avatarelement 2 på nytt - - - Installer avatarelement 3 på nytt - - - Alternativer - - - Lyd - - - Følsomhet - - - Grafikk - - - Brukergrensesnitt - - - Tilbakestill til standarder - - - Vis gå-animasjon - - - Hint - - - Verktøytips i spillet - - - Vertikalt delt skjerm (for 2) - - - Ferdig - - - Rediger skiltmelding: - - - Fyll inn detaljene som skal følge med skjermbildet ditt. - - - Bildetekst - - - Skjermbilde fra spillet - - - Rediger skiltmelding: - - - De(t) klassiske Minecraft-teksturene, -ikonene og -brukergrensesnittet! - - - Vis alle fletteverdener - - - Ingen effekter - - - Hurtighet - - - Treghet - - - Hastverk - - - Utmattethet - - - Styrke - - - Svakhet + + Øyeblikkelig helse @@ -5136,62 +2723,3299 @@ Vil du installere flettepakken eller teksturpakken nå? Hoppstyrke + + Utmattethet + + + Styrke + + + Svakhet + Kvalme + + + + + + + + + Regenerasjon Motstand - - Ildmotstand + + Finner seed for verdensgenerator - - Pusting i vann + + Når dette er aktivert, skapes det fargerike eksplosjoner. Fargen, effekten, formen og toningen avgjøres av fyrverkeristjernen som brukes når fyrverket skapes. - - Usynlighet + + En type skinne som kan aktivere eller deaktivere gruvevogner med trakt og utløse gruvevogner med TNT. - - Blindhet + + Brukes til å holde og slippe gjenstander, eller dytte gjenstander inn i en annen beholder når den gis en rødsteinladning. - - Nattsyn + + Fargerike blokker som utformes ved å farge herdet leire - - Sult + + Gir en rødsteinladning. Ladningen blir sterkere hvis det er flere gjenstander på platen. Trenger mer vekt enn den lette platen. + + + Brukes som en rødsteinkraftkilde. Kan utformes tilbake til rødstein. + + + Brukes til å ta gjenstander eller overføre gjenstander inn og ut av beholdere. + + + Kan mates til hester, esler eller muldyr for å helbrede med inntil 10 hjerter. Gjør at føll vokser raskere. + + + Flaggermus + + + Disse flygende skapningene finner du i huler eller andre store, innkapslede steder. + + + Heks + + + Lages ved å smelte leire i en smelteovn. + + + Utformet fra glass og fargestoff. + + + Utformet av farget glass + + + Gir en rødsteinladning. Ladningen blir sterkere hvis det er flere gjenstander på platen. + + + En blokk som sender ut et rødsteinsignal basert på sollys (eller mangel på sollys). + + + 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. + + + En spesiell type rustning som hesten kan utrustes med. Gir 5 i rustning. + + + Brukes til å avgjøre fargen, effekten og formen til et fyrverkeri. + + + Brukes i rødsteinkretser til å opprettholde, sammenligne eller trekke fra signalstyrke, eller til å måle visse blokktilstander. + + + En type gruvevogn som fungerer som en TNT-blokk i bevegelse. + + + En spesiell type rustning som hesten kan utrustes med. Gir 7 i rustning. + + + Brukes til å utføre kommandoer. + + + Sender en lysstråle mot himmelen og kan gi statuseffekter til spillere i nærheten. + + + 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. + + + En spesiell type rustning som hesten kan utrustes med. Gir 11 i rustning. + + + Brukes til å binde vesener til spilleren eller til gjerdestolper + + + Brukes til å gi navn til vesener i verdenen. + + + Hastverk + + + Lås opp fullversjon + + + Fortsett spill + + + Lagre spill + + + Spill + + + Poengtavler + + + Hjelp og alternativer + + + Vanskelighetsgrad: + + + PvP: + + + Stol på spillere: + + + TNT: + + + Spilltype + + + Byggverk: + + + Nivåtype: + + + Fant ingen spill + + + 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 + + + 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. + + + Jerngolem + + + Finnes i landsbyer for beskyttelse. Kan lages ved hjelp av jernblokker og gresskar. + + + Finnes i underverdenen. På samme måte som slimer deler de seg i mindre biter når de blir drept. + + + Landsbyboer + + + Ozelot + + + Gjør det mulig å lage sterkere fortryllelser hvis den plasseres ved fortryllelsesbordet. + + + {*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. + + + {*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. + + + {*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. + + + {*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. + + + {*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. + + + {*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. + + + {*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*} + + + {*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. + + + {*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. + + + Neste side + + + {*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. + + + {*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. + + + {*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? + + + Ingen på Mojang har noensinne sett ansiktet til Junkboy. + + + Visste du at det finnes en Minecraft Wiki? + + + Ikke se rett på insektene. + + + Smygere ble til etter en kodefeil. + + + Er det en høne eller en and? + + + Mojangs nye lokaler er kule! + + + {*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*}. + + + {*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. + + + {*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. + + + Minecon 2013 var i Orlando i Florida! + + + .party() var glimrende! + + + Gå alltid ut fra at rykter er usanne snarere enn sanne! + + + Forrige side + + + Handel + + + Ambolt + + + Slutten + + + Sperre nivåer + + + Kreativ modus + + + Verts- og spilleralternativer + + + {*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. + + + {*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*} + + + Påfører mer skade enn med hendene. + + + Brukes til å grave i jord, gress, sand, grus og snø raskere enn for hånd. Spader kreves for å grave opp snøballer. + + + Spurte + + + Nyheter + + + {*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*} + + + Dele skjermbilder + + + Kister + + + Utforming + + + Smelteovn + + + Grunnleggende + + + HUD + + + Inventar + + + Dispenser + + + Fortryllelse + + + Portaler + + + Flerspiller + + + Dyrehold + + + Dyreavl + + + Brygging + + + deadmau5 liker Minecraft! + + + Grisemenn angriper deg ikke – med mindre du angriper dem. + + + Du kan endre returneringspunktet og spole frem til neste dag ved å sove i en seng. + + + Slå ildkulene tilbake på geisten! + + + Lag noen fakler for belysning når det er mørkt. Monstrene holder seg unna området rundt faklene. + + + Du kommer deg raskere frem med en gruvevogn og skinner! + + + Plant noen trær og se dem vokse seg store. + + + Ved å bygge en portal kan du reise til en annen dimensjon – underverdenen. + + + Å grave rett ned eller rett opp er ikke særlig lurt. + + + Beinmel (laget av skjelettbein) kan brukes som gjødsel og få ting til å vokse umiddelbart! + + + Smygere eksploderer når de kommer i nærheten av deg! + + + Trykk på {*CONTROLLER_VK_B*} for å slippe det du holder i hånden! + + + Bruk det rette verktøyet til jobben! + + + Hvis du ikke finner noe kull til faklene dine, kan du alltids lage trekull av trær i en smelteovn. + + + Du får mer helse av å spise tilberedte koteletter enn rå. + + + Hvis vanskelighetsgraden er "Fredelig", vil helsen din regenereres automatisk, og det dukker ikke opp monstre om natten! + + + Gi en ulv et bein for å temme den. Deretter kan du få den til å sitte eller følge deg. + + + Du kan slippe gjenstander i Inventar-menyen ved å trykke på{*CONTROLLER_VK_A*}utenfor menyen. + + + Nytt nedlastbart innhold tilgjengelig! Du finner det via knappen Minecraft-butikken i hovedmenyen. + + + Du kan endre utseendet til karakteren din med en skallpakke fra Minecraft-butikken. Velg Minecraft-butikken i hovedmenyen for å se hva som er tilgjengelig. + + + Endre gammainnstillingene for å gjøre spillet lysere eller mørkere. + + + 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. + + + Bruk en krafse for å gjøre jorda klar til planting. + + + Edderkopper angriper ikke på dagen – med mindre du angriper dem først. + + + Det går fortere å grave i jord eller sand med en spade enn med hendene! + + + Høst inn koteletter fra griser, så kan du tilberede og spise dem for å gjenvinne helse. + + + Høst inn skinn fra storfe, så kan du bruke det til å lage rustning. + + + Hvis du har en tom bøtte, kan du fylle den med vann, lava eller melk fra kuer! + + + Obsidian skapes når vann treffer en lavablokk. + + + Nå finnes det stablebare gjerder i spillet! + + + Noen dyr følger etter deg hvis du har hvete i hånden. + + + Dersom et dyr ikke kan bevege seg mer enn 20 blokker i en retning, vil det ikke forsvinne. + + + Tamme ulvers helsenivå ser du på halens stilling. Mat dem for å helbrede dem. + + + Tilbered kaktus i en smelteovn for å lage grønt fargestoff. + + + Du finner mye nyttig informasjon i "Slik spiller du"-menyene! + + + Musikk av C418! + + + Hvem er Notch? + + + Mojang har flere priser enn ansatte! + + + Det finnes noen kjendiser som spiller Minecraft! + + + Notch har over en million følgere på twitter! + + + Ikke alle svensker er blonde. Det finnes til og med noen rødhåringer, som for eksempel Jens fra Mojang! + + + Det kommer snart en oppdatering til dette spillet! + + + Ved å plassere to kister ved siden av hverandre lager du en stor kiste. + + + Vær forsiktig når du bygger ting av ull i åpent landskap, ettersom lynnedslag kan få det til å begynne å brenne. + + + Én bøtte med lava kan brukes til å smelte 100 blokker i en smelteovn. + + + Hvilket instrument noteblokker spiller, avhenger av materialet under dem. + + + Det kan gå noen minutter før lavaen forsvinner HELT når kildeblokken fjernes. + + + Brosteiner tåler ildkuler fra geister, noe som gjør at de er nyttige til å verne portaler. + + + Blokker som kan brukes som lyskilder, kan også smelte snø og is. Dette inkluderer fakler, glødesteiner og gresskarlykter. + + + Zombier og skjeletter kan overleve dagslyset dersom de befinner seg i vann. + + + Høner legger egg hvert 5. til 10. minutt. + + + Obsidian kan kun utvinnes med en diamanthakke. + + + Smygere er den lettest tilgjengelige kilden til krutt. + + + Hvis du angriper en ulv, vil andre ulver i nærheten bli fiendtlige og angripe deg. Det samme gjelder for zombie-grisemenn. + + + Ulver kan ikke gå ned i underverdenen. + + + Ulver angriper ikke smygere. + + + Kreves for å hugge ut steinrelaterte blokker og malm. + + + Brukes i kakeoppskriften og som ingrediens for å brygge eliksirer. + + + 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. + + + 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. + + + Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage et gulleple. + + + Gir deg 2 {*ICON_SHANK_01*} og regenererer helsen din i 4 sekunder. Lages av et eple og gullklumper. + + + Gir deg 2 {*ICON_SHANK_01*}. Kan føre til matforgiftning. + + + Brukes i rødsteinkretser som repeater, forsinker og/eller diode. + + + Brukes til å kjøre gruvevogner på. + + + Når den forsynes med kraft, akselererer gruvevogner på den. Når den ikke forsynes med kraft, stopper gruvevogner på den. + + + Fungerer som en trykkplate (sender et rødsteinsignal når den forsynes med kraft), men kan kun aktiveres av gruvevogner. + + + 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. + + + Brukes til å fylles med og mate ut gjenstander i tilfeldig rekkefølge etter at den gis en rødsteinladning. + + + Spiller en note ved utløsning. Slå den for å endre tonehøyde. Ved å plassere den på ulike blokker endrer du typen instrument som brukes. + + + Gir deg 2,5 {*ICON_SHANK_01*}. Lages ved å tilberede en rå fisk i en smelteovn. + + + Gir deg 1 {*ICON_SHANK_01*}. + + + Gir deg 1 {*ICON_SHANK_01*}. + + + Gir deg 3 {*ICON_SHANK_01*}. + + + Brukes som ammunisjon til buer. + + + Gir deg 2,5 {*ICON_SHANK_01*}. + + + Gir deg 1 {*ICON_SHANK_01*}. Kan brukes 6 ganger. + + + Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan gjøre deg syk. + + + Gir deg 1,3 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. + + + Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede en rå svinekotelett i en smelteovn. + + + Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan også brukes til å mate og temme en ozelot. + + + Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede rå kylling i en smelteovn. + + + Gir deg 1,5 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. + + + Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede rått oksekjøtt i en smelteovn. + + + Brukes til å transportere deg, et dyr eller et monster på skinnene. + + + Brukes som fargestoff for å lage lyseblå ull. + + + Brukes som fargestoff for å lage turkis ull. + + + Brukes som fargestoff for å lage lilla ull. + + + Brukes som fargestoff for å lage limegrønn ull. + + + Brukes som fargestoff for å lage grå ull. + + + 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.) + + + Brukes som fargestoff for å lage magentarød ull. + + + Brukes til å lage skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. + + + Brukes til å lage bøker og kart. + + + Kan brukes til å lage bokhyller eller fortrylles om til fortryllede bøker. + + + Brukes som fargestoff for å lage blå ull. + + + Spiller musikkplater + + + Bruk disse til å lage ekstra sterke verktøy, våpen eller rustninger. + + + Brukes som fargestoff for å lage oransje ull. + + + Fås fra sauer og kan farges med fargestoffer. + + + Brukes som et bygningsmateriale og kan farges med fargestoffer. Denne oppskriften anbefales ikke, ettersom ull enkelt kan fås fra sauer. + + + Brukes som fargestoff for å lage svart ull. + + + Brukes til å transportere varer på skinnene. + + + Går på skinner og kan drive andre gruvevogner når du skuffer kull inn i den. + + + Brukes til å komme deg fortere fram i vann enn ved å svømme. + + + Brukes som fargestoff for å lage grønn ull. + + + Brukes som fargestoff for å lage rød ull. + + + Brukes til å få avlinger, trær, høyt gress, digre sopper og blomster til å vokse umiddelbart, og kan i tillegg brukes til farging. + + + Brukes som fargestoff for å lage rosa ull. + + + Brukes som fargestoff for å lage brun ull, som ingrediens i kjeks, eller til å dyrke kakaofrukter. + + + Brukes som fargestoff for å lage sølvfarget ull. + + + Brukes som fargestoff for å lage gul ull. + + + Kan brukes med piler til angrep fra langt hold. + + + Gir brukeren 5 i rustning. + + + Gir brukeren 3 i rustning. + + + Gir brukeren 1 i rustning. + + + Gir brukeren 5 i rustning. + + + Gir brukeren 2 i rustning. + + + Gir brukeren 2 i rustning. + + + Gir brukeren 3 i rustning. + + + En skinnende barre som kan brukes til å utforme verktøy laget av dette materialet. Lages ved å smelte malm i en smelteovn. + + + 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. + + + 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. + + + Gir brukeren 8 i rustning. + + + Gir brukeren 6 i rustning. + + + Gir brukeren 3 i rustning. + + + Gir brukeren 6 i rustning. + + + Jerndører kan kun åpnes med rødstein, knapper eller brytere. + + + Gir brukeren 1 i rustning. + + + Gir brukeren 3 i rustning. + + + Brukes til å hugge ut trerelaterte blokker raskere enn for hånd. + + + Brukes til å gjøre jord- og gressblokker klare til dyrking. + + + Tredører aktiveres ved å bruke dem, slå på dem eller ved hjelp av rødstein. + + + Gir brukeren 2 i rustning. + + + Gir brukeren 4 i rustning. + + + Gir brukeren 1 i rustning. + + + Gir brukeren 2 i rustning. + + + Gir brukeren 1 i rustning. + + + Gir brukeren 2 i rustning. + + + Gir brukeren 5 i rustning. + + + Brukes til kompakte trapper. + + + Brukes til å ha soppstuing oppi. Du beholder bollen når stuingen er spist opp. + + + Brukes til å oppbevare og frakte vann, lava og melk. + + + Brukes til å oppbevare og frakte vann. + + + Viser tekst som du eller andre spillere har skrevet inn. + + + Brukes til å oppnå et skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. + + + Brukes til å skape eksplosjoner. Aktiveres etter utplassering ved å tennes med tennstål eller med en elektrisk ladning. + + + Brukes til å oppbevare og frakte lava. + + + Viser solens og månens posisjon. + + + Peker mot startpunktet ditt. + + + Gir deg et bilde av et utforsket område. Kan brukes til å finne vei. + + + Brukes til å oppbevare og frakte melk. + + + Brukes til å lage ild, tenne TNT og åpne portaler etter at de er bygget. + + + Brukes til å fange fisk. + + + 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. + + + Brukes som et bygningsmateriale og kan lages om til mange ting. Kan utformes av alle typer tre. + + + Brukes som et bygningsmateriale. Påvirkes ikke av tyngdekraft slik som vanlig sand. + + + Brukes som et bygningsmateriale. + + + Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + + Brukes til å lage lange trapper. To heller plassert oppå hverandre skaper en helleblokk av vanlig størrelse. + + + Brukes til å lage lys. Fakler kan også smelte snø og is. + + + Brukes til å lage fakler, piler, skilt, stiger, gjerder samt skaft til verktøy og våpen. + + + Til oppbevaring av blokker og gjenstander. Plasser to kister ved siden av hverandre for å lage en større kiste med dobbel kapasitet. + + + 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. + + + Brukes til å klatre sidelengs. + + + 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. + + + Gjør det mulig å utforme et mer variert utvalg av gjenstander enn ved vanlig utforming. + + + Gjør det mulig å smelte malm, lage trekull og glass, og tilberede fisk og koteletter. + + + Jernøks + + + Rødsteinlampe + + + Jungeltretrapp + + + Bjørketrapp + + + Gjeldende kontroller + + + Hodeskalle + + + Kakao + + + Grantrapp + + + Drageegg + + + Sluttstein + + + Sluttportalramme + + + Sandsteintrapp + + + Bregne + + + Kratt + + + Oppsett + + + Utforming + + + Bruk + + + Handling + + + Snik / fly ned + + + Snik + + + Slipp + + + Bytt gjenstand + + + Pause + + + Se + + + Gå/spurt + + + Inventar + + + Hopp / fly opp + + + Hopp + + + Sluttportal + + + Gresskarstilk + + + Melon + + + Glassrute + + + Grind + + + Slyngplante + + + Melonstilk + + + Jernstenger + + + Sprukne mursteiner + + + Mosegrodde mursteiner + + + Mursteiner + + + Sopp + + + Sopp + + + Meislede mursteiner + + + Teglsteinstrapp + + + Underverdenvorte + + + Underverdensteinstrapp + + + Underverdensteinsgjerde + + + Gryte + + + Bryggeapparat + + + Fortryllelsesbord + + + Underverdenstein + + + Sølvkrebrostein + + + Sølvkrestein + + + Mursteinstrapp + + + Liljeplatting + + + Mycelium + + + Sølvkremurstein + + + Endre kameramodus + + + 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. + + + 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. + + + Etter hvert som du samler og lager flere ting, vil inventaret ditt fylles opp.{*B*} + Trykk på {*CONTROLLER_ACTION_INVENTORY*} for å åpne inventaret. + + + Trevirket du har samlet inn, kan utformes til planker. Åpne utformingsgrensesnittet for å gjøre dette.{*PlanksIcon*} + + + 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*} + + + 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. + + + Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne Utforming. + + + 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. + + + Bruk {*CONTROLLER_ACTION_MOVE*} for å bevege deg. + + + Bruk {*CONTROLLER_ACTION_LOOK*} for å se opp, ned og rundt deg. + + + 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. + + + 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. + + + Trykk på {*CONTROLLER_ACTION_JUMP*} for å hoppe. + + + 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*} + + + 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. + + + + Åpne beholderen + + + 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*} + + + 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 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. + + + + I nærheten er det et forlatt gruveskur som du kan bygge opp og bruke som tilfluktssted for natten. + + + + 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*} + + + 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. + + + Bruk {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for å endre hva du holder i hånden. + + + 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*} + + + 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*} + + + Pek markøren på utformingsbordet, og trykk på {*CONTROLLER_ACTION_USE*} for å åpne det. + + + Når du har valgt utformingsbordet, peker du markøren på ønsket sted og velger {*CONTROLLER_ACTION_USE*} for å utplassere et utformingsbord. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Oppsett 1 + + + Bevegelse (under flyvning) + + + Spillere/invitasjon + + + + + + Oppsett 3 + + + Oppsett 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Trykk på {*CONTROLLER_VK_A*} for å fortsette. + + + + + + + + + + + + + + + + + + + + + + + + + + + Sølvkreblokk + + + Steinhelle + + + En kompakt måte å lagre jern på. + + + Jernblokk + + + Eiketrehelle + + + Sandsteinhelle + + + Steinhelle + + + En kompakt måte å lagre gull på. + + + Blomst + + + Hvit ull + + + Oransje ull + + + Gullblokk + + + Sopp + + + Rose + + + Brosteinshelle + + + Bokhylle + + + TNT + + + Teglsteiner + + + Fakkel + + + Obsidian + + + Mosestein + + + Underverdensteinshelle + + + Eikehelle + + + Mursteinshelle + + + Teglsteinshelle + + + Jungeltrehelle + + + Bjørkehelle + + + Granhelle + + + Magentarød ull + + + Bjørkeløv + + + Granløv + + + Eikeløv + + + Glass + + + Svamp + + + Jungeltreløv + + + Løv + + + Eik + + + Gran + + + Bjørk + + + Grantre + + + Bjørketre + + + Jungeltre + + + Ull + + + Rosa ull + + + Grå ull + + + Lysegrå ull + + + Lyseblå ull + + + Gul ull + + + Limegrønn ull + + + Turkis ull + + + Grønn ull + + + Rød ull + + + Svart ull + + + Lilla ull + + + Blå ull + + + Brun ull + + + Fakkel (kull) + + + Glødestein + + + Sjelesand + + + Underverdenstein + + + Lasursteinblokk + + + Lasursteinmalm + + + Portal + + + Gresskarlykt + + + Sukkerrør + + + Leire + + + Kaktus + + + Gresskar + + + Gjerde + + + Platespiller + + + En kompakt måte å lagre lasurstein på. + + + Fallem + + + Låst kiste + + + Diode + + + Klistrestempel + + + Stempel + + + Ull (alle farger) + + + Død busk + + + Kake + + + Noteblokk + + + Dispenser + + + Høyt gress + + + Spindelvev + + + Seng + + + Is + + + Utformingsbord + + + En kompakt måte å lagre diamanter på. + + + Diamantblokk + + + Smelteovn + + + Dyrkbar jord + + + Avlinger + + + Diamantmalm + + + Monsteryngler + + + Ild + + + Fakkel (trekull) + + + Rødsteinstøv + + + Kiste + + + Eiketrapper + + + Skilt + + + Rødsteinmalm + + + Jerndør + + + Trykkplate + + + Snø + + + Knapp + + + Rødsteinfakkel + + + Spak + + + Skinne + + + Stige + + + Tredør + + + Steintrapp + + + Detektorskinne + + + Kraftskinne + + + Du har samlet nok brosteiner til å bygge en smelteovn. Lag en på utformingsbordet. + + + Fiskestang + + + Klokke + + + Glødesteinstøv + + + Gruvevogn med ovn + + + Egg + + + Kompass + + + Rå fisk + + + Rosenrød + + + Kaktusgrønn + + + Kakaobønner + + + Tilberedt fisk + + + Fargestoff + + + Blekkpose + + + Gruvevogn med kiste + + + Snøball + + + Båt + + + Skinn + + + Gruvevogn + + + Sal + + + Rødstein + + + Melkespann + + + Papir + + + Bok + + + Slimball + + + Murstein + + + Leire + + + Sukkerrør + + + Lasurstein + + + Kart + + + Musikkplate – "13" + + + Musikkplate – "cat" + + + Seng + + + Rødsteinrepeater + + + Kjeks + + + Musikkplate – "blocks" + + + Musikkplate – "mellohi" + + + Musikkplate – "stal" + + + Musikkplate – "strad" + + + Musikkplate – "chirp" + + + Musikkplate – "far" + + + Musikkplate – "mall" + + + Kake + + + Grått fargestoff + + + Rosa fargestoff + + + Limegrønt fargestoff + + + Lilla fargestoff + + + Turkis fargestoff + + + Lysegrått fargestoff + + + Løvetanngul + + + Beinmel + + + Bein + + + Sukker + + + Lyseblått fargestoff + + + Magenta fargestoff + + + Oransje fargestoff + + + Skilt + + + Skinnkjortel + + + Brystplate av jern + + + Diamantbrystplate + + + Jernhjelm + + + Diamanthjelm + + + Gullhjelm + + + Brystplate av gull + + + Bukser av gull + + + Skinnstøvler + + + Jernstøvler + + + Skinnbukser + + + Bukser av jern + + + Bukser av diamant + + + Skinnhatt + + + Steinkrafse + + + Jernkrafse + + + Diamantkrafse + + + Diamantøks + + + Gulløks + + + Trekrafse + + + Gullkrafse + + + Brynjebrystplate + + + Brynjebukser + + + Brynjestøvler + + + Tredør + + + Jerndør + + + Brynjehjelm + + + Diamantstøvler + + + Fjær + + + Krutt + + + Hvetefrø + + + Bolle + + + Soppstuing + + + Hyssing + + + Hvete + + + Tilberedt kotelett + + + Maleri + + + Gulleple + + + Brød + + + Flint + + + Rå kotelett + + + Pinne + + + Bøtte + + + Vannbøtte + + + Lavabøtte + + + Gullstøvler + + + Jernbarre + + + Gullbarre + + + Tennstål + + + Kull + + + Trekull + + + Diamant + + + Eple + + + Bue + + + Pil + + + Musikkplate – "ward" + + + + Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Byggverk-gruppen.{*ToolsIcon*} + + + + + Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Verktøy-gruppen.{*ToolsIcon*} + + + + + 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. + + + + + 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. + + + + 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*} + + + + 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*} + + + + Trevirket du har samlet inn, kan utformes til planker. Velg plankeikonet og trykk på {*CONTROLLER_VK_A*} for å gjøre dette.{*PlanksIcon*} + + + + 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. + + + + 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. + + + + 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. + + + + + Du får så se en liste over hvilke ingredienser som kreves for å lage den valgte gjenstanden. + + + + + Nå ser du en beskrivelse av den valgte gjenstanden. Beskrivelsen kan gi deg en pekepinn på hva gjenstanden kan brukes til. + + + + + 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. + + + + + Visse gjenstander kan ikke lages med utformingsbordet, men krever en smelteovn. Lag en smelteovn nå.{*FurnaceIcon*} + + + + Grus + + + Gullmalm + + + Jernmalm + + + Lava + + + Sand + + + Sandstein + + + Kullmalm + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker en smelteovn. + + + + + Dette er smelteovngrensesnittet. Med en smelteovn kan du omskape gjenstander. Du kan for eksempel gjøre jernmalm om til jernbarrer. + + + + + 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. + + + + Tre + + + Eiketre + + + 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. + + + + {*B*} + Trykk på {*CONTROLLER_VK_X*} for å vise inventaret igjen. + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker inventaret. + + + + 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. + + + + + {*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. + + + + Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. + + + + 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. + + + 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. + + + + + Du har fullført første del av opplæringen. + + + + 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. + + + 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. + + + Bruk {*CONTROLLER_ACTION_USE*} for å plassere smelteovnen i verdenen, og så kan du åpne den. + + + 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*} + + + Bruk {*CONTROLLER_ACTION_USE*} for å plassere døren. Du kan bruke {*CONTROLLER_ACTION_USE*} for å åpne og lukke tredører i verdenen. + + + 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*} + + + + Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + +Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har samlet, og lage nye gjenstander. + + + + Trykk på {*CONTROLLER_VK_B*} nå for å gå ut av inventaret for kreativ modus. + + + + + Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + {*B*} + Trykk på {*CONTROLLER_VK_X*} for å se hvilke ingredienser som kreves for å lage den aktuelle gjenstanden. + + + + {*B*} + Trykk på {*CONTROLLER_VK_X*} for å se en beskrivelse av gjenstanden. + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du utformer ting. + + + + 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. + + + {*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. + + + + + Dette er inventaret for kreativ modus. Her finner du gjenstander du kan ta i hånden, og andre ting du kan velge. + + + + + Trykk nå på {*CONTROLLER_VK_B*} for å gå ut av inventaret. + + + + 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*}. + + + + +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. + + + + 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. + + + + Vann + + + Glassflaske + + + Vannflaske + + + Edderkoppøye + + + Gullklump + + + Underverdenvorte + + + {*splash*}{*prefix*}eliksir {*postfix*} + + + Gjæret edderkoppøye + + + Gryte + + + Enderøye + + + Strålende melon + + + Blusspulver + + + Magmakrem + + + Bryggeapparat + + + Geisttåre + + + Gresskarfrø + + + Melonfrø + + + Rå kylling + + + Musikkplate – "11" + + + Musikkplate – "where are we now" + + + Sauesaks + + + Tilberedt kylling + + + Enderperle + + + Melonskive + + + Blusstav + + + Rått kjøtt + + + Biff + + + Råttent kjøtt + + + Flaske med fortryllelse + + + Planker av eik + + + Planker av gran + + + Planker av bjørk + + + Gressblokk + + + Jord + + + Brostein + + + Planker av jungeltre + + + Ungbjørk + + + Ungt jungeltre + + + Grunnfjell + + + Ungtre + + + Ungeik + + + Unggran + + + Stein + + + Gjenstandsramme + + + Yngler {*CREATURE*} + + + Underverdenstein + + + Ildladning + + + Ildladning (trekull) + + + Ildladning (kull) + + + Hodeskalle + + + Hode + + + %s sitt hode + + + Smygerhode + + + Skjelettskalle + + + Vissenskjelettskalle + + + Zombiehode + + + 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 utmattethet + + + for hastverk + + + for svakhet + + + for styrke + + + Ildmotstand + + + Metning + for motstand - - for ildmotstand + + for hopping - - for pusting i vann + + Wither - - for usynlighet + + Helseboost - - for blindhet - - - for nattsyn - - - for sult - - - for gift + + Absorbering @@ -5232,9 +6065,78 @@ Vil du installere flettepakken eller teksturpakken nå? III + + for usynlighet + IV + + for pusting i vann + + + for ildmotstand + + + for nattsyn + + + for gift + + + for sult + + + for absorbering + + + for metning + + + for helseboost + + + for blindhet + + + for forfall + + + Naturlig + + + Tynn + + + Uklar + + + Klar + + + Melkaktig + + + Rar + + + Smøraktig + + + Jevn + + + Klønete + + + Flat + + + Klumpete + + + Smakløs + Sprutende @@ -5244,50 +6146,14 @@ Vil du installere flettepakken eller teksturpakken nå? Uinteressant - - Smakløs + + Flott - - Klar + + Saftig - - Melkaktig - - - Uklar - - - Naturlig - - - Tynn - - - Rar - - - Flat - - - Klumpete - - - Klønete - - - Smøraktig - - - Jevn - - - Glatt - - - Sofistikert - - - Tykk + + Sjarmerende Elegant @@ -5295,149 +6161,152 @@ Vil du installere flettepakken eller teksturpakken nå? Fornem - - Sjarmerende - - - Flott - - - Raffinert - - - Saftig - Sprudlende - - Kraftig - - - Motbydelig - - - Luktfri - Stram Frastøtende + + Luktfri + + + Kraftig + + + Motbydelig + + + Glatt + + + Raffinert + + + Tykk + + + Sofistikert + + + Gjenoppretter helsen til berørte spillere, dyr og monstre over tid. + + + Reduserer helsen til berørte spillere, dyr og monstre umiddelbart. + + + 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. + 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. + + + Basisen for alle eliksirer. Brukes i et bryggeapparat for å lage eliksirer. + Ekkel Illeluktende - - Basisen for alle eliksirer. Brukes i et bryggeapparat for å lage eliksirer. - - - 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. - - - Reduserer 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. - - - 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. - - - Reduserer helsen til berørte spillere, dyr og monstre umiddelbart. - - - Gjenoppretter helsen til berørte spillere, dyr og monstre over tid. - - - Gjør berørte spillere, dyr og monstre immune mot ild, lava og blussangrep fra langt hold. - - - Reduserer helsen til berørte spillere, dyr og monstre over tid. + + Utdrivelse Skarphet - - Utdrivelse + + Reduserer helsen til berørte spillere, dyr og monstre over tid. - - Leddyrets skrekk + + Angrepsskade Tilbakeslag - - Ild + + Leddyrets skrekk - - Beskyttelse + + Hastighet - - Brannbeskyttelse + + Zombie-forsterkninger - - Fjærfall + + Hestens hoppestyrke - - Eksplosjonsbeskyttelse + + Når dette brukes: - - Prosjektilbeskyttelse + + Tilbakeslagmotstand - - Respirasjon + + Vesenrekkevidde - - Vannmann - - - Effektivitet + + Maksimal helse Silkeberøring - - Uknuselig + + Effektivitet - - Plyndring + + Vannmann Hell - - Kraft + + Plyndring - - Flamme + + Uknuselig - - Tilbakeslag + + Brannbeskyttelse - - Uendelig + + Beskyttelse - - I + + Ild - - II + + Fjærfall - - III + + Respirasjon + + + Prosjektilbeskyttelse + + + Eksplosjonsbeskyttelse IV @@ -5448,23 +6317,29 @@ Vil du installere flettepakken eller teksturpakken nå? VI + + Tilbakeslag + VII - - VIII + + III - - IX + + Flamme - - X + + Kraft - - Kan utvinnes med en hakke eller bedre for å skaffe smaragder. + + Uendelig - - Likner på en vanlig kiste, bortsett fra at ting som plasseres i en enderkiste er tilgjengelig i alle spillerens enderkister, selv i forskjellige dimensjoner. + + II + + + I Aktiveres når noen går gjennom en tilkoblet snubletråd. @@ -5475,44 +6350,59 @@ Vil du installere flettepakken eller teksturpakken nå? En kompakt måte å lagre smaragder på. - - En mur laget av brostein. + + Likner på en vanlig kiste, bortsett fra at ting som plasseres i en enderkiste er tilgjengelig i alle spillerens enderkister, selv i forskjellige dimensjoner. - - Kan brukes til å reparere våpen, verktøy og rustninger. + + IX - - Smeltet i en smelteovn for å produsere underkvarts. + + VIII - - Brukes som dekorasjon. + + Kan utvinnes med en hakke eller bedre for å skaffe smaragder. - - Kan byttes med landsbyboere. - - - Brukes som dekorasjon. Blomster, små trær, kaktuser og sopp kan plantes i den. + + X Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage en gullrot. Kan plantes i dyrkbar jord. + + Brukes som dekorasjon. Blomster, små trær, kaktuser og sopp kan plantes i den. + + + En mur laget av brostein. + Gir deg 0,5 {*ICON_SHANK_01*} eller kan tilberedes i en smelteovn. Kan plantes i dyrkbar jord. - - Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede en potet i en smelteovn. + + Smeltet i en smelteovn for å produsere underkvarts. + + + Kan brukes til å reparere våpen, verktøy og rustninger. + + + Kan byttes med landsbyboere. + + + Brukes som dekorasjon. + + + Gir deg 4 {*ICON_SHANK_01*}. - 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. + 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 4 {*ICON_SHANK_01*}. + + Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede en potet i en smelteovn. + + + Gir deg 3 {*ICON_SHANK_01*}. Lages av en gulrot og gullklumper. Brukes med en ambolt for å fortrylle våpen, verktøy eller rustninger. @@ -5520,6 +6410,15 @@ Vil du installere flettepakken eller teksturpakken nå? 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 + + Gresskarpai - - Potet - - - 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,72 +6557,77 @@ 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å. + + + + Farge + + + + Hvis du vil begynne å jobbe med noe, må du plassere det på det første inngangsfeltet. @@ -5742,9 +6637,9 @@ Vil du installere flettepakken eller teksturpakken nå? Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker amboltgrensesnittet. - + - Hvis du vil begynne å jobbe med noe, må du plassere det på det første inngangsfeltet. + Alternativt kan du plassere en identisk gjenstand i det andre feltet for å kombinere de to gjenstandene. @@ -5752,24 +6647,14 @@ Vil du installere flettepakken eller teksturpakken nå? Når de riktige råmaterialene plasseres på det andre inngangsfeltet (for eksempel jernbarrer for et skadd jernsverd), vises foreslått reparasjon i utgangsfeltet. - + - Alternativt kan du plassere en identisk gjenstand i det andre feltet for å kombinere de to gjenstandene. + Antallet erfaringsnivåer jobben koster vises under utgangen. Hvis ikke du har tilstrekkelig antall erfaringsnivåer, kan ikke reparasjonen fullføres. Hvis du vil fortrylle gjenstander på ambolten, plasserer du en fortryllet bok i det andre inngangsfeltet. - - - - - 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. @@ -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,14 +6736,24 @@ 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. I dette området er det en landsbyboer og en kiste som inneholder papir til å kjøpe ting. + + + + + Trykk på {*CONTROLLER_VK_A*} for å bytte gjenstandene landsbyboeren krever med gjenstanden som tilbys. + + + + + Spillere kan bytte ting de har i inventaret med landsbyboere. @@ -5868,19 +6763,14 @@ Vil du installere flettepakken eller teksturpakken nå? Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det du trenger om handel. - + - Spillere kan bytte ting de har i inventaret med landsbyboere. + Når du har en blanding av yrker, vil de tilgjengelige byttene med landsbyboeren oppdateres. Byttene en landsbyboer tilbyr avhenger av landsbyboerens yrke. - - - - - Når du har en blanding av yrker, vil de tilgjengelige byttene med landsbyboeren oppdateres. @@ -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,37 +1,124 @@  - - 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 + + + Vis Online-ID-er på delt skjerm + + + Trofeer + + + 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. + + + 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. + + + Online-ID-er: + + + 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. + + + + Patch 1.04 (oppdatering 14) + + + Online-ID-er i spillet + + + Se hva jeg laget i Minecraft: PlayStation®Vita Edition! + + + Nedlasting mislyktes. Prøv igjen senere. + + + Kunne ikke bli med i spillet på grunn av en restriktiv NAT-type. Kontroller nettverksinnstillingene. + + + Opplasting mislyktes. Prøv igjen senere. + + + Nedlasting fullført! + + + +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. + + + + Lagring ikke fullført + + + 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. + + + Opplasting avbrutt + + + Du har avbrutt opplastingen av denne lagringen til lagringsomføringsområdet. + + + Last opp lagring for PS3™/PS4™ + + + Laster opp data: %d% % + + + "PSN" + + + Last ned PS3™-lagring + + + Laster ned data: %d%% + + + Lagrer + + + Opplasting fullført! + + + 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? + + + Konverterer data + + + IKKE I BRUK + + + IKKE I BRUK {*T3*}SLIK SPILLER DU: KREATIV MODUS{*ETW*}{*B*}{*B*} @@ -47,32 +134,80 @@ I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og 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. - - IKKE I BRUK - - - IKKE I BRUK - "IKKE I BRUK" - - "IKKE I BRUK" - - - Inviter venner - 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? 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? - - 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? + + "IKKE I BRUK" - - 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? + + Inviter venner + + + minecraftforum har et eget forum for PlayStation®Vita Edition. + + + Du får siste nytt om dette spillet fra @4JStudios og @Kappische på twitter! + + + NOT USED + + + Du kan bruke berøringsskjermen til PlayStation®Vita-systemet til å navigere i menyene! + + + Ikke se endermenn inn i øynene! + + + {*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. + + + {*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. + + + Vi tror kanskje 4J Studios har fjernet Herobrine fra PlayStation®Vita-system-spillet, men vi er ikke sikre. + + + Minecraft: PlayStation®Vita Edition har tatt en rekke rekorder! + + + Du har spilt prøveversjonen av Minecraft: PlayStation®Vita Edition så lenge som det er tilltatt! Vil du låse opp fullversjonen? + + + Feil under innlasting av Minecraft: PlayStation®Vita Edition. Kan ikke fortsette. + + + Brygging + + + Du ble sendt tilbake til startskjermen fordi du ble logget ut av "PSN". + + + 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. + + + 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. + + + 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. + + + 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. + + + Du kan ikke bli med i denne spilløkten fordi onlinespilling er deaktivert på Sony Entertainment Network-kontoen din på grunn av chatbegrensninger. Forbindelsen til "PSN" ble brutt. Går tilbake til hovedmenyen. @@ -80,11 +215,23 @@ I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og Forbindelsen til "PSN" ble brutt. + + 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? + + + 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? + 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? + + Gjestespillere kan ikke låse opp fullversjonen. Vennligst logg inn med en Sony Entertainment Network-konto. + + + Online-ID + 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". @@ -94,153 +241,7 @@ Vil du låse opp fullversjonen? Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Du trenger fullversjonen for å kunne akseptere denne invitasjonen. Vil du låse opp fullversjonen? - - Gjestespillere kan ikke låse opp fullversjonen. Vennligst logg inn med en Sony Entertainment Network-konto. - - - Online-ID - - - Brygging - - - Du ble sendt tilbake til startskjermen fordi du ble logget ut av "PSN". - - - Du har spilt prøveversjonen av Minecraft: PlayStation®Vita Edition så lenge som det er tilltatt! Vil du låse opp fullversjonen? - - - Feil under innlasting av Minecraft: PlayStation®Vita Edition. Kan ikke fortsette. - - - 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. - - - 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. - - - Du kan ikke bli med i denne spilløkten fordi onlinespilling er deaktivert på Sony Entertainment Network-kontoen din på grunn av chatbegrensninger. - - - 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. - - - 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. - - - 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. - - - 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. - - - Vis Online-ID-er på delt skjerm - - - Trofeer - - - Online-ID-er: - - - Online-ID-er i spillet - - - Se hva jeg laget i Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Patch 1.04 (oppdatering 14) - - - SELECT - - - 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å. - - - Vil du logge inn på "PSN"? - - - 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. - - - PlayStation®Vita-system - - - Endre nettverksmodus - - - Velg nettverksmodus - - - Velg Ad Hoc-nettverk for å koble til andre PlayStation®Vita-systemer i nærheten, eller "PSN" for å koble til venner over hele verden. - - - Ad Hoc-nettverk - - - "PSN" - - - Last ned PlayStation®3-system lagring - - - - Last opp lagring for PlayStation®3/PlayStation®4-system - - - - Opplasting avbrutt - - - Du har avbrutt opplastingen av denne lagringen til lagringsomføringsområdet. - - - Laster opp data: %d - - - Laster ned data: %d%% - - - 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? - - - Konverterer data - - - Lagrer - - - Opplasting fullført! - - - Opplasting mislyktes. Prøv igjen senere. - - - Nedlasting fullført! - - - Nedlasting mislyktes. Prøv igjen senere. - - - Kunne ikke bli med i spillet på grunn av en restriktiv NAT-type. Kontroller nettverksinnstillingene. - - - - 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. - - - - Lagring ikke fullført - - - 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. + + 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". - - - Gra została zakończona, ponieważ wypisałeś się z sieci "PSN". - - - Aktualnie nie jesteś wpisany. - - - - Gra posiada pewne funkcje, które wymagają wpisania się do sieci "PSN" – nie jesteś wpisany. - - - Sieć Ad Hoc jest wyłączona. - - - 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 - - - Problem z trofeum - - - Wystąpił problem z dostępem do twojego konta Sony Entertainment Network. Trofeum nie zostało przyznane. + + Nie udało się zapisać ustawień na koncie Sony Entertainment Network. Problem z kontem Sony Entertainment Network - - Nie udało się zapisać ustawień na koncie Sony Entertainment Network. + + Wystąpił problem z dostępem do twojego konta Sony Entertainment Network. Trofeum nie zostało przyznane. 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? + + 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. + + + Sieć Ad Hoc jest wyłączona. + + + Problem z trofeum + + + Gra została zakończona, ponieważ wypisałeś się z sieci "PSN". + + + Powróciłeś na ekran tytułowy, ponieważ wypisałeś się z sieci "PSN". + + + Brak wystarczającej ilości miejsca napamięć masowa systemu do stworzenia zapisu. + + + 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,3045 +1,886 @@  - - 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! - - - Nie wszyscy mieszkańcy Szwecji są blondynami. Niektórzy, jak Jens z Mojang, są nawet rudzi! - - - Kiedyś w końcu pojawi się aktualizacja do tej gry! - - - Kim jest Notch? - - - Mojang zebrało więcej nagród niż ma pracowników! - - - Sławni ludzie grają w Minecrafta! - - - deadmau5 lubi Minecrafta! - - - Nie zwracaj uwagi na błędy. - - - Czyhacze narodziły się z błędu w kodowaniu. - - - To kura czy kaczka? - - - Byłeś na Mineconie? - - - Nikt w Mojang nie widział twarzy Junkboya. - - - Czy wiesz, że istnieje Minecraft Wiki? - - - Nowe biuro Mojang jest czadowe! - - - Minecon 2013 odbył się w Orlando, na Florydzie! - - - .party() było doskonałe! - - - Zawsze zakładaj, że plotki są fałszywe, zamiast zakładać, że są prawdziwe! - - - {*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ć. - - - {*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. - - - {*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ć. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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ć. - - - - {*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*} - - - {*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. - - - {*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. - - - {*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. - - - {*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ć. - - - {*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. - - - Następna strona - - - Poprzednia strona - - - Podstawy - - - Interfejs - - - Ekwipunek - - - Skrzynie - - - Wytwarzanie - - - Piec - - - Dozownik - - - Hodowla zwierząt - - - Rozmnażanie zwierząt - - + Warzenie - - Zaklinanie - - - Portal do Otchłani - - - Tryb wieloosobowy - - - Udostępnianie zdjęć - - - Blokowanie poziomów - - - Tryb tworzenia - - - Opcje hosta i gracza - - - Handel - - - Kowadło - - - Kres - - - {*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ą. - - - Bieg - - - Co nowego - - - {*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*} - - - - {*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*} - - - - 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. - - - Wymagany do wydobycia wszelkiego rodzaju kamiennych bloków i rud. - - - Używana do ścinania drewna szybciej niż przy użyciu ręki. - - - Używana do uprawiania bloków ziemi oraz trawy i przygotowania ich pod plony. - - - Drewniane drzwi można otworzyć używając ich, uderzając w nie lub za pomocą czerwonego kamienia. - - - Żelazne drzwi można otworzyć tylko czerwonym kamieniem, przyciskami lub przełącznikami. - - - NOT USED - - - NOT USED - - - NOT USED - - - NOT USED - - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. - - - Daje użytkownikowi 3 jednostki pancerza po założeniu. - - - Daje użytkownikowi 2 jednostki pancerza po założeniu. - - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Narzędzia, broń i pancerz - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Materiały - - Daje użytkownikowi 5 jednostek pancerza po założeniu. + + Bloki do budowy - - Daje użytkownikowi 4 jednostki pancerza po założeniu. + + Czerwony kamień i transport - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Inne - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Wpisy: - - Daje użytkownikowi 6 jednostek pancerza po założeniu. + + Wyjdź bez zapisywania - - Daje użytkownikowi 5 jednostek pancerza po założeniu. + + Czy na pewno chcesz wyjść do głównego menu? Niezapisany postęp zostanie utracony. - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Czy na pewno chcesz wyjść do głównego menu? Twój postęp zostanie utracony! - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Ten zapis gry jest uszkodzony. Czy chcesz go usunąć? - - Daje użytkownikowi 5 jednostek pancerza po założeniu. + + Czy na pewno chcesz wyjść do głównego menu i rozłączyć wszystkich pozostałych graczy? Niezapisany postęp zostanie utracony. - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Wyjdź i zapisz - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Stwórz nowy świat - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Podaj nazwę swojego świata - - Daje użytkownikowi 8 jednostek pancerza po założeniu. + + Podaj numer ziarna do generowania świata - - Daje użytkownikowi 6 jednostek pancerza po założeniu. + + Wczytaj zapisany świat - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Rozegraj samouczek - - Sztabka, która może być użyta do wytwarzania narzędzi z danego materiału. Powstaje po przetopieniu rudy w piecu. + + Samouczek - - 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. + + Nazwij swój świat - - 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. + + Uszkodzony zapis gry - - Używane do tworzenia zajmujących mało miejsca schodów. + + OK - - Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + Anuluj - - Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + Sklep Minecraft - - Używana do oświetlania terenu. Pochodnie roztapiają śnieg i lód. + + Obróć - - Używane jako materiał budowlany. Można z nich wytworzyć wiele różnych rzeczy. Powstają z dowolnego rodzaju drewna. + + Ukryj - - Używany jako materiał budowlany. Nie działa na niego grawitacja, jak na zwykły piasek. + + Wyczyść wszystkie miejsca - - Używany jako materiał budowlany. + + Czy na pewno chcesz opuścić tę grę i dołączyć do innej? Niezapisany postęp zostanie utracony. - - Używany do wytwarzania pochodni, strzał, znaków, drabin, ogrodzeń oraz rączek narzędzi i broni. + + Czy na pewno chcesz nadpisać poprzedni zapis tego świata jego obecną wersją? - - 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. + + Czy na pewno chcesz wyjść bez zapisywania? Utracisz cały postęp w tym świecie! - - Umożliwia wytwarzanie bardziej rozmaitych przedmiotów. + + Rozpocznij grę - - Umożliwia przetapianie rudy, wytwarzanie węgla drzewnego i szkła oraz smażenie ryb i steków wieprzowych. + + Wyjdź z gry - - Przechowuje bloki i przedmioty. Umieść dwie skrzynie obok siebie, aby utworzyć wielką skrzynię o podwójnej pojemności. + + Zapisz grę - - 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. + + Wyjdź bez zapisywania - - Służy do poruszania się w pionie. + + Wciśnij START, aby grać - - 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. + + Hura – udało ci się odblokować obrazek Steve'a z Minecrafta! - - Wyświetla wpisany przez ciebie lub innych graczy tekst. + + Hura – udało ci się odblokować obrazek czyhacza! - - Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. + + Odblokuj pełną wersję gry - - Materiał wybuchowy. Aktywowany przez podpalenie go krzesiwem lub ładunkiem elektrycznym. + + Nie możesz dołączyć do tej gry, ponieważ host używa nowszej wersji gry. - - Nalewa się do niej zupę grzybową. Zatrzymujesz miskę, gdy zupa zostanie zjedzona. + + Nowy świat - - Służy do przenoszenia wody, lawy i mleka. + + Odblokowano nagrodę! - - Służy do przenoszenia wody. + + Grasz teraz w wersję próbną. Do zapisu stanu gry potrzebna jest pełna wersja. +Czy chcesz odblokować pełną wersję gry? - - Służy do przenoszenia lawy. + + Znajomi - - Służy do przenoszenia mleka. + + Mój wynik - - Służy do rozpalania ognia, podpalania trotylu i otwarcia portalu, gdy zostanie zbudowany. + + Ogólne - - Służy do łowienia ryb. + + Czekaj - - Pokazuje położenie Słońca i Księżyca. + + Brak wyników - - Wskazuje twoje miejsce startu. + + Filtr: - - Tworzy obraz odkrywanego obszaru, gdy trzyma się ją w ręku. Służy do odnajdywania drogi. + + Nie możesz dołączyć do tej gry, ponieważ host używa starszej wersji gry. - - Umożliwia atakowanie strzałami z dystansu. + + Utracono połączenie - - Pocisk do łuku. + + Utracono połączenie z serwerem. Powrót do głównego menu. - - Odnawia 2,5{*ICON_SHANK_01*}. + + Utracono połączenie z serwerem - - Odnawia 1{*ICON_SHANK_01*}. Można zjeść 6 razy. + + Opuszczanie gry - - Odnawia 1{*ICON_SHANK_01*}. + + Wystąpił błąd. Powrót do głównego menu. - - Odnawia 1{*ICON_SHANK_01*}. + + Połączenie nieudane - - Odnawia 3{*ICON_SHANK_01*}. + + Wyrzucono cię z gry - - Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Może ci zaszkodzić. + + Host wyszedł z gry - - Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu kurczaka w piecu. + + Nie możesz dołączyć do tej gry, ponieważ żaden z graczy nie znajduje się na twojej liście znajomych. - - Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. + + Nie możesz dołączyć do tej gry, ponieważ wcześniej host cię wyrzucił. - - Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu wieprzowiny w piecu. + + Wyrzucono cię z gry za latanie - - Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. + + Próba połączenia trwała zbyt długo - - Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu steku wieprzowego w piecu. + + Serwer jest pełny - - Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można nakarmić nią ocelota, aby go oswoić. + + 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! - - Odnawia 2,5{*ICON_SHANK_01*}. Powstaje po usmażeniu ryby w piecu. + + Motywy - - Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotego jabłka. + + Pakiety skórek - - Odnawia 2{*ICON_SHANK_01*} i regeneruje zdrowie przez 4 sekundy. Powstaje z połączenia jabłka i samorodków złota. + + Znajomi znajomych mogą dołączać - - Odnawia 2{*ICON_SHANK_01*}. Może ci zaszkodzić. + + Wyrzuć gracza - - Używany do pieczenia ciasta oraz jako składnik mikstur. + + Czy na pewno chcesz wyrzucić tego gracza z gry? Nie będzie mógł ponownie dołączyć, dopóki nie zrestartujesz świata. - - Wysyła ładunek elektryczny, gdy zostanie przełączona. Pozostaje przełączona do momentu ponownego użycia. + + Pakiety obrazkó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. + + Nie możesz dołączyć do tej gry, ponieważ została ona ograniczona tylko do znajomych hosta. - - Używany w obwodach z czerwonego kamienia jako powtarzacz, opóźniacz i/lub dioda. + + Uszkodzona zawartość do pobrania - - Wysyła ładunek elektryczny, gdy zostanie wciśnięty. Pozostaje wciśnięty przez około sekundę, potem wyłącza się. + + 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. - - Przechowuje i wystrzeliwuje przedmioty w losowej kolejności, gdy otrzyma zasilanie z czerwonego kamienia. + + 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. - - Odgrywa nutę, gdy zostanie aktywowany. Uderz go, aby zmienić wysokość dźwięku. Umieszczenie na innym bloku zmieni instrument. + + Nie można dołączyć do gry - - Służy jako droga dla wagoników. + + Wybrano - - Po zasileniu przyspiesza wagonik, który po nim przejedzie. Gdy nie jest zasilany, wagoniki się zatrzymują. + + Wybrana skórka: - - Działa jak płyta naciskowa (przesyła sygnał z czerwonego kamienia po zasileniu), ale może być aktywowany tylko przez wagonik. + + Pobierz pełną wersję - - Służy do przewożenia ciebie, zwierząt lub potworów po torach. + + Odblokuj pakiet tekstur - - Służy do transportowania materiałów po torach. + + Aby korzystać z wybranego pakietu tekstur, musisz go odblokować. +Odblokować go teraz? - - Będzie poruszać się po torach i przepychać inne wagoniki, gdy będzie w nim węgiel. + + Próbny pakiet tekstur - - Służy do poruszania się po wodzie. Szybsza niż pływanie. + + Ziarno - - Zdobywana z owiec, może być barwiona na różne kolory. + + Odblokuj pakiet skórek - - 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. + + Aby korzystać z wybranej skórki, musisz odblokować pakiet skórek. +Odblokować go teraz? - - Służy do zabarwienia wełny na czarno. + + 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? - - Służy do zabarwienia wełny na zielono. + + Pobierz pełną wersję - - Służy do zabarwienia wełny na brązowo, używany jako składnik ciasteczek lub do uprawy kakao. + + Ten świat wykorzystuje pakiet łączony lub pakiet tekstur, którego nie posiadasz! +Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? - - Służy do zabarwienia wełny na srebrno. + + Pobierz próbną wersję - - Służy do zabarwienia wełny na żółto. + + Brak pakietu tekstur - - Służy do zabarwienia wełny na czerwono. + + Odblokuj pełną wersję - - Sprawia, że zboża, drzewa, wysoka trawa, duże grzyby i kwiaty wyrastają natychmiast. Może być użyta do barwienia. + + Pobierz próbną wersję - - Służy do zabarwienia wełny na różowo. + + Tryb gry został zmieniony - - Służy do zabarwienia wełny na pomarańczowo. + + Po włączeniu tylko zaproszeni gracze będą mogli dołączyć. - - Służy do zabarwienia wełny na limonkowo. + + Po włączeniu znajomi twoich znajomych będą mogli dołączać do gry. - - Służy do zabarwienia wełny na szaro. + + Po włączeniu gracze będą mogli ranić innych graczy. Działa tylko w trybie przetrwania. - - 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). + + Normalny - - Służy do zabarwienia wełny na jasnoniebiesko. + + Superpłaski - - Służy do zabarwienia wełny na błękitno. + + Po włączeniu gra będzie grą sieciową. - - Służy do zabarwienia wełny na fioletowo. + + Po wyłączeniu gracze, którzy dołączą do gry, nie będą mogli budować lub wydobywać, dopóki nie dostaną pozwolenia. - - Służy do zabarwienia wełny na wrzosowo. + + Po włączeniu miejsca takie jak wioski i twierdze będą pojawiać się w świecie. - - Służy do zabarwienia wełny na niebiesko. + + Po włączeniu zostanie wygenerowany całkowicie płaski świat zewnętrzny i Otchłań. - - Odtwarza płyty muzyczne. + + Po włączeniu, w pobliżu miejsca odrodzenia znajdzie się skrzynia z przydatnymi przedmiotami. - - Służy do wytwarzania potężnych narzędzi, broni i elementów pancerza. + + Po włączeniu ogień będzie mógł się rozprzestrzeniać na pobliskie łatwopalne bloki. - - Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. + + Po włączeniu trotyl będzie wybuchać po aktywacji. - - Służy do wytwarzania książek i map. + + 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. - - Służy do tworzenia biblioteczek. Może być zaklęta, aby zmienić się w zaklętą księgę. + + Wył. - - Umożliwia wzmacnianie zaklęć, gdy znajdzie się przy magicznym stole. + + Tryb gry: Tworzenie - - Służy do dekoracji. + + Przetrwanie - - Może być wydobywana za pomocą żelaznego lub lepszego kilofa, a następnie przetapiana na sztabki złota. + + Tworzenie - - Może być wydobywana za pomocą kamiennego lub lepszego kilofa, a następnie przetapiana na sztabki żelaza. + + Zmień nazwę świata - - Może być wydobyta za pomocą kilofa, aby zdobyć węgiel. + + Podaj nową nazwę swojego świata - - Może być wydobyta za pomocą kamiennego lub lepszego kilofa, aby zdobyć lazuryt. + + Tryb gry: Przetrwanie - - Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć diamenty. + + Stworzone w trybie przetrwania - - Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć czerwony pył. + + Zmień nazwę zapisu gry - - Może być wydobyty za pomocą kilofa, aby zyskać kamień brukowy. + + Autozapis za %d... - - Wydobywana za pomocą łopaty. Może być użyta do budowy. + + Wł. - - Może być zasadzona w ziemi. Z czasem wyrośnie z niej drzewo. + + Stworzone w trybie tworzenia - - Nie może zostać zniszczona. + + Renderuj chmury - - Podpala wszystko, czego dotknie. Można ją zebrać w wiadrze. + + Co chcesz zrobić z tym zapisem gry? - - Wydobywany łopatą. Może być przetopiony na szkło w piecu. Oddziałuje na niego grawitacja, jeżeli pod spodem nie ma żadnego bloku. + + Rozmiar interfejsu (podzielony ekran) - - Wydobywany łopatą. Czasami podczas wykopywania możesz natrafić na krzemień. Oddziałuje na niego grawitacja, jeżeli pod spodem nie ma żadnego bloku. + + Składnik - - Ścinane siekierą. Może być przerobione na deski lub wykorzystane jako opał. + + 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. - - - 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. - - - Sprawny sposób przechowywania śnieżek. - - - Może być wydobyty łopatą, aby zyskać śnieżki. - - - Czasami po wydobyciu daje ziarna pszenicy. - - - Można przerobić na barwnik. - - - 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. - - - Umieszcza się go na ziemi w celu przenoszenia ładunku elektrycznego. Po dodaniu jako składnik mikstury, przedłuży czas działania jej efektu. - - - Po zebraniu daje pszenicę, gdy wyrośnie w pełni. - - - Ziemia przygotowana do sadzenia ziaren. - - - Po ugotowaniu w piecu daje zielony barwnik. - - - 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. - - - Spowalnia wszystko, co się po nim porusza. - - - 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ę. - - - 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. - - - Zdobywana ze zboża, może być użyta do produkcji jedzenia. - - - 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 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 wydobyciu jasnogłazu. Może być użyty do stworzenia bloku jasnogłazu lub do wzmocnienia siły mikstury. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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 zasadzeniu wyrastają z nich dynie. - - - 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. - - - 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. - - - Rosną po zasadzeniu. Można je zebrać nożycami. Można się po nich wspinać jak po drabinie. - - - 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. - - - 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. - - - Ma różne efekty po użyciu, w zależności od tego, na czym się jej użyje. - - - 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. - - - 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że być napełniony deszczem lub wodą z wiadra. Następnie można z niego napełniać wodą szklane butelki. - - - 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. - - - 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. - - - Występuje w fortecach Otchłani. Po zniszczeniu da narośl z Otchłani. - - - 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. - - - 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. - - - Przydatny do podpalania rzeczy lub wywoływania pożarów na odległość, po wystrzeleniu z dozownika. - - - 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. - - - 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. - - - Można zbierać z nich ziarna kakao. - - - 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. - - - Krowa - - - Po zabiciu zostawia skórę. Można ją wydoić, używając wiadra. - - - Owca - - - Po strzyżeniu (jeżeli jeszcze nie została ostrzyżona) daje wełnę. Można ją ufarbować na inny kolor. - - - Kura - - - Po zabiciu zostawia pióro. Co jakiś czas składa jajo. - - - Świnia - - - 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. - - - Czyhacz - - - Wybucha, jeżeli podejdziesz za blisko. - - - Kościotrup - - - Strzela w ciebie strzałami. Upuszcza je po zabiciu. - - - Pająk - - - Atakuje cię, gdy podejdziesz blisko. Może chodzić po ścianach. Po zabiciu upuszcza nić. - - - Zombie - - - Atakuje cię, gdy podejdziesz blisko. - - - Zombie świniolud - - - Nieagresywny, ale zaatakuje cię w grupie, gdy zaatakujesz jednego z nich. - - - Duch - - - Strzela w ciebie ognistymi kulami, które wybuchają. - - - Szlam - - - Rozpada się na mniejsze kawałki, gdy zostanie uderzony. - - - Kresostwór - - - Zaatakuje cię, gdy na niego spojrzysz. Potrafi także przenosić bloki. - - - Rybik - - - Przywołuje pobliskie rybiki, gdy zostanie zaatakowany. Ukrywa się w kamiennych blokach. - - - Jaskiniowy pająk - - - Jego ukąszenia są trujące. - - - Grzybowa krowa - - - Daje zupę grzybową po użyciu miski. Po ostrzyżeniu zostawia grzyby i zmienia się w zwykłą krowę. - - - Ś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 - - - 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. - - - Kostka magmy - - - Można je znaleźć w Otchłani. Podobnie jak szlamy, będą się rozpadać na mniejsze kawałki, gdy zostaną uderzone. - - - Osadnik - - - Ocelot - - - Ż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ń. - - - Animator wybuchów - - - Grafik koncepcyjny - - - Przeliczanie liczb i statystyki - - - Koordynator gnębicieli - - - Pierwotny projekt i programowanie - - - Menadżer projektu/producent - - - Reszta biura Mojang - - - Główny programista Minecraft PC - - - Koder ninja - - - Prezes - - - Biały kołnierzyk - - - Obsługa klienta - - - Biurowy DJ - - - Projektant/programista Minecraft – Pocket Edition - - - Producent - - - Główny architekt - - - Projektant graficzny - - - Rzemieślnik gry - - - Kierownik zabawy - - - Muzyka i dźwięki - - - Programowanie - - - Grafika - - - QA - - - Producent wykonawczy - - - Główny producent - - - Producent - - - Kierownik testów - - - Główny tester - - - Zespół projektancki - - - Zespół deweloperski - - - Zarządzanie projektem - - - Dyrektor publikacji XBLA - - - Rozwój biznesu - - - Dyrektor ds. finansów - - - Menadżer produktu - - - Marketing - - - Menadżer ds. społeczności - - - Europejski zespół ds. lokalizacji - - - Zespół ds. lokalizacji z Redmond - - - Azjatycki zespół ds. lokalizacji - - - Zespół ds. badania opinii użytkowników - - - Główne zespoły MGS - - - Tester akceptacji punktów milowych projektu - - - Specjalne podziękowania - - - Menadżer testów - - - Starszy kierownik testów - - - SDET - - - STE projektu - - - Dodatkowe STE - - - Dodatkowe testy - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Drewniany miecz - - - Kamienny miecz - - - Żelazny miecz - - - Diamentowy miecz - - - Złoty miecz - - - Drewniana łopata - - - Kamienna łopata - - - Żelazna łopata - - - Diamentowa łopata - - - Złota łopata - - - Drewniany kilof - - - Kamienny kilof - - - Żelazny kilof - - - Diamentowy kilof - - - Złoty kilof - - - Drewniana siekiera - - - Kamienna siekiera - - - Żelazna siekiera - - - Diamentowa siekiera - - - Złota siekiera - - - Drewniana motyka - - - Kamienna motyka - - - Żelazna motyka - - - Diamentowa motyka - - - Złota motyka - - - Drewniane drzwi - - - Żelazne drzwi - - - Kolczy hełm - - - Kolczuga - - - Kolcze nogawice - - - Kolcze buty - - - Skórzany hełm - - - Żelazny hełm - - - Diamentowy hełm - - - Złoty hełm - - - Skórzana zbroja - - - Żelazny napierśnik - - - Diamentowy napierś. - - - Złoty napierśnik - - - Skórzane nogawice - - - Żelazne nogawice - - - Diamentowe nogawice - - - Złote nogawice - - - Skórzane buty - - - Żelazne buty - - - Diamentowe buty - - - Złote buty - - - Sztabka żelaza - - - Sztabka złota - - - Wiadro - - - Wiadro z wodą - - - Wiadro z lawą - - - Krzesiwo - - - Jabłko - - - Łuk - - - Strzała - - - Węgiel - - - Węgiel drzewny - - - Diament - - - Kij - - - Miska - - - Zupa grzybowa - - - Nić - - - Pióro - - - Proch strzelniczy - - - Ziarna pszenicy - - - Pszenica - - - Chleb - - - Krzemień - - - Surowy stek wieprzowy - - - Smażony stek wieprzowy - - - Obraz - - - Złote jabłko - - - Znak - - - Wagonik - - - Siodło - - - Czerwony kamień - - - Śnieżka - - - Łódka - - - Skóra - - - Wiadro z mlekiem - - - Cegła - - - Glina - - - Trzcina cukrowa - - - Papier - - - Książka - - - Kula szlamu - - - Wagonik ze skrzynią - - - Wagonik z piecem - - - Jajo - - - Kompas - - - Wędka - - - Zegarek - - - Jasnopył - - - Surowa ryba - - - Smażona ryba - - - Barwnik - - - Gruczoł atramentowy - - - Czerwony barwnik - - - Zielony barwnik - - - Kakao - - - Lazuryt - - - Fioletowy barwnik - - - Błękitny barwnik - - - Jasnoszary barwnik - - - Szary barwnik - - - Różowy barwnik - - - Limonkowy barwnik - - - Żółty barwnik - - - Jasnoniebieski barwnik - - - Wrzosowy barwnik - - - Pomarańczowy barwnik - - - Mączka kostna - - - Kość - - - Cukier - - - Ciasto - - - Łóżko - - - Powtarzacz z czer. kamienia - - - Ciasteczko - - - Mapa - - - Płyta muzyczna – „13” - - - Płyta muzyczna – „cat” - - - Płyta muzyczna – „blocks” - - - Płyta muzyczna – „chirp” - - - Płyta muzyczna – „far” - - - Płyta muzyczna – „mall” - - - Płyta muzyczna – „mellohi” - - - Płyta muzyczna – „stal” - - - Płyta muzyczna – „strad” - - - Płyta muzyczna – „ward” - - - Płyta muzyczna – „11” - - - Płyta muzyczna – „where are we now” - - - Nożyce - - - Nasiona dyni - - - Nasiona arbuza - - - Surowy kurczak - - - Smażony kurczak - - - Surowa wołowina - - - Smażony stek - - - Zgniłe mięso. - - - Perła Kresu - - - Kawałek arbuza - - - Płomienna różdżka - - - Łza ducha - - - Samorodek złota - - - Narośl z Otchłani - - - {*splash*}{*prefix*}mikstura {*postfix*} - - - Szklana butelka - - - Butelka z wodą - - - Oko pająka - - - Sfermentow. oko pająka - - - Płomienny proszek - - - Magmowy krem - - - Stacja alchemiczna - - - Kociołek - - - Oko Kresu - - - Błyszczący arbuz - - - Zaklęta butelka - - - Ognisty ładunek - - - Ognisty ład. (węg. drz.) - - - Ognisty ładunek (węg.) - - - Ramka - - - Przywołaj: {*CREATURE*} - - - Cegła z Otchłani - - - Czaszka - - - Czaszka kościotrupa - - - Czaszka uschniętego kościotrupa - - - Głowa zombie - - - Głowa - - - Głowa gracza %s - - - Głowa czyhacza - - - Kamień - - - Blok z trawą - - - Ziemia - - - Kamień brukowy - - - Deski dębowe - - - Deski świerkowe - - - Deski brzozowe - - - Deski z drew. z dżungli - - - Sadzonka - - - Sadzonka dębu - - - Sadzonka świerku - - - Sadzonka brzozy - - - Sadzonka drzewa z dżungli - - - Skała macierzysta - - - Woda - - - Lawa - - - Piasek - - - Piaskowiec - - - Żwir - - - Ruda złota - - - Ruda żelaza - - - Ruda węgla - - - Drewno - - - Drewno dębowe - - - Drewno świerkowe - - - Drewno brzozowe - - - Drewno z dżungli - - - Dąb - - - Świerk - - - Brzoza - - - Liście - - - Liście dębu - - - Liście świerku - - - Liście brzozy - - - Liście z dżungli - - - Gąbka - - - Szkło - - - Wełna - - - Czarna wełna - - - Czerwona wełna - - - Zielona wełna - - - Brązowa wełna - - - Niebieska wełna - - - Fioletowa wełna - - - Błękitna wełna - - - Jasnoszara wełna - - - Szara wełna - - - Różowa wełna - - - Limonkowa wełna - - - Żółta wełna - - - Jasnoniebieska wełna - - - Wrzosowa wełna - - - Pomarańczowa wełna - - - Biała wełna - - - Kwiat - - - Róża - - - Grzyb - - - Blok złota - - - Sprawny sposób przechowywania złota. - - - Blok żelaza - - - Sprawny sposób przechowywania żelaza. - - - Kamienna płyta - - - Kamienna płyta - - - Płyta z piaskowca - - - Płyta z drewna dębowego - - - Płyta z kamienia brukowego - - - Płyta z cegieł - - - Płyta z kamiennych cegieł - - - Płyta z drewna dębowego - - - Płyta świerkowa - - - Płyta brzozowa - - - Płyta z drewna z dżungli - - - Płyta z cegieł z Otchłani - - - Cegły - - - Trotyl - - - Biblioteczka - - - Kamień z mchem - - - Obsydian - - - Pochodnia - - - Pochodnia (węgiel) - - - Pochodnia (węgiel drz.) - - - Ogień - - - Przywoływacz potworów - - - Schody z drewna dębowego - - - Skrzynia - - - Czerwony pył - - - Ruda diamentu - - - Blok diamentu - - - Sprawny sposób przechowywania diamentów. - - - Warsztat - - - Zboże - - - Pole uprawne - - - Piec - - - Znak - - - Drewniane drzwi - - - Drabina - - - Tor - - - Zasilany tor - - - Tor z czujnikiem - - - Kamienne schody - - - Dźwignia - - - Płyta naciskowa - - - Żelazne drzwi - - - Ruda czerwonego kamienia - - - Pochodnia (czer. pył) - - - Przycisk - - - Śnieg - - - Lód - - - Kaktus - - - Glina - - - Trzcina cukrowa - - - Szafa grająca - - - Ogrodzenie - - - Dynia - - - Lampion z dyni - - - Skała Otchłani - - - Piasek dusz - - - Jasnogłaz - - - Portal - - - Ruda lazurytu - - - Blok lazurytu - - - Sprawny sposób przechowywania lazurytu. - - + Dozownik - - Blok muzyczny + + Skrzynia - - Ciasto + + Zaklinanie - - Łóżko + + Piec - - Pajęczyna + + Aktualnie nie ma dostępnej zawartości do pobrania tego typu dla tej gry. - - Wysoka trawa + + Czy na pewno chcesz usunąć ten zapis gry? - - Uschnięty krzak + + Oczekiwanie na akceptację - - Dioda + + Ocenzurowano - - Zamknięta skrzynia + + Gracz %s dołącza do gry. - - Właz + + Gracz %s opuszcza grę. - - Wełna (dowolnego koloru) + + Gracz %s zostaje wyrzucony z gry. - - Tłok - - - Lepki tłok - - - Blok rybika - - - Kamienne cegły - - - Kamienne cegły z mchem - - - Popękane kamienne cegły - - - Rzeźbione kamienne cegły - - - Grzyb - - - Grzyb - - - Żelazne kraty - - - Szyba - - - Arbuz - - - Łodyga dyni - - - Łodyga arbuza - - - Pnącza - - - Furtka - - - Ceglane schody - - - Schody z kamiennych cegieł - - - Kamień rybika - - - Kamień brukowy rybika - - - Kamienna cegła rybika - - - Grzybnia - - - Lilia - - - Cegła z Otchłani - - - Płot z cegły z Otchłani - - - Schody z cegły z Otchłani - - - Narośl z Otchłani - - - Magiczny stół - - + Stacja alchemiczna - - Kociołek + + Wpisz tekst na znaku - - Portal Kresu + + Wpisz tekst na swoim znaku - - Szkielet portalu Kresu + + Wpisz nazwę - - Kamień Kresu + + Koniec wersji próbnej - - Smocze jajo + + Wybrana gra jest pełna - - Krzak + + Nie udało się dołączyć do gry, brak wolnych miejsc - - Paproć + + Wpisz nazwę swojego postu - - Schody z piaskowca + + Wpisz opis swojego postu - - Schody świerkowe - - - Schody brzozowe - - - Schody z drewna z dżungli - - - Lampa z czerwonym pyłem - - - Kakao - - - Czaszka - - - Sterowanie - - - Układ - - - Chodzenie/bieganie - - - Rozglądanie się - - - Pauza - - - Skok - - - Skok/lot do góry - - + Ekwipunek - - Zmień trzymany przedmiot + + Składniki - - Akcja + + Wpisz nagłówek - - Użyj + + Wpisz nagłówek swojego postu - - Wytwarzanie + + Wpisz opis - - Upuść + + Teraz gra: - - Skradanie + + Czy na pewno chcesz dodać ten poziom do listy zablokowanych poziomów? +Wybranie „OK” spowoduje wyjście z gry. - - Skradanie/lot w dół + + Usuń z listy zablokowanych poziomów - - Zmiana trybu kamery + + Odstęp czasowy automatycznego zapisu - - Gracze/zaproszenia + + Zablokowany poziom - - Poruszanie (podczas lotu) + + 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. - - Układ 1 + + Zablokować ten poziom? - - Układ 2 + + Odstęp czasowy automatycznego zapisu: WYŁ. - - Układ 3 + + Przezroczystość interfejsu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Przygotowywanie do automatycznego zapisania poziomu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Rozmiar interfejsu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + min - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Nie można tu umieścić! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + 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. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Ulubione skórki - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Gra gracza %s - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Gra nieznanego hosta - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Gość się wypisał - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Resetuj ustawienia - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Czy na pewno chcesz zresetować ustawienia do wartości standardowych? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Błąd wczytywania - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Jeden z gości się wypisał, co oznacza, że pozostali goście zostaną usunięci z gry. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Nie udało się stworzyć gry - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Automatyczny wybór - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Brak pakietu: standard. skórki - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Wpisz się - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Nie jesteś wpisany. Aby zagrać, musisz się wpisać. Chcesz się wpisać teraz? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Tryb wieloosobowy niedostępny - - <![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;]]> + + Wypij - - {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. - - - {*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ę. - - - 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żyj{*CONTROLLER_ACTION_LOOK*}, aby patrzeć w górę, w dół i rozglądać się dookoła. - - - Użyj{*CONTROLLER_ACTION_MOVE*}, aby się poruszać. - - - 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. - - - Wciśnij{*CONTROLLER_ACTION_JUMP*}, aby podskoczyć. - - - 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... - - - 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{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs wytwarzania. - - - Zbierając i wytwarzając przedmioty, zapełniasz swój ekwipunek.{*B*} - Wciśnij{*CONTROLLER_ACTION_INVENTORY*}, aby otworzyć ekran ekwipunku. - - - 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. - - - 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. - - - 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. - - - 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*} - - - Zebrane drewno może być przerobione na deski. Otwórz interfejs wytwarzania i zrób deski.{*PlanksIcon*} - - - 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*} - - - 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*} - - - Użyj{*CONTROLLER_ACTION_LEFT_SCROLL*} i{*CONTROLLER_ACTION_RIGHT_SCROLL*}, aby zmienić trzymany przedmiot. - - - 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. - - - 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ć. - - - Umieść celownik na warsztacie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać. - - - Ł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*} - - - 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*} - - - 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*} - - - Otwórz pojemnik - - + - Noc nadchodzi szybko, a przebywanie na zewnątrz bywa niebezpieczne. Możesz stworzyć pancerz i broń, ale najlepsze jest bezpieczne schronienie. + Na tym terenie znajduje się farma. Rolnictwo umożliwia ci wytwarzanie żywności oraz innych przedmiotów. - - - W pobliżu znajduje się opuszczone schronienie górnika, które możesz wykończyć. - - - - 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. - - - 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*} - - - Masz wystarczająco dużo kamienia brukowego, aby zbudować piec. Skorzystaj z warsztatu, aby go stworzyć. - - - Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić piec w świecie, a następnie z niego skorzystaj. - - - Skorzystaj z pieca, aby stworzyć trochę węgla drzewnego. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. - - - Skorzystaj z pieca, aby stworzyć trochę szkła. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. - - - 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*} - - - Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić drzwi. Użyj{*CONTROLLER_ACTION_USE*}, aby otwierać i zamykać drzwi. - - - 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*} - - - - Udało ci się ukończyć pierwszą część samouczka. - - + {*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ę. - - - - 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. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku. - - - - 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ę. - - - - 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. - - - - Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. - - - - Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_VK_BACK*}. - - - - Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku. - - - - Oto ekwipunek w trybie tworzenia. Wyświetla wszystkie dostępne przedmioty oraz te, które możesz trzymać w ręku. - - - {*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. - - - - 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. - - - - 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. - - - - 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*}. - - - - 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. - - - - Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_VK_BACK*}. - - - - Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku w trybie tworzenia. - - - - Oto interfejs wytwarzania. Umożliwia on łączenie zebranych przedmiotów w nowe. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak wytwarzać przedmioty. - - - {*B*} - Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić opis przedmiotu. - - - {*B*} - Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić składniki niezbędne do stworzenia wybranego przedmiotu. - - - {*B*} - Wciśnij{*CONTROLLER_VK_X*}, aby ponownie wyświetlić ekwipunek. - - - - 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. - - - - 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. - - - - 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. - - - - Dolna prawa część interfejsu wytwarzania przedstawia twój ekwipunek. Wyświetla także opis wybranego przedmiotu oraz składniki niezbędne do jego stworzenia. - - - - Opis aktualnie wybranego przedmiotu. Może dać ci on podpowiedź co do zastosowania przedmiotu. - - - - Lista składników niezbędnych do wytworzenia wybranego przedmiotu. - - - Zebrane drewno może być przerobione na deski. Wybierz ikonę desek i wciśnij{*CONTROLLER_VK_A*}, aby je stworzyć.{*PlanksIcon*} - - - - 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. - - - - Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz narzędzia.{*ToolsIcon*} - - - - Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz obiekty.{*StructuresIcon*} - - - - 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*} - - - - 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*} - - - - Dzięki stworzonym narzędziom będziesz w stanie skuteczniej wydobywać materiały.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. - - - - Niektóre przedmioty nie mogą być stworzone w warsztacie. Niezbędny jest piec. Stwórz piec.{*FurnaceIcon*} - - - - Umieść stworzony piec w świecie. Dobrze jest umieścić go w siedzibie.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. - - - - Oto interfejs pieca. Piec umożliwia ci przetwarzanie przedmiotów poprzez ich wypalanie. Przykładowo, możesz przetopić rudę żelaza na sztabki żelaza. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z pieca. - - - - 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. - - - - 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ł. - - - - Gdy przedmioty zostaną przetworzone, możesz je przenieść do ekwipunku. Poeksperymentuj z różnymi składnikami, aby zobaczyć, co uda ci się zrobić. - - - - 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. - - - - Węgiel drzewny może być użyty do rozpalenia w piecu albo stworzenia pochodni, po połączeniu z kijem. - - - - Użycie piasku jako składnika umożliwi stworzenie szkła. Stwórz trochę szkła i użyj go do zrobienia okien. - - - - Oto interfejs warzenia. Dzięki niemu możesz stworzyć mikstury o różnorodnym działaniu. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać ze stacji alchemicznej. - - - - 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. - - - - 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. - - - - 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. - - - - 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. - - - - Stwórz miksturę odporności na ogień, najpierw dodając do butelki z wodą narośl z Otchłani, a następnie magmowy krem. - - - - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs warzenia. - - - - W tym miejscu znajduje się stacja alchemiczna, kociołek i skrzynia wypełniona składnikami do warzenia mikstur. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat warzenia i 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. - - - Pierwszym etapem warzenia mikstur jest stworzenie butelki z wodą. Wyjmij szklaną butelkę ze skrzyni. + + 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. - + + Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs trybu tworzenia. + + + Dostań się na drugą stronę dziury, aby kontynuować. + + + Udało ci się ukończyć samouczek trybu tworzenia. + + + 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. + + + 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*} + + + 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*} + + + Mączka kostna sprawia, że zbiory wyrastają natychmiast, a grzyby zamieniają się w duże grzyby.{*ICON*}351:15{*/ICON*} + + + Pszenica przechodzi przez kilka faz wzrostu i można ją zebrać, gdy będzie miała ciemniejszy kolor.{*ICON*}59:7{*/ICON*} + + + Dynie i arbuzy potrzebują wolnego bloku obok miejsca do zasadzenia nasion, aby owoc mógł urosnąć, gdy łodyga w pełni się rozwinie. + + + 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*} + + + 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ć. + + - 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*}. + 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. + + + + Na tym terenie znajduje się portal do Otchłani! + + + + {*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. + + + + 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*} + + + + Powtarzacze z czerwonego kamienia mogą wydłużyć dystans, na jaki przeniesione jest zasilanie, lub opóźnić obwód. + {*ICON*}356{*/ICON*} + + + + 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*} + + + + Portale buduje się, tworząc szeroki na 4 bloki i wysoki na 5 bloków szkielet z obsydianu. Narożne bloki nie są wymagane. + + + + 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. + + + + Jesteś teraz w trybie tworzenia. + + + + {*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. + + + + 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. + + + + + 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. + + + + 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. + + + Udało ci się ukończyć samouczek rolnictwa. + + + Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj siekiery, aby ścinać drzewa. + + + 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. + + + Niektóre narzędzia są lepsze podczas atakowania przeciwników. Użyj miecza, aby atakować. + + + Żelazne golemy można także znaleźć w wioskach, które ochraniają. Zaatakują cię, jeżeli ty zaatakujesz osadników. + + + Nie możesz opuścić tego obszaru, dopóki nie ukończysz samouczka. + + + 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. + + + 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... + + + 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ąść. + + + W skrzyni w pobliżu stawu znajdziesz wędkę. Wyjmij ją ze skrzyni i wybierz jako aktualnie używany przedmiot, aby z niej skorzystać. + + + 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. + + + 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ść. + + + Przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby płynąć do góry. + + + 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. + + + Ż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. + + + 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. + + + 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. + + + Po przeminięciu miłosnego nastroju zwierzę nie będzie mogło osiągnąć go ponownie przez około 5 minut. + + + + Na tym obszarze zwierzęta zostały zamknięte. Możesz je rozmnażać, aby mieć małe zwierzątka. + + + + {*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. + + + Aby zwierzęta się rozmnażały, musisz nakarmić je odpowiednim jedzeniem, co wprowadzi je w miłosny nastrój. + + + 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*} + + + + {*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. + + + Golemy powstają po umieszczeniu dyni na szczycie stosu bloków. + + + Ś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. + + + + 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. + + + Udało ci się ukończyć samouczek zwierząt i rozmnażania. + + + + Na tym terenie znajdziesz dynie oraz bloki, z których można zbudować śnieżnego i żelaznego golema. + + + + 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. @@ -3053,10 +894,35 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< 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. + + + {*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. + + + + Pierwszym etapem warzenia mikstur jest stworzenie butelki z wodą. Wyjmij szklaną butelkę ze skrzyni. + + + + 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*}. Użyj na sobie mikstury odporności na ogień. + + + + 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. + + + + Gdy przedmiot zostanie umieszczony w miejscu zaklinania, przyciski po prawej pokażą szereg losowych zaklęć. + + + + 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. @@ -3071,98 +937,66 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< 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. - + - 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. + W tym miejscu znajduje się stacja alchemiczna, kociołek i skrzynia wypełniona składnikami do warzenia mikstur. - + - Gdy przedmiot zostanie umieszczony w miejscu zaklinania, przyciski po prawej pokażą szereg losowych zaklęć. + Węgiel drzewny może być użyty do rozpalenia w piecu albo stworzenia pochodni, po połączeniu z kijem. - + - 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. + Użycie piasku jako składnika umożliwi stworzenie szkła. Stwórz trochę szkła i użyj go do zrobienia okien. + + + + Oto interfejs warzenia. Dzięki niemu możesz stworzyć mikstury o różnorodnym działaniu. + + + + 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ł. + + + + Gdy przedmioty zostaną przetworzone, możesz je przenieść do ekwipunku. Poeksperymentuj z różnymi składnikami, aby zobaczyć, co uda ci się zrobić. + + + + 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. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać ze stacji alchemicznej. + + + + 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. + + + + Stwórz miksturę odporności na ogień, najpierw dodając do butelki z wodą narośl z Otchłani, a następnie magmowy krem. + + + + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs warzenia. + + + + 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. + + + + 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. + + + + 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. Wybierz zaklęcie i wciśnij{*CONTROLLER_VK_A*}, aby zakląć przedmiot. Obniży to twój poziom doświadczenia o koszt zaklęcia. - - - - 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. - - - - Znajdziesz tu magiczny stół oraz inne przedmioty, które pomogą ci w nauce zaklinania. - - - {*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. - - - - 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. - - - - Umieszczenie biblioteczek wokół magicznego stołu zwiększa jego siłę i daje dostęp do potężniejszych zaklęć. - - - - 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. - - - - 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ć. - - - - 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. - - - - Jedziesz wagonikiem. Aby z niego wysiąść, wyceluj w niego i wciśnij{*CONTROLLER_ACTION_USE*} . {*MinecartIcon*} - - - {*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. - - - - Wagoniki jeżdżą po torach. Możesz także stworzyć napędzany wagonik, umieszczając w nim piec, oraz wagonik ze skrzynią. - {*RailIcon*} - - - - 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*} - - - - Płyniesz łódką. Aby wysiąść z łódki, wyceluj w nią i wciśnij{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} - - - - {*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. - - - - Łódki umożliwiają ci szybkie poruszanie się po wodzie. Możesz sterować za pomocą{*CONTROLLER_ACTION_MOVE*} oraz{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - - Korzystasz z wędki. Wciśnij{*CONTROLLER_ACTION_USE*}, aby jej użyć.{*FishingRodIcon*} - - - - {*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. @@ -3178,10 +1012,39 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< 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*} + + + + Łódki umożliwiają ci szybkie poruszanie się po wodzie. Możesz sterować za pomocą{*CONTROLLER_ACTION_MOVE*} oraz{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Korzystasz z wędki. Wciśnij{*CONTROLLER_ACTION_USE*}, aby jej użyć.{*FishingRodIcon*} + + + + {*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. To łóżko. Wciśnij{*CONTROLLER_ACTION_USE*}, celując w nie w nocy, aby się położyć i obudzić rano.{*ICON*}355{*/ICON*} + + + + 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ć. + + + + {*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. + + + + 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. @@ -3199,226 +1062,290 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< 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*} - - - 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ć. - - + {*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_A*}, aby dowiedzieć się więcej o łódkach.{*B*} Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - + - 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. + 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. - + - 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. + Umieszczenie biblioteczek wokół magicznego stołu zwiększa jego siłę i daje dostęp do potężniejszych zaklęć. - + - 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*} + 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. - + - Powtarzacze z czerwonego kamienia mogą wydłużyć dystans, na jaki przeniesione jest zasilanie, lub opóźnić obwód. - {*ICON*}356{*/ICON*} + 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. - + - 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*} + Znajdziesz tu magiczny stół oraz inne przedmioty, które pomogą ci w nauce zaklinania. - - - 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. - - - - Na tym terenie znajduje się portal do Otchłani! - - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat portalów i Otchłani.{*B*} + + {*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. - + - 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ż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ć. - + - 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. - + Wagoniki jeżdżą po torach. Możesz także stworzyć napędzany wagonik, umieszczając w nim piec, oraz wagonik ze skrzynią. + {*RailIcon*} - + - 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. + 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*} - + - 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. + Płyniesz łódką. Aby wysiąść z łódki, wyceluj w nią i wciśnij{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} - + - 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. + 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. - + - Jesteś teraz w trybie tworzenia. + Jedziesz wagonikiem. Aby z niego wysiąść, wyceluj w niego i wciśnij{*CONTROLLER_ACTION_USE*} . {*MinecartIcon*} - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o trybie tworzenia.{*B*} + + {*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. - - 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ć. - - - Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs trybu tworzenia. - - - Dostań się na drugą stronę dziury, aby kontynuować. - - - Udało ci się ukończyć samouczek trybu tworzenia. - - - - Na tym terenie znajduje się farma. Rolnictwo umożliwia ci wytwarzanie żywności oraz innych przedmiotów. - - - - {*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. - - - 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. - - - 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. - - - Pszenica przechodzi przez kilka faz wzrostu i można ją zebrać, gdy będzie miała ciemniejszy kolor.{*ICON*}59:7{*/ICON*} - - - Dynie i arbuzy potrzebują wolnego bloku obok miejsca do zasadzenia nasion, aby owoc mógł urosnąć, gdy łodyga w pełni się rozwinie. - - - 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*} - - - 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*} - - - 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*} - - - Mączka kostna sprawia, że zbiory wyrastają natychmiast, a grzyby zamieniają się w duże grzyby.{*ICON*}351:15{*/ICON*} - - - Udało ci się ukończyć samouczek rolnictwa. - - - - Na tym obszarze zwierzęta zostały zamknięte. Możesz je rozmnażać, aby mieć małe zwierzątka. - - - - {*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. - - - Aby zwierzęta się rozmnażały, musisz nakarmić je odpowiednim jedzeniem, co wprowadzi je w miłosny nastrój. - - - 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. - - - 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. - - - Po przeminięciu miłosnego nastroju zwierzę nie będzie mogło osiągnąć go ponownie przez około 5 minut. - - - 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*} - - - - 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. - - - Udało ci się ukończyć samouczek zwierząt i rozmnażania. - - - - Na tym terenie znajdziesz dynie oraz bloki, z których można zbudować śnieżnego i żelaznego golema. - - - - {*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. - - - Golemy powstają po umieszczeniu dyni na szczycie stosu bloków. - - - Ś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. - - - Ż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. - - - Żelazne golemy można także znaleźć w wioskach, które ochraniają. Zaatakują cię, jeżeli ty zaatakujesz osadników. - - - Nie możesz opuścić tego obszaru, dopóki nie ukończysz samouczka. - - - 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. - - - Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj siekiery, aby ścinać drzewa. - - - 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. - - - Niektóre narzędzia są lepsze podczas atakowania przeciwników. Użyj miecza, aby atakować. - - - 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... - - - 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ść. - - - Przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby płynąć do góry. - - - 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. - - - 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ąść. - - - W skrzyni w pobliżu stawu znajdziesz wędkę. Wyjmij ją ze skrzyni i wybierz jako aktualnie używany przedmiot, aby z niej skorzystać. - - - 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. - Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. + + Przeczytaj + + + Powieś + + + Rzuć + + + Otwórz + + + Zmień wysokość + + + Wysadź + + + Zasadź + + + Odblokuj pełną wersję gry + + + Usuń zapis gry + + + Usuń + + + Uprawiaj ziemię + + + Zbieraj + + + Kontynuuj + + + Płyń w górę + + + Uderz + + + Wydój + + + Zbierz + + + Opróżnij + + + Osiodłaj + + + Odłóż + + + Zjedz + + + Jedź + + + Płyń + + + Przyspiesz wzrost + + + Śpij + + + Obudź się + + + Graj + + + Opcje + + + Przenieś pancerz + + + Przenieś broń + + + Wyposaż + + + Przenieś składnik + + + Przenieś opał + + + Przenieś narzędzie + + + Naciągnij + + + Strona w górę + + + Strona w dół + + + Miłosny nastrój + + + Zwolnij + + + Przywileje + + + Blok + + + Tworzenie + + + Zablokuj poziom + + + Wybierz skórkę + + + Podpal + + + Zaproś znajomych + + + Akceptuj + + + Ostrzyż + + + Nawiguj + + + Zainstaluj ponownie + + + Zap. opcje + + + Wykonaj polecenie + + + Zainstaluj pełną wersję + + + Zainstaluj próbną wersję + + + Instaluj + + + Wyrzuć + + + Odśwież listę gier sieciowych + + + Gry drużynowe + + + Wszystkie gry + + + Wyjdź + + + Anuluj + + + Anuluj dołączanie + + + Zmień grupę + + + Wytwarzanie + + + Stwórz + + + Podnieś/odłóż + + + Pokaż ekwipunek + + + Pokaż opis + + + Pokaż składniki + + + Cofn. + + + Przypomnienie: + + + + + + W najnowszej wersji dodano nowe elementy do gry, wliczając w to nowe obszary w świecie samouczka. + 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. @@ -3429,28 +1356,9 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< {*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. - - Przypomnienie: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - W najnowszej wersji dodano nowe elementy do gry, wliczając w to nowe obszary w świecie samouczka. - {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby rozegrać samouczek normalnie.{*B*} Wciśnij{*CONTROLLER_VK_B*}, aby pominąć samouczek. - - - 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. - - - Dalej znajdują się przykłady dotyczące budowy, rolnictwa, wagoników i torów, zaklinania, warzenia, handlu, kowalstwa i innych rzeczy! - - - - Twój wskaźnik najedzenia spadł do tak niskiego poziomu, że automatyczne leczenie przestało działać. @@ -3464,102 +1372,19 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< Użyj - - Cofn. + + 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. - - Wyjdź + + Dalej znajdują się przykłady dotyczące budowy, rolnictwa, wagoników i torów, zaklinania, warzenia, handlu, kowalstwa i innych rzeczy! - - Anuluj - - - Anuluj dołączanie - - - Odśwież listę gier sieciowych - - - Gry drużynowe - - - Wszystkie gry - - - Zmień grupę - - - Pokaż ekwipunek - - - Pokaż opis - - - Pokaż składniki - - - Wytwarzanie - - - Stwórz - - - Podnieś/odłóż + + + Twój wskaźnik najedzenia spadł do tak niskiego poziomu, że automatyczne leczenie przestało działać. Weź - - Weź wszystko - - - Weź połowę - - - Odłóż - - - Odłóż wszystko - - - Odłóż jedno - - - Upuść - - - Upuść wszystko - - - Upuść jedno - - - Zamień - - - Szybkie przeniesienie - - - Wyczyść szybki wybór - - - Co to jest? - - - Udostępnij na Facebooku - - - Zmień filtr - - - Wyślij zaproszenie do znajomych - - - Strona w dół - - - Strona w górę - Dalej @@ -3569,18 +1394,18 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< Wyrzuć gracza + + Wyślij zaproszenie do znajomych + + + Strona w dół + + + Strona w górę + Farbuj - - Wydobywaj - - - Nakarm - - - Oswój - Ulecz @@ -3590,1068 +1415,874 @@ W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią.< Chodź za mną - - Wyrzuć + + Wydobywaj - - Opróżnij + + Nakarm - - Osiodłaj + + Oswój - + + Zmień filtr + + + Odłóż wszystko + + + Odłóż jedno + + + Upuść + + + Weź wszystko + + + Weź połowę + + Odłóż - - Uderz + + Upuść wszystko - - Wydój + + Wyczyść szybki wybór - - Zbierz + + Co to jest? - - Zjedz + + Udostępnij na Facebooku - - Śpij + + Upuść jedno - - Obudź się + + Zamień - - Graj - - - Jedź - - - Płyń - - - Przyspiesz wzrost - - - Płyń w górę - - - Otwórz - - - Zmień wysokość - - - Wysadź - - - Przeczytaj - - - Powieś - - - Rzuć - - - Zasadź - - - Uprawiaj ziemię - - - Zbieraj - - - Kontynuuj - - - Odblokuj pełną wersję gry - - - Usuń zapis gry - - - Usuń - - - Opcje - - - Zaproś znajomych - - - Akceptuj - - - Ostrzyż - - - Zablokuj poziom - - - Wybierz skórkę - - - Podpal - - - Nawiguj - - - Zainstaluj pełną wersję - - - Zainstaluj próbną wersję - - - Instaluj - - - Zainstaluj ponownie - - - Zap. opcje - - - Wykonaj polecenie - - - Tworzenie - - - Przenieś składnik - - - Przenieś opał - - - Przenieś narzędzie - - - Przenieś pancerz - - - Przenieś broń - - - Wyposaż - - - Naciągnij - - - Zwolnij - - - Przywileje - - - Blok - - - Strona w górę - - - Strona w dół - - - Miłosny nastrój - - - Wypij - - - Obróć - - - Ukryj - - - Wyczyść wszystkie miejsca - - - OK - - - Anuluj - - - Sklep Minecraft - - - Czy na pewno chcesz opuścić tę grę i dołączyć do innej? Niezapisany postęp zostanie utracony. - - - Wyjdź z gry - - - Zapisz grę - - - Wyjdź bez zapisywania - - - Czy na pewno chcesz nadpisać poprzedni zapis tego świata jego obecną wersją? - - - Czy na pewno chcesz wyjść bez zapisywania? Utracisz cały postęp w tym świecie! - - - Rozpocznij grę - - - Uszkodzony zapis gry - - - Ten zapis gry jest uszkodzony. Czy chcesz go usunąć? - - - Czy na pewno chcesz wyjść do głównego menu i rozłączyć wszystkich pozostałych graczy? Niezapisany postęp zostanie utracony. - - - Wyjdź i zapisz - - - Wyjdź bez zapisywania - - - Czy na pewno chcesz wyjść do głównego menu? Niezapisany postęp zostanie utracony. - - - Czy na pewno chcesz wyjść do głównego menu? Twój postęp zostanie utracony! - - - Stwórz nowy świat - - - Rozegraj samouczek - - - Samouczek - - - Nazwij swój świat - - - Podaj nazwę swojego świata - - - Podaj numer ziarna do generowania świata - - - Wczytaj zapisany świat - - - Wciśnij START, aby grać - - - Opuszczanie gry - - - Wystąpił błąd. Powrót do głównego menu. - - - Połączenie nieudane - - - Utracono połączenie - - - Utracono połączenie z serwerem. Powrót do głównego menu. - - - Utracono połączenie z serwerem - - - Wyrzucono cię z gry - - - Wyrzucono cię z gry za latanie - - - Próba połączenia trwała zbyt długo - - - Serwer jest pełny - - - Host wyszedł z gry - - - Nie możesz dołączyć do tej gry, ponieważ żaden z graczy nie znajduje się na twojej liście znajomych. - - - Nie możesz dołączyć do tej gry, ponieważ wcześniej host cię wyrzucił. - - - Nie możesz dołączyć do tej gry, ponieważ host używa starszej wersji gry. - - - Nie możesz dołączyć do tej gry, ponieważ host używa nowszej wersji gry. - - - Nowy świat - - - 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: - - - Znajomi - - - Mój wynik - - - Ogólne - - - Wpisy: - - - Poz. - - - Przygotowywanie do zapisania poziomu - - - Przygotowywanie kawałków składowych... - - - Finalizowanie... - - - Budowanie terenu - - - Symulacja świata - - - Przygotowywanie serwera - - - Tworzenie obszaru odrodzenia - - - Wczytywanie obszaru odrodzenia - - - Wkraczasz do Otchłani - - - Opuszczasz Otchłań - - - Odradzanie - - - Generowanie poziomu - - - Wczytywanie poziomu - - - Zapisywanie graczy - - - Łączenie z hostem - - - Pobieranie terenu - - - Przełączanie do gry offline - - - Czekaj, aż host zapisze grę - - - Wkraczasz do Kresu - - - Opuszczasz Kres - - - To łóżko jest zajęte - - - Możesz spać tylko w nocy - - - %s śpi w łóżku. Aby przyspieszyć nadejście poranka, wszyscy gracze muszą położyć się w łóżkach w tej samej chwili. - - - Twoje łóżko zniknęło lub było zablokowane - - - Nie możesz teraz odpoczywać, w pobliżu są potwory - - - Śpisz w łóżku. Aby przyspieszyć nadejście poranka, wszyscy gracze muszą położyć się w łóżkach w tej samej chwili. - - - Narzędzia i broń - - - Broń - - - Jedzenie - - - Konstrukcje - - - Pancerz - - - Mechanizmy - - - Transport - - - Dekoracje - - - Bloki do budowy - - - Czerwony kamień i transport - - - Inne - - - Warzenie - - - Narzędzia, broń i pancerz - - - Materiały - - - Wypisano się - - - Poziom trudności - - - Muzyka - - - Dźwięk - - - Gamma - - - Czułość gry - - - Czułość interfejsu - - - Spokojny - - - Niski - - - Normalny - - - Wysoki - - - W tym trybie gracz automatycznie regeneruje zdrowie i nie napotka żadnych przeciwników. - - - W tym trybie pojawiają się przeciwnicy, ale zadają graczowi mniejsze obrażenia niż na normalnym poziomie trudności. - - - W tym trybie pojawiają się przeciwnicy i będą zadawać graczowi standardowe obrażenia. - - - 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! - - - Koniec wersji próbnej - - - Wybrana gra jest pełna - - - Nie udało się dołączyć do gry, brak wolnych miejsc - - - Wpisz tekst na znaku - - - Wpisz tekst na swoim znaku - - - Wpisz nazwę - - - Wpisz nazwę swojego postu - - - Wpisz nagłówek - - - Wpisz nagłówek swojego postu - - - Wpisz opis - - - Wpisz opis swojego postu - - - Ekwipunek - - - Składniki - - - Stacja alchemiczna - - - Skrzynia - - - Zaklinanie - - - Piec - - - Składnik - - - Opał - - - Dozownik - - - Aktualnie nie ma dostępnej zawartości do pobrania tego typu dla tej gry. - - - Gracz %s dołącza do gry. - - - Gracz %s opuszcza grę. - - - Gracz %s zostaje wyrzucony z gry. - - - Czy na pewno chcesz usunąć ten zapis gry? - - - Oczekiwanie na akceptację - - - Ocenzurowano - - - Teraz gra: - - - Resetuj ustawienia - - - Czy na pewno chcesz zresetować ustawienia do wartości standardowych? - - - Błąd wczytywania - - - Gra gracza %s - - - Gra nieznanego hosta - - - Gość się wypisał - - - Jeden z gości się wypisał, co oznacza, że pozostali goście zostaną usunięci z gry. - - - Wpisz się - - - Nie jesteś wpisany. Aby zagrać, musisz się wpisać. Chcesz się wpisać teraz? - - - Tryb wieloosobowy niedostępny - - - Nie udało się stworzyć gry - - - Automatyczny wybór - - - Brak pakietu: standard. skórki - - - Ulubione skórki - - - Zablokowany poziom - - - 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. - - - Zablokować ten poziom? - - - Czy na pewno chcesz dodać ten poziom do listy zablokowanych poziomów? -Wybranie „OK” spowoduje wyjście z gry. - - - Usuń z listy zablokowanych poziomów - - - Odstęp czasowy automatycznego zapisu - - - Odstęp czasowy automatycznego zapisu: WYŁ. - - - min - - - Nie można tu umieścić! - - - 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. - - - Przezroczystość interfejsu - - - Przygotowywanie do automatycznego zapisania poziomu - - - Rozmiar interfejsu - - - Rozmiar interfejsu (podzielony ekran) - - - Ziarno - - - Odblokuj pakiet skórek - - - Aby korzystać z wybranej skórki, musisz odblokować pakiet skórek. -Odblokować go teraz? - - - Odblokuj pakiet tekstur - - - Aby korzystać z wybranego pakietu tekstur, musisz go odblokować. -Odblokować go teraz? - - - Próbny pakiet tekstur - - - 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? - - - Brak pakietu tekstur - - - Odblokuj pełną wersję - - - Pobierz próbną wersję - - - Pobierz pełną wersję - - - Ten świat wykorzystuje pakiet łączony lub pakiet tekstur, którego nie posiadasz! -Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? - - - Pobierz próbną wersję - - - Pobierz pełną wersję - - - Wyrzuć gracza - - - Czy na pewno chcesz wyrzucić tego gracza z gry? Nie będzie mógł ponownie dołączyć, dopóki nie zrestartujesz świata. - - - Pakiety obrazków - - - Motywy - - - Pakiety skórek - - - Znajomi znajomych mogą dołączać - - - Nie możesz dołączyć do tej gry, ponieważ została ona ograniczona tylko do znajomych hosta. - - - Nie można dołączyć do gry - - - Wybrano - - - Wybrana skórka: - - - Uszkodzona zawartość do pobrania - - - 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. - - - 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. - - - Tryb gry został zmieniony - - - Zmień nazwę świata - - - Podaj nową nazwę swojego świata - - - Tryb gry: Przetrwanie - - - Tryb gry: Tworzenie - - - Przetrwanie - - - Tworzenie - - - Stworzone w trybie przetrwania - - - Stworzone w trybie tworzenia - - - Renderuj chmury - - - Co chcesz zrobić z tym zapisem gry? - - - Zmień nazwę zapisu gry - - - Autozapis za %d... - - - Wł. - - - Wył. - - - Normalny - - - Superpłaski - - - Po włączeniu gra będzie grą sieciową. - - - Po włączeniu tylko zaproszeni gracze będą mogli dołączyć. - - - Po włączeniu znajomi twoich znajomych będą mogli dołączać do gry. - - - Po włączeniu gracze będą mogli ranić innych graczy. Działa tylko w trybie przetrwania. - - - Po wyłączeniu gracze, którzy dołączą do gry, nie będą mogli budować lub wydobywać, dopóki nie dostaną pozwolenia. - - - Po włączeniu ogień będzie mógł się rozprzestrzeniać na pobliskie łatwopalne bloki. - - - Po włączeniu trotyl będzie wybuchać po aktywacji. - - - 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. - - - Po włączeniu miejsca takie jak wioski i twierdze będą pojawiać się w świecie. - - - Po włączeniu zostanie wygenerowany całkowicie płaski świat zewnętrzny i Otchłań. - - - Po włączeniu, w pobliżu miejsca odrodzenia znajdzie się skrzynia z przydatnymi przedmiotami. + + Szybkie przeniesienie Pakiety skórek - - Motywy + + Zabarwiona szyba – czerwona - - Obrazki + + Zabarwiona szyba – zielona - - Przedmioty dla awatara + + Zabarwiona szyba – brązowa - - Pakiety tekstur + + Zabarwione szkło – białe - - Pakiety łączone + + Zabarwiona szyba - - Gracz {*PLAYER*} spłonął. + + Zabarwiona szyba – czarna - - Gracz {*PLAYER*} zamienił się w popiół. + + Zabarwiona szyba – niebieska - - Gracz {*PLAYER*} próbował pływać w lawie. + + Zabarwiona szyba – szara - - Gracz {*PLAYER*} udusił się w ścianie. + + Zabarwiona szyba – różowa - - Gracz {*PLAYER*} utonął. + + Zabarwiona szyba – limonkowa - - Gracz {*PLAYER*} zmarł z głodu. + + Zabarwiona szyba – fioletowa - - Gracz {*PLAYER*} został zakłuty na śmierć. + + Zabarwiona szyba – błękitna - - Gracz {*PLAYER*} za mocno uderzył w ziemię. + + Zabarwiona szyba – jasnoszara - - Gracz {*PLAYER*} wypadł poza świat. + + Zabarwione szkło – pomarańczowe - - Gracz {*PLAYER*} zginął. + + Zabarwione szkło – niebieskie - - Gracz {*PLAYER*} wybuchł. + + Zabarwione szkło – fioletowe - - Gracz {*PLAYER*} został zabity przez magię. + + Zabarwione szkło – błękitne - - Gracz {*PLAYER*} został zabity oddechem Kresosmoka. + + Zabarwione szkło – czerwone - - Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + Zabarwione szkło – zielone - - Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + Zabarwione szkło – brązowe - - Gracz {*PLAYER*} został zastrzelony przez: {*SOURCE*}. + + Zabarwione szkło – jasnoszare - - Gracz {*PLAYER*} oberwał kulą ognia od: {*SOURCE*}. + + Zabarwione szkło – żółte - - Gracz {*PLAYER*} został stłuczony przez: {*SOURCE*}. + + Zabarwione szkło – jasnoniebieskie - - Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + Zabarwione szkło – wrzosowe - - Mgła skały macierzystej + + Zabarwione szkło – szare - - Wyświetl interfejs + + Zabarwione szkło – różowe - - Wyświetl rękę + + Zabarwione szkło – limonkowe - - Komunikaty o śmierci + + Zabarwiona szyba – żółta - - Animacja postaci + + Jasnoszary - - Specjalna animacja skórek + + Szary - - Nie możesz wydobywać i używać przedmiotów + + Różowy - - Możesz wydobywać i używać przedmiotów + + Niebieski - - Nie możesz umieszczać bloków + + Fioletowy - - Możesz umieszczać bloki + + Błękitny - - Możesz korzystać z drzwi i przełączników + + Limonkowy - - Nie możesz korzystać z drzwi i przełączników + + Pomarańczowy - - Możesz korzystać z pojemników (np. skrzyń) + + Biały - - Nie możesz korzystać z pojemników (np. skrzyń) + + Spersonalizowany - - Nie możesz atakować istot + + Żółty - - Możesz atakować istoty + + Jasnoniebieski - - Nie możesz atakować graczy + + Wrzosowy - - Możesz atakować graczy + + Brązowy - - Nie możesz atakować zwierząt + + Zabarwiona szyba – biała - - Możesz atakować zwierzęta + + Mała kula - - Jesteś teraz moderatorem + + Duża kula - - Nie jesteś już moderatorem + + Zabarwiona szyba – jasnoniebieska - - Możesz latać + + Zabarwiona szyba – wrzosowa - - Nie możesz już latać + + Zabarwiona szyba – pomarańczowa - - Nie będziesz się już męczyć + + Gwiazda - - Będziesz się męczyć + + Czarny - - Jesteś niewidzialny + + Czerwony - - Nie jesteś już niewidzialny + + Zielony - - Jesteś nieśmiertelny + + Czyhacz - - Nie jesteś już nieśmiertelny + + Rozproszenie - - %d MSP + + Nieznany kształt - - Kresosmok + + Zabarwione szkło – czarne - - Gracz %s wkracza do Kresu + + Żelazna zbroja dla konia - - Gracz %s opuszcza Kres + + Złota zbroja dla konia - + + Diamentowa zbroja dla konia + + + Komparator + + + Wagonik z trotylem + + + Wagonik z lejem + + + Smycz + + + Znacznik + + + Skrzynia z pułapką + + + Obciążeniowa płyta naciskowa (lekka) + + + Tabliczka z imieniem + + + Deski z drewna (dowolnego rodzaju) + + + Blok poleceń + + + Gwiazda pirotechniczna + + + Te zwierzęta można oswoić i na nich jeździć. Można przymocować do nich skrzynię. + + + Muł + + + Rodzi się, gdy rozmnoży się koń i osioł. Te zwierzęta można oswoić, jeździć na nich i przymocować im skrzynie. + + + Koń + + + Te zwierzęta można oswoić i na nich jeździć. + + + Osioł + + + Koń zombie + + + Pusta mapa + + + Gwiazda z Otchłani + + + Fajerwerk + + + Szkieletowy koń + + + Uschnięty + + + Powstaje z czaszek uschniętych kościotrupów oraz piasku dusz. Strzela w ciebie wybuchającymi czaszkami. + + + Obciążeniowa płyta naciskowa (ciężka) + + + Zabarwiona glina – jasnoszara + + + Zabarwiona glina – szara + + + Zabarwiona glina – różowa + + + Zabarwiona glina – niebieska + + + Zabarwiona glina – fioletowa + + + Zabarwiona glina – błękitna + + + Zabarwiona glina – limonkowa + + + Zabarwiona glina – pomarańczowa + + + Zabarwiona glina – biała + + + Zabarwione szkło + + + Zabarwiona glina – żółta + + + Zabarwiona glina – jasnoniebieska + + + Zabarwiona glina – wrzosowa + + + Zabarwiona glina – brązowa + + + Lej + + + Tor aktywujący + + + Podajnik + + + Komparator + + + Czujnik światła słonecznego + + + Blok czerwonego kamienia + + + Zabarwiona glina + + + Zabarwiona glina – czarna + + + Zabarwiona glina – czerwona + + + Zabarwiona glina – zielona + + + Bela siana + + + Utwardzona glina + + + Blok węgla + + + Zaniknięcie + + + 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. + + + Po włączeniu gracze zachowają swój ekwipunek po śmierci. + + + Po wyłączeniu istoty nie będą pojawiały się naturalnie. + + + Tryb gry: Przygoda + + + Przygoda + + + Wpisz ziarno, aby jeszcze raz wygenerować ten sam teren. Pozostaw puste, aby stworzyć losowy świat. + + + Po wyłączeniu potwory i zwierzęta nie będą pozostawiały przedmiotów (np. czyhacze nie pozostawią prochu strzelniczego). + + + Gracz {*PLAYER*} spadł z drabiny. + + + Gracz {*PLAYER*} spadł z pnączy. + + + Gracz {*PLAYER*} wypadł z wody. + + + Po wyłączeniu bloki nie będą zostawiały przedmiotów po zniszczeniu (np. kamienne bloki nie pozostawią kamienia brukowego). + + + Po wyłączeniu gracze nie będą naturalnie regenerować zdrowia. + + + Po wyłączeniu pora dnia nie będzie się zmieniać. + + + Wagonik + + + Smycz + + + Zwolnij + + + Przymocuj + + + Zsiądź + + + Przyczep skrzynię + + + Wystrzel + + + Nadaj imię + + + Znacznik + + + Główna moc + + + Drugorzędna moc + + + Koń + + + Podajnik + + + Lej + + + Gracz {*PLAYER*} spadł z dużej wysokości. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę nietoperzy. + + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych koni. + + + Opcje gry + + + Gracz {*PLAYER*} oberwał kulą ognia od: {*SOURCE*} za pomocą: {*ITEM*}. + + + Gracz {*PLAYER*} oberwał od: {*SOURCE*} za pomocą: {*ITEM*}. + + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*} za pomocą: {*ITEM*}. + + + Szkodzenie przez istoty + + + Przedmioty z bloków + + + Naturalna regeneracja + + + Cykl dnia + + + Zachowaj ekwipunek + + + Pojawianie się istot + + + Przedmioty z istot + + + Gracz {*PLAYER*} został zastrzelony przez: {*SOURCE*} za pomocą: {*ITEM*}. + + + Gracz {*PLAYER*} spadł zbyt daleko i został wykończony przez: {*SOURCE*}. + + + Gracz {*PLAYER*} spadł zbyt daleko i został wykończony przez: {*SOURCE*}. + + + Gracz {*PLAYER*} wszedł w ogień podczas walki z: {*SOURCE*}. + + + Gracz {*PLAYER*} został zepchnięty przez: {*SOURCE*}. + + + Gracz {*PLAYER*} został zepchnięty przez: {*SOURCE*}. + + + Gracz {*PLAYER*} został zepchnięty przez: {*SOURCE*} za pomocą przedmiotu {*ITEM*}. + + + Gracz {*PLAYER*} został spalony na popiół podczas walki z: {*SOURCE*}. + + + Gracz {*PLAYER*} został wysadzony przez: {*SOURCE*}. + + + Gracz {*PLAYER*} uschnął. + + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*} za pomocą: {*ITEM*}. + + + Gracz {*PLAYER*} próbował pływać w lawie, aby uciec przed: {*SOURCE*}. + + + Gracz {*PLAYER*} utonął, próbując uciec przed: {*SOURCE*}. + + + Gracz {*PLAYER*} wdepnął w kaktus, próbując uciec przed: {*SOURCE*}. + + + Dosiądź + + -{*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*} - + Aby kierować koniem, musisz włożyć mu siodło, które można kupić od osadników lub znaleźć w ukrytych skrzyniach. + + + + + 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ę. + + + + + 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. + + + + + 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ć. + + + + + Gdy pojawią się przy nim serduszka, będzie oswojony i nie będzie już próbował cię zrzucić. + + + + + Spróbuj teraz pojechać konno. Użyj {*CONTROLLER_ACTION_USE*} bez żadnych przedmiotów lub narzędzi w ręku, aby go dosiąść. + + + + + Tutaj możesz próbować oswoić konie i osły. W pobliskiej skrzyni znajdziesz siodła, zbroje dla konia i inne przydatne przedmioty. + + + + + Znacznik na piramidzie z co najmniej czterema poziomami będzie miał dostępną drugorzędną moc regeneracji lub możliwość wzmocnienia mocy głównej. + + + + + 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. + + + + Na szczycie tej piramidy znajduje się nieaktywny znacznik. + + + + Oto interfejs znacznika, który służy do wyboru mocy dla znacznika. + + + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z interfejsu znaczników. + + + + + 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. + + + + + 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. + + + + + Oto interfejs ekwipunku konia. + + + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku konia. + + + + + Ekwipunek konia umożliwia przekazywanie lub wyposażanie w przedmioty konia, osła lub muła. + + + + Iskrzenie + + + Smuga + + + Czas lotu: + + + + Osiodłaj konia, umieszczając siodło w odpowiednim miejscu. Konie można wyposażyć w zbroję, umieszczając ją w odpowiednim miejscu. + + + + Udało ci się znaleźć muła. + + + + {*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. + + + + + Konie i osły można spotkać na równinach. Muły są potomstwem osłów i koni, ale same są bezpłodne. + + + + + Za pomocą tego menu możesz także przekazywać przedmioty między własnym ekwipunkiem a torbami u osłów i mułów. + + + + Udało ci się znaleźć konia. + + + Udało ci się znaleźć osła. + + + + {*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. + + + + + Gwiazdy pirotechniczne można wytwarzać, umieszczając w siatce proch strzelniczy i barwnik. + + + + + Barwnik określi kolor gwiazdy w momencie eksplozji. + + + + + Kształt gwiazdy można określić, dodając ognisty ładunek, samorodek złota, pióro lub głowę istoty. + + + + + Możesz również wstawić do siatki kilka gwiazd pirotechnicznych, aby dodać je do fajerwerku. + + + + + Wypełniając więcej pól siatki prochem strzelniczym, zwiększysz wysokość, na której wybuchną gwiazdy pirotechniczne. + + + + + Powstały fajerwerk możesz następnie zabrać z odpowiedniego pola. + + + + + Efekt smugi lub iskrzenia można dodać, używając diamentów lub jasnopyłu. + + + + + 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. + + + + + 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. + + + + + Spróbuj wytworzyć fajerwerk w warsztacie, korzystając z różnych składników ukrytych w skrzyniach. + + + + + Po wytworzeniu gwiazdy pirotechnicznej możesz ustalić jej kolor w czasie zanikania, łącząc ją z barwnikiem. + + + + + Skrzynie w tej okolicy zawierają różne przedmioty wykorzystywane do wytwarzania FAJERWERKÓW! + + + + + {*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. + + + + + Aby wytworzyć fajerwerk, umieść proch strzelniczy i papier w siatce wytwarzania o wymiarach 3x3, widocznej nad twoim ekwipunkiem. + + + + W tym pokoju są leje. + + + + {*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. + + + + + Leje służą do umieszczania lub usuwania przedmiotów z pojemników i automatycznego podnoszenia wrzucanych do nich przedmiotów. + + + + + 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. + + + + + 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łę. + + + + + Skorzystaj ze znacznika, aby wybrać jego moc. Możesz użyć znajdujących się tu sztabek żelaza jako zapłaty. + + + + + Mogą wpływać na stacje alchemiczne, skrzynie, dozowniki, podajniki, wagoniki ze skrzyniami, wagoniki z lejami oraz inne leje. + + + + + W tym pokoju znajduje się kilka przydatnych układów lejów, z którymi możesz eksperymentować. + + + + + To interfejs fajerwerku, z którego możesz korzystać, by wytwarzać fajerwerki i gwiazdy pirotechniczne. + + + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z interfejsu fajerwerku. + + + + + 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. + + + + + Jeżeli lej zostanie zasilony czerwonym kamieniem, wyłączy się i przestanie wciągać i umieszczać przedmioty. + + + + + 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. + + + + Można je spotkać na bagnach. Atakują cię, rzucając miksturami. Po zabiciu zostawiają mikstury. + + + Osiągnięto maksymalną liczbę obrazów/ramek. + + + Nie możesz tworzyć przeciwników na poziomie trudności „Spokojny”. + + + 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. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kałamarnic. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę przeciwników. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę osadników. + + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych wilków. + + + Osiągnięto maksymalną liczbę głów istot. + + + Odwróć widok + + + Dla leworęcznych + + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych kur. + + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych grzybowych krów. + + + Osiągnięto maksymalną liczbę łódek. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kur. @@ -4703,9 +2334,63 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Resetuj Otchłań + + Gracz %s wkracza do Kresu + + + Gracz %s opuszcza Kres + + + +{*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*} + + 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! + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę świń, owiec, krów, kotów i koni. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę grzybowych krów. + + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę wilków. + Resetuj Otchłań @@ -4713,113 +2398,11 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Nie resetuj Otchłani - Nie możesz teraz ostrzyc tej grzybowej krowy. Osiągnięto maksymalną liczbę świń, owiec, krów i kotów. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę świń, owiec, krów i kotów. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę grzybowych krów. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę wilków. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kur. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kałamarnic. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę przeciwników. - - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę osadników. - - - Osiągnięto maksymalną liczbę obrazów/ramek. - - - Nie możesz tworzyć przeciwników na poziomie trudności „Spokojny”. - - - 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. - - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych wilków. - - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych kur. - - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych grzybowych krów. - - - Osiągnięto maksymalną liczbę łódek. - - - Osiągnięto maksymalną liczbę głów istot. - - - Odwróć widok - - - Dla leworęcznych + Nie możesz teraz ostrzyc tej grzybowej krowy. Osiągnięto maksymalną liczbę świń, owiec, krów, kotów i koni. Nie żyjesz! - - Odrodzenie - - - Oferta zawartości do pobrania - - - Zmień skórkę - - - Instrukcja - - - Sterowanie - - - Ustawienia - - - Napisy - - - Przeinstaluj zawartość - - - Opcje programisty - - - Ogień się rozprzestrzenia - - - Trotyl wybucha - - - Gracz kontra gracz (PvP) - - - Ufaj graczom - - - Przywileje hosta - - - Generowanie budynków - - - Superpłaski świat - - - Dodatkowa skrzynia - Opcje świata @@ -4829,18 +2412,18 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Może korzystać z drzwi i przełączników + + Generowanie budynków + + + Superpłaski świat + + + Dodatkowa skrzynia + Może otwierać pojemniki - - Może atakować graczy - - - Może atakować zwierzęta - - - Moderator - Wyrzuć gracza @@ -4850,185 +2433,308 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Wyłącz zmęczenie + + Może atakować graczy + + + Może atakować zwierzęta + + + Moderator + + + Przywileje hosta + + + Instrukcja + + + Sterowanie + + + Ustawienia + + + Odrodzenie + + + Oferta zawartości do pobrania + + + Zmień skórkę + + + Napisy + + + Trotyl wybucha + + + Gracz kontra gracz (PvP) + + + Ufaj graczom + + + Przeinstaluj zawartość + + + Opcje programisty + + + Ogień się rozprzestrzenia + + + Kresosmok + + + Gracz {*PLAYER*} został zabity oddechem Kresosmoka. + + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + + Gracz {*PLAYER*} zginął. + + + Gracz {*PLAYER*} wybuchł. + + + Gracz {*PLAYER*} został zabity przez magię. + + + Gracz {*PLAYER*} został zastrzelony przez: {*SOURCE*}. + + + Mgła skały macierzystej + + + Wyświetl interfejs + + + Wyświetl rękę + + + Gracz {*PLAYER*} oberwał kulą ognia od: {*SOURCE*}. + + + Gracz {*PLAYER*} został stłuczony przez: {*SOURCE*}. + + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*} za pomocą magii. + + + Gracz {*PLAYER*} wypadł poza świat. + + + Pakiety tekstur + + + Pakiety łączone + + + Gracz {*PLAYER*} spłonął. + + + Motywy + + + Obrazki + + + Przedmioty dla awatara + + + Gracz {*PLAYER*} zamienił się w popiół. + + + Gracz {*PLAYER*} zmarł z głodu. + + + Gracz {*PLAYER*} został zakłuty na śmierć. + + + Gracz {*PLAYER*} za mocno uderzył w ziemię. + + + Gracz {*PLAYER*} próbował pływać w lawie. + + + Gracz {*PLAYER*} udusił się w ścianie. + + + Gracz {*PLAYER*} utonął. + + + Komunikaty o śmierci + + + Nie jesteś już moderatorem + + + Możesz latać + + + Nie możesz już latać + + + Nie możesz atakować zwierząt + + + Możesz atakować zwierzęta + + + Jesteś teraz moderatorem + + + Nie będziesz się już męczyć + + + Jesteś nieśmiertelny + + + Nie jesteś już nieśmiertelny + + + %d MSP + + + Będziesz się męczyć + + + Jesteś niewidzialny + + + Nie jesteś już niewidzialny + + + Możesz atakować graczy + + + Możesz wydobywać i używać przedmiotów + + + Nie możesz umieszczać bloków + + + Możesz umieszczać bloki + + + Animacja postaci + + + Specjalna animacja skórek + + + Nie możesz wydobywać i używać przedmiotów + + + Możesz korzystać z drzwi i przełączników + + + Nie możesz atakować istot + + + Możesz atakować istoty + + + Nie możesz atakować graczy + + + Nie możesz korzystać z drzwi i przełączników + + + Możesz korzystać z pojemników (np. skrzyń) + + + Nie możesz korzystać z pojemników (np. skrzyń) + Niewidzialność - - Opcje hosta + + Znaczniki - - Gracze/zaproszenia + + {*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*} + - - Gra sieciowa + + Fajerwerki - - Tylko za zaproszeniem + + Języki - - Więcej opcji + + Konie - - Wczytaj + + {*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*} + - - Nowy świat + + {*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. + - - Nazwa świata + + {*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ę. + - - Ziarno do generowania świata + + Po użyciu zamienia się w mapę części świata, w której jesteś, i wypełnia się w miarę zwiedzania. - - Zostaw puste, aby stworzyć losowe ziarno + + Do zdobycia po zabiciu Uschniętego, używana do tworzenia znaczników. - - Gracze + + Leje - - Dołącz do gry + + {*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*} + - - Rozpocznij grę + + Podajniki - - Nie znaleziono gier - - - Graj - - - Rankingi - - - Pomoc i opcje - - - Pełna wersja - - - Wznów grę - - - Zapisz grę - - - Poziom trudności: - - - Rodzaj gry: - - - Budynki: - - - Rodzaj poziomu: - - - PvP: - - - Ufaj graczom: - - - Trotyl: - - - Ogień się rozprzestrzenia: - - - Przeinstaluj motyw - - - Przeinstaluj obrazek 1 - - - Przeinstaluj obrazek 2 - - - Przeinstaluj przedmiot dla awatara 1 - - - Przeinstaluj przedmiot dla awatara 2 - - - Przeinstaluj przedmiot dla awatara 3 - - - Opcje - - - Dźwięk - - - Sterowanie - - - Grafika - - - Interfejs - - - Przywróć standardowe - - - Włącz kołysanie wzroku przy chodzeniu - - - Podpowiedzi - - - Wskazówki w grze - - - Pionowy podział ekranu w trybie dla 2 graczy - - - Wyjdź - - - Wpisz tekst znaku: - - - Dodaj opis do zdjęcia z gry - - - Podpis - - - Zdjęcie z gry - - - Wpisz tekst znaku: - - - Klasyczne tekstury, ikony i interfejs Minecrafta! - - - Pokaż wszystkie światy tematyczne - - - Bez efektów - - - Szybkość - - - Spowolnienie - - - Przyspieszenie - - - Powolne wydobywanie - - - Siła - - - Osłabienie + + NOT USED Natychmiastowe zdrowie @@ -5039,62 +2745,3277 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Wzmocnienie skoku + + Powolne wydobywanie + + + Siła + + + Osłabienie + Mdłości + + NOT USED + + + NOT USED + + + NOT USED + Regeneracja Odporność - - Odporność na ogień + + Szukanie ziarna do generowania świata - - Oddychanie pod wodą + + Po użyciu wywołuje kolorową eksplozję. Kolor, efekt, kształt i zasięg lotu zależą od gwiazdy pirotechnicznej użytej do wytworzenia fajerwerku. - - Niewidzialność + + Rodzaj toru, który może włączać i wyłączać wagoniki z lejami i aktywować wagoniki z trotylem. - - Oślepienie + + Przechowuje i upuszcza przedmioty lub przekłada je do innego pojemnika, gdy otrzyma zasilanie z czerwonego kamienia. - - Widzenie w ciemności + + Kolorowe bloki powstałe na skutek farbowania utwardzonej gliny. - - Głód + + 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. + + + Używany jako źródło zasilania z czerwonego kamienia. Może być przerobiony z powrotem na czerwony kamień. + + + Używany do łapania przedmiotów lub do przekazywania ich z lub do pojemników. + + + Można nim nakarmić konie, osły lub muły, aby przywrócić im do 10 serduszek zdrowia. Przyspiesza dorastanie źrebaków. + + + Nietoperz + + + Te latające stworzenia można spotkać w jaskiniach i innych dużych, zamkniętych przestrzeniach. + + + Wiedźma + + + Powstaje po przetopieniu gliny w piecu. + + + Powstaje ze szkła i barwnika. + + + Powstaje z zabarwionego szkła. + + + Dostarcza zasilanie z czerwonego kamienia. Zasilanie będzie silniejsze, jeżeli na płycie znajdzie się więcej przedmiotów. + + + Blok, który wysyła sygnał z czerwonego kamienia zależnie od światła słonecznego (albo jego braku). + + + 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. + + + Specjalny rodzaj zbroi, którą można włożyć na konia. Daje 5 pkt. pancerza. + + + Służy do określenia koloru, efektu i kształtu fajerwerku. + + + Używany w obwodach z czerwonego kamienia, aby utrzymać, porównać, osłabiać siłę sygnału lub mierzyć stan niektórych bloków. + + + Wagonik, który zachowuje się jak ruchomy blok trotylu. + + + Specjalny rodzaj zbroi, którą można włożyć na konia. Daje 7 pkt. pancerza. + + + Używany do wykonywania poleceń. + + + Wyświetla promień światła w kierunku nieba i może dawać różne efekty graczom. + + + 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. + + + Specjalny rodzaj zbroi, którą można włożyć na konia. Daje 11 pkt. pancerza. + + + Służy do przywiązywania istot do gracza lub słupków. + + + Służy do nazywania istot. + + + Przyspieszenie + + + Pełna wersja + + + Wznów grę + + + Zapisz grę + + + Graj + + + Rankingi + + + Pomoc i opcje + + + Poziom trudności: + + + PvP: + + + Ufaj graczom: + + + Trotyl: + + + Rodzaj gry: + + + Budynki: + + + Rodzaj poziomu: + + + Nie znaleziono gier + + + Tylko za zaproszeniem + + + Więcej opcji + + + Wczytaj + + + Opcje hosta + + + Gracze/zaproszenia + + + Gra sieciowa + + + Nowy świat + + + Gracze + + + Dołącz do gry + + + Rozpocznij grę + + + Nazwa świata + + + Ziarno do generowania świata + + + Zostaw puste, aby stworzyć losowe ziarno + + + Ogień się rozprzestrzenia: + + + Wpisz tekst znaku: + + + Dodaj opis do zdjęcia z gry + + + Podpis + + + Wskazówki w grze + + + Pionowy podział ekranu w trybie dla 2 graczy + + + Wyjdź + + + Zdjęcie z gry + + + Bez efektów + + + Szybkość + + + Spowolnienie + + + 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ć. + + + + {*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. + + + {*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. + + + {*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. + + + {*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*} + + + {*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ć. + + + + {*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. + + + + Następna strona + + + {*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. + + + {*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. + + + {*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. + + + {*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. + + + Byłeś na Mineconie? + + + Nikt w Mojang nie widział twarzy Junkboya. + + + Czy wiesz, że istnieje Minecraft Wiki? + + + Nie zwracaj uwagi na błędy. + + + Czyhacze narodziły się z błędu w kodowaniu. + + + To kura czy kaczka? + + + Nowe biuro Mojang jest czadowe! + + + {*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ć. + + + {*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. + + + {*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ć. + + + Minecon 2013 odbył się w Orlando, na Florydzie! + + + .party() było doskonałe! + + + Zawsze zakładaj, że plotki są fałszywe, zamiast zakładać, że są prawdziwe! + + + Poprzednia strona + + + Handel + + + Kowadło + + + 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. + + + Bieg + + + Co nowego + + + {*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*} + + + + Udostępnianie zdjęć + + + Skrzynie + + + Wytwarzanie + + + Piec + + + Podstawy + + + Interfejs + + + Ekwipunek + + + Dozownik + + + Zaklinanie + + + Portal do Otchłani + + + Tryb wieloosobowy + + + Hodowla zwierząt + + + Rozmnażanie zwierząt + + + Warzenie + + + deadmau5 lubi Minecrafta! + + + Świnioludy nie zaatakują cię, chyba że ty zaatakujesz ich pierwszy. + + + Możesz zmienić punkt odrodzenia i przeskoczyć w czasie do świtu, korzystając z łóżka. + + + Odbijaj kule ognia, którymi strzelają duchy! + + + Stwórz trochę pochodni, aby w nocy oświetlić teren. Potwory będą unikać obszarów w pobliżu pochodni. + + + Dzięki torom i wagonikom możesz szybciej dotrzeć do odległych miejsc! + + + Zasadź sadzonki, a wyrosną z nich drzewa. + + + Wybudowanie portalu umożliwi ci przeniesienie się do innego wymiaru – Otchłani. + + + Kopanie pionowo w dół lub w górę nie jest dobrym pomysłem. + + + Mączka kostna (z kości kościotrupa) może być użyta jako nawóz i sprawić, że rośliny wyrosną natychmiast! + + + Czyhacze wybuchają, gdy podejdą blisko ciebie! + + + Wciśnij{*CONTROLLER_VK_B*}, aby upuścić trzymany w ręku przedmiot! + + + Używaj odpowiednich do wykonywanego zadania narzędzi! + + + 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. + + + Jedzenie usmażonych steków wieprzowych odnawia więcej zdrowia niż jedzenie surowych. + + + Ustaw poziom trudności na „Spokojny”, by twoje zdrowie regenerowało się automatycznie, a w nocy nie atakowały cię żadne potwory! + + + Nakarm wilka kością, aby go oswoić. Wtedy może za tobą podążać lub warować w miejscu. + + + Aby wyrzucić przedmiot z ekranu ekwipunku, przesuń kursor poza krawędź menu i wciśnij{*CONTROLLER_VK_A*}. + + + Dostępna jest nowa zawartość do pobrania! Można ją znaleźć w sklepie Minecraft, w głównym menu. + + + 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. + + + Zmień ustawienia gammy, aby rozjaśnić lub przyciemnić obraz w grze. + + + Zaśnięcie w łóżku w nocy przyspieszy nastanie świtu. W trybie wieloosobowym wszyscy gracze muszą położyć się jednocześnie. + + + Użyj motyki, aby przygotować ziemię pod uprawę. + + + Pająki nie zaatakują cię w dzień, chyba że ty zaatakujesz pierwszy. + + + Kopanie ziemi lub piasku łopatą jest szybsze niż kopanie rękami! + + + Zabijaj świnie, aby zdobywać steki wieprzowe. Następnie smaż je i jedz, aby odzyskać zdrowie. + + + Zbieraj skóry krów i wytwarzaj z nich elementy pancerza. + + + Jeżeli masz puste wiadro, możesz napełnić je mlekiem krowy, wodą lub lawą! + + + Obsydian powstaje, gdy woda zetknie się ze źródłem lawy. + + + W grze można teraz ustawiać jedne ogrodzenia na drugich! + + + Niektóre zwierzęta pójdą za tobą, jeżeli trzymasz pszenicę w ręku. + + + Jeżeli zwierzę nie może przejść 20 bloków w dowolnym kierunku, nie zniknie ze świata gry. + + + Pozycja ogona wskazuje stan zdrowia oswojonych wilków. Karm je mięsem, aby je uzdrawiać. + + + Ugotuj kaktus w piecu, aby stworzyć zielony barwnik. + + + Zajrzyj do sekcji „Co nowego” w menu „Instrukcja”, aby zapoznać się z najnowszymi zmianami w grze. + + + Muzyka autorstwa C418! + + + Kim jest Notch? + + + Mojang zebrało więcej nagród niż ma pracowników! + + + Sławni ludzie grają w Minecrafta! + + + Notcha obserwuje ponad milion osób na twitterze! + + + Nie wszyscy mieszkańcy Szwecji są blondynami. Niektórzy, jak Jens z Mojang, są nawet rudzi! + + + Kiedyś w końcu pojawi się aktualizacja do tej gry! + + + Umieść dwie skrzynie obok siebie, aby stworzyć wielką skrzynię. + + + Uważaj podczas wznoszenia konstrukcji z wełny na wolnym powietrzu - błyskawice mogą ją podpalić. + + + Jedno wiadro lawy może być wykorzystane w piecu do przetopienia 100 bloków. + + + Dźwięk wydany przez blok muzyczny zależy od tego, jaki materiał znajduje się pod spodem. + + + Może upłynąć kilka minut, zanim lawa CAŁKOWICIE zniknie po usunięciu jej źródła. + + + Kamień brukowy jest odporny na kule ognia duchów, przez co nadaje się do zabezpieczenia portali. + + + 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. + + + Zombie i kościotrupy nie otrzymują obrażeń od światła słonecznego, jeżeli znajdują się w wodzie. + + + Kury składają jaja co 5–10 minut. + + + Obsydian można wydobywać tylko diamentowym kilofem. + + + Czychacze są najlepszym źródłem prochu strzelniczego. + + + Zaatakowanie wilka sprawi, że wszystkie pobliskie wilki rzucą się na ciebie. Tę cechę mają także zombie świnioludy. + + + Wilki nie mogą wejść do Otchłani. + + + Wilki nie atakują czyhaczy. + + + Wymagany do wydobycia wszelkiego rodzaju kamiennych bloków i rud. + + + Używany do pieczenia ciasta oraz jako składnik mikstur. + + + Wysyła ładunek elektryczny, gdy zostanie przełączona. Pozostaje przełączona do momentu ponownego użycia. + + + 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. + + + Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotego jabłka. + + + Odnawia 2{*ICON_SHANK_01*} i regeneruje zdrowie przez 4 sekundy. Powstaje z połączenia jabłka i samorodków złota. + + + Odnawia 2{*ICON_SHANK_01*}. Może ci zaszkodzić. + + + Używany w obwodach z czerwonego kamienia jako powtarzacz, opóźniacz i/lub dioda. + + + Służy jako droga dla wagoników. + + + Po zasileniu przyspiesza wagonik, który po nim przejedzie. Gdy nie jest zasilany, wagoniki się zatrzymują. + + + Działa jak płyta naciskowa (przesyła sygnał z czerwonego kamienia po zasileniu), ale może być aktywowany tylko przez wagonik. + + + Wysyła ładunek elektryczny, gdy zostanie wciśnięty. Pozostaje wciśnięty przez około sekundę, potem wyłącza się. + + + Przechowuje i wystrzeliwuje przedmioty w losowej kolejności, gdy otrzyma zasilanie z czerwonego kamienia. + + + Odgrywa nutę, gdy zostanie aktywowany. Uderz go, aby zmienić wysokość dźwięku. Umieszczenie na innym bloku zmieni instrument. + + + Odnawia 2,5{*ICON_SHANK_01*}. Powstaje po usmażeniu ryby w piecu. + + + Odnawia 1{*ICON_SHANK_01*}. + + + Odnawia 1{*ICON_SHANK_01*}. + + + Odnawia 3{*ICON_SHANK_01*}. + + + Pocisk do łuku. + + + Odnawia 2,5{*ICON_SHANK_01*}. + + + Odnawia 1{*ICON_SHANK_01*}. Można zjeść 6 razy. + + + Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Może ci zaszkodzić. + + + Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. + + + Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu steku wieprzowego w piecu. + + + Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można nakarmić nią ocelota, aby go oswoić. + + + 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. + + + Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu wieprzowiny w piecu. + + + Służy do przewożenia ciebie, zwierząt lub potworów po torach. + + + Służy do zabarwienia wełny na jasnoniebiesko. + + + Służy do zabarwienia wełny na błękitno. + + + Służy do zabarwienia wełny na fioletowo. + + + Służy do zabarwienia wełny na limonkowo. + + + Służy do zabarwienia wełny na szaro. + + + 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). + + + Służy do zabarwienia wełny na wrzosowo. + + + Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. + + + Służy do wytwarzania książek i map. + + + Służy do tworzenia biblioteczek. Może być zaklęta, aby zmienić się w zaklętą księgę. + + + Służy do zabarwienia wełny na niebiesko. + + + Odtwarza płyty muzyczne. + + + Służy do wytwarzania potężnych narzędzi, broni i elementów pancerza. + + + Służy do zabarwienia wełny na pomarańczowo. + + + Zdobywana z owiec, może być barwiona na różne kolory. + + + 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. + + + Służy do zabarwienia wełny na czarno. + + + Służy do transportowania materiałów po torach. + + + Będzie poruszać się po torach i przepychać inne wagoniki, gdy będzie w nim węgiel. + + + Służy do poruszania się po wodzie. Szybsza niż pływanie. + + + Służy do zabarwienia wełny na zielono. + + + Służy do zabarwienia wełny na czerwono. + + + Sprawia, że zboża, drzewa, wysoka trawa, duże grzyby i kwiaty wyrastają natychmiast. Może być użyta do barwienia. + + + Służy do zabarwienia wełny na różowo. + + + Służy do zabarwienia wełny na brązowo, używany jako składnik ciasteczek lub do uprawy kakao. + + + Służy do zabarwienia wełny na srebrno. + + + Służy do zabarwienia wełny na żółto. + + + Umożliwia atakowanie strzałami z dystansu. + + + Daje użytkownikowi 5 jednostek pancerza po założeniu. + + + Daje użytkownikowi 3 jednostki pancerza po założeniu. + + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + + Daje użytkownikowi 5 jednostek pancerza po założeniu. + + + Daje użytkownikowi 2 jednostki pancerza po założeniu. + + + Daje użytkownikowi 2 jednostki pancerza po założeniu. + + + Daje użytkownikowi 3 jednostki pancerza po założeniu. + + + Sztabka, która może być użyta do wytwarzania narzędzi z danego materiału. Powstaje po przetopieniu rudy w piecu. + + + 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. + + + 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. + + + Daje użytkownikowi 8 jednostek pancerza po założeniu. + + + Daje użytkownikowi 6 jednostek pancerza po założeniu. + + + Daje użytkownikowi 3 jednostki pancerza po założeniu. + + + Daje użytkownikowi 6 jednostek pancerza po założeniu. + + + Żelazne drzwi można otworzyć tylko czerwonym kamieniem, przyciskami lub przełącznikami. + + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + + Daje użytkownikowi 3 jednostki pancerza po założeniu. + + + Używana do ścinania drewna szybciej niż przy użyciu ręki. + + + Używana do uprawiania bloków ziemi oraz trawy i przygotowania ich pod plony. + + + Drewniane drzwi można otworzyć używając ich, uderzając w nie lub za pomocą czerwonego kamienia. + + + Daje użytkownikowi 2 jednostki pancerza po założeniu. + + + Daje użytkownikowi 4 jednostki pancerza po założeniu. + + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + + Daje użytkownikowi 2 jednostki pancerza po założeniu. + + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + + Daje użytkownikowi 2 jednostki pancerza po założeniu. + + + Daje użytkownikowi 5 jednostek pancerza po założeniu. + + + Używane do tworzenia zajmujących mało miejsca schodów. + + + Nalewa się do niej zupę grzybową. Zatrzymujesz miskę, gdy zupa zostanie zjedzona. + + + Służy do przenoszenia wody, lawy i mleka. + + + Służy do przenoszenia wody. + + + Wyświetla wpisany przez ciebie lub innych graczy tekst. + + + Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. + + + Materiał wybuchowy. Aktywowany przez podpalenie go krzesiwem lub ładunkiem elektrycznym. + + + Służy do przenoszenia lawy. + + + Pokazuje położenie Słońca i Księżyca. + + + Wskazuje twoje miejsce startu. + + + Tworzy obraz odkrywanego obszaru, gdy trzyma się ją w ręku. Służy do odnajdywania drogi. + + + Służy do przenoszenia mleka. + + + Służy do rozpalania ognia, podpalania trotylu i otwarcia portalu, gdy zostanie zbudowany. + + + Służy do łowienia ryb. + + + 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. + + + Używane jako materiał budowlany. Można z nich wytworzyć wiele różnych rzeczy. Powstają z dowolnego rodzaju drewna. + + + Używany jako materiał budowlany. Nie działa na niego grawitacja, jak na zwykły piasek. + + + Używany jako materiał budowlany. + + + Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + + Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + + Używana do oświetlania terenu. Pochodnie roztapiają śnieg i lód. + + + Używany do wytwarzania pochodni, strzał, znaków, drabin, ogrodzeń oraz rączek narzędzi i broni. + + + Przechowuje bloki i przedmioty. Umieść dwie skrzynie obok siebie, aby utworzyć wielką skrzynię o podwójnej pojemności. + + + 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. + + + Służy do poruszania się w pionie. + + + 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. + + + Umożliwia wytwarzanie bardziej rozmaitych przedmiotów. + + + Umożliwia przetapianie rudy, wytwarzanie węgla drzewnego i szkła oraz smażenie ryb i steków wieprzowych. + + + Żelazna siekiera + + + Lampa z czerwonym pyłem + + + Schody z drewna z dżungli + + + Schody brzozowe + + + Sterowanie + + + Czaszka + + + Kakao + + + Schody świerkowe + + + Smocze jajo + + + Kamień Kresu + + + Szkielet portalu Kresu + + + Schody z piaskowca + + + Paproć + + + Krzak + + + Układ + + + Wytwarzanie + + + Użyj + + + Akcja + + + Skradanie/lot w dół + + + Skradanie + + + Upuść + + + Zmień trzymany przedmiot + + + Pauza + + + Rozglądanie się + + + Chodzenie/bieganie + + + Ekwipunek + + + Skok/lot do góry + + + Skok + + + Portal Kresu + + + Łodyga dyni + + + Arbuz + + + Szyba + + + Furtka + + + Pnącza + + + Łodyga arbuza + + + Żelazne kraty + + + Popękane kamienne cegły + + + Kamienne cegły z mchem + + + Kamienne cegły + + + Grzyb + + + Grzyb + + + Rzeźbione kamienne cegły + + + Ceglane schody + + + Narośl z Otchłani + + + Schody z cegły z Otchłani + + + Płot z cegły z Otchłani + + + Kociołek + + + Stacja alchemiczna + + + Magiczny stół + + + Cegła z Otchłani + + + Kamień brukowy rybika + + + Kamień rybika + + + Schody z kamiennych cegieł + + + Lilia + + + Grzybnia + + + Kamienna cegła rybika + + + Zmiana trybu kamery + + + 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. + + + 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. + + + Zbierając i wytwarzając przedmioty, zapełniasz swój ekwipunek.{*B*} + Wciśnij{*CONTROLLER_ACTION_INVENTORY*}, aby otworzyć ekran ekwipunku. + + + Zebrane drewno może być przerobione na deski. Otwórz interfejs wytwarzania i zrób deski.{*PlanksIcon*} + + + 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*} + + + 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. + + + Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs wytwarzania. + + + 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. + + + Użyj{*CONTROLLER_ACTION_MOVE*}, aby się poruszać. + + + Użyj{*CONTROLLER_ACTION_LOOK*}, aby patrzeć w górę, w dół i rozglądać się dookoła. + + + 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. + + + 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... + + + Wciśnij{*CONTROLLER_ACTION_JUMP*}, aby podskoczyć. + + + 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*} + + + + Noc nadchodzi szybko, a przebywanie na zewnątrz bywa niebezpieczne. Możesz stworzyć pancerz i broń, ale najlepsze jest bezpieczne schronienie. + + + Otwórz pojemnik + + + 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*} + + + 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*} + + + + 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. + + + + W pobliżu znajduje się opuszczone schronienie górnika, które możesz wykończyć. + + + 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*} + + + 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. + + + Użyj{*CONTROLLER_ACTION_LEFT_SCROLL*} i{*CONTROLLER_ACTION_RIGHT_SCROLL*}, aby zmienić trzymany przedmiot. + + + 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*} + + + Ł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*} + + + Umieść celownik na warsztacie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać. + + + 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ć. + + + 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ą. + + + + + + + + + + + + + + + + + + + + + + + + Układ 1 + + + Poruszanie (podczas lotu) + + + Gracze/zaproszenia + + + + + + Układ 3 + + + Układ 2 + + + + + + + + + + + + + + + {*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ę. + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + + + + + + + + + + + + + + + + + + + + + + + + + + + Blok rybika + + + Kamienna płyta + + + Sprawny sposób przechowywania żelaza. + + + Blok żelaza + + + Płyta z drewna dębowego + + + Płyta z piaskowca + + + Kamienna płyta + + + Sprawny sposób przechowywania złota. + + + Kwiat + + + Biała wełna + + + Pomarańczowa wełna + + + Blok złota + + + Grzyb + + + Róża + + + Płyta z kamienia brukowego + + + Biblioteczka + + + Trotyl + + + Cegły + + + Pochodnia + + + Obsydian + + + Kamień z mchem + + + Płyta z cegieł z Otchłani + + + Płyta z drewna dębowego + + + Płyta z kamiennych cegieł + + + Płyta z cegieł + + + Płyta z drewna z dżungli + + + Płyta brzozowa + + + Płyta świerkowa + + + Wrzosowa wełna + + + Liście brzozy + + + Liście świerku + + + Liście dębu + + + Szkło + + + Gąbka + + + Liście z dżungli + + + Liście + + + Dąb + + + Świerk + + + Brzoza + + + Drewno świerkowe + + + Drewno brzozowe + + + Drewno z dżungli + + + Wełna + + + Różowa wełna + + + Szara wełna + + + Jasnoszara wełna + + + Jasnoniebieska wełna + + + Żółta wełna + + + Limonkowa wełna + + + Błękitna wełna + + + Zielona wełna + + + Czerwona wełna + + + Czarna wełna + + + Fioletowa wełna + + + Niebieska wełna + + + Brązowa wełna + + + Pochodnia (węgiel) + + + Jasnogłaz + + + Piasek dusz + + + Skała Otchłani + + + Blok lazurytu + + + Ruda lazurytu + + + Portal + + + Lampion z dyni + + + Trzcina cukrowa + + + Glina + + + Kaktus + + + Dynia + + + Ogrodzenie + + + Szafa grająca + + + Sprawny sposób przechowywania lazurytu. + + + Właz + + + Zamknięta skrzynia + + + Dioda + + + Lepki tłok + + + Tłok + + + Wełna (dowolnego koloru) + + + Uschnięty krzak + + + Ciasto + + + Blok muzyczny + + + Dozownik + + + Wysoka trawa + + + Pajęczyna + + + Łóżko + + + Lód + + + Warsztat + + + Sprawny sposób przechowywania diamentów. + + + Blok diamentu + + + Piec + + + Pole uprawne + + + Zboże + + + Ruda diamentu + + + Przywoływacz potworów + + + Ogień + + + Pochodnia (węgiel drz.) + + + Czerwony pył + + + Skrzynia + + + Schody z drewna dębowego + + + Znak + + + Ruda czerwonego kamienia + + + Żelazne drzwi + + + Płyta naciskowa + + + Śnieg + + + Przycisk + + + Pochodnia (czer. pył) + + + Dźwignia + + + Tor + + + Drabina + + + Drewniane drzwi + + + Kamienne schody + + + Tor z czujnikiem + + + Zasilany tor + + + Masz wystarczająco dużo kamienia brukowego, aby zbudować piec. Skorzystaj z warsztatu, aby go stworzyć. + + + Wędka + + + Zegarek + + + Jasnopył + + + Wagonik z piecem + + + Jajo + + + Kompas + + + Surowa ryba + + + Czerwony barwnik + + + Zielony barwnik + + + Kakao + + + Smażona ryba + + + Barwnik + + + Gruczoł atramentowy + + + Wagonik ze skrzynią + + + Śnieżka + + + Łódka + + + Skóra + + + Wagonik + + + Siodło + + + Czerwony kamień + + + Wiadro z mlekiem + + + Papier + + + Książka + + + Kula szlamu + + + Cegła + + + Glina + + + Trzcina cukrowa + + + Lazuryt + + + Mapa + + + Płyta muzyczna – „13” + + + Płyta muzyczna – „cat” + + + Łóżko + + + Powtarzacz z czer. kamienia + + + Ciasteczko + + + Płyta muzyczna – „blocks” + + + Płyta muzyczna – „mellohi” + + + Płyta muzyczna – „stal” + + + Płyta muzyczna – „strad” + + + Płyta muzyczna – „chirp” + + + Płyta muzyczna – „far” + + + Płyta muzyczna – „mall” + + + Ciasto + + + Szary barwnik + + + Różowy barwnik + + + Limonkowy barwnik + + + Fioletowy barwnik + + + Błękitny barwnik + + + Jasnoszary barwnik + + + Żółty barwnik + + + Mączka kostna + + + Kość + + + Cukier + + + Jasnoniebieski barwnik + + + Wrzosowy barwnik + + + Pomarańczowy barwnik + + + Znak + + + Skórzana zbroja + + + Żelazny napierśnik + + + Diamentowy napierś. + + + Żelazny hełm + + + Diamentowy hełm + + + Złoty hełm + + + Złoty napierśnik + + + Złote nogawice + + + Skórzane buty + + + Żelazne buty + + + Skórzane nogawice + + + Żelazne nogawice + + + Diamentowe nogawice + + + Skórzany hełm + + + Kamienna motyka + + + Żelazna motyka + + + Diamentowa motyka + + + Diamentowa siekiera + + + Złota siekiera + + + Drewniana motyka + + + Złota motyka + + + Kolczuga + + + Kolcze nogawice + + + Kolcze buty + + + Drewniane drzwi + + + Żelazne drzwi + + + Kolczy hełm + + + Diamentowe buty + + + Pióro + + + Proch strzelniczy + + + Ziarna pszenicy + + + Miska + + + Zupa grzybowa + + + Nić + + + Pszenica + + + Smażony stek wieprzowy + + + Obraz + + + Złote jabłko + + + Chleb + + + Krzemień + + + Surowy stek wieprzowy + + + Kij + + + Wiadro + + + Wiadro z wodą + + + Wiadro z lawą + + + Złote buty + + + Sztabka żelaza + + + Sztabka złota + + + Krzesiwo + + + Węgiel + + + Węgiel drzewny + + + Diament + + + Jabłko + + + Łuk + + + Strzała + + + Płyta muzyczna – „ward” + + + + Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz obiekty.{*StructuresIcon*} + + + + Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz narzędzia.{*ToolsIcon*} + + + + 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. + + + + Dzięki stworzonym narzędziom będziesz w stanie skuteczniej wydobywać materiały.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. + + + + 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*} + + + + 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*} + + + Zebrane drewno może być przerobione na deski. Wybierz ikonę desek i wciśnij{*CONTROLLER_VK_A*}, aby je stworzyć.{*PlanksIcon*} + + + + 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. + + + + 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. + + + + 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. + + + + Lista składników niezbędnych do wytworzenia wybranego przedmiotu. + + + + Opis aktualnie wybranego przedmiotu. Może dać ci on podpowiedź co do zastosowania przedmiotu. + + + + Dolna prawa część interfejsu wytwarzania przedstawia twój ekwipunek. Wyświetla także opis wybranego przedmiotu oraz składniki niezbędne do jego stworzenia. + + + + Niektóre przedmioty nie mogą być stworzone w warsztacie. Niezbędny jest piec. Stwórz piec.{*FurnaceIcon*} + + + Żwir + + + Ruda złota + + + Ruda żelaza + + + Lawa + + + Piasek + + + Piaskowiec + + + Ruda węgla + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z pieca. + + + + Oto interfejs pieca. Piec umożliwia ci przetwarzanie przedmiotów poprzez ich wypalanie. Przykładowo, możesz przetopić rudę żelaza na sztabki żelaza. + + + + Umieść stworzony piec w świecie. Dobrze jest umieścić go w siedzibie.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. + + + Drewno + + + Drewno dębowe + + + + 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. + + + {*B*} + Wciśnij{*CONTROLLER_VK_X*}, aby ponownie wyświetlić ekwipunek. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku. + + + + 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. + + + + {*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ę. + + + + Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. + + + + 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. + + + + 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ę. + + + + Udało ci się ukończyć pierwszą część samouczka. + + + Skorzystaj z pieca, aby stworzyć trochę szkła. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. + + + Skorzystaj z pieca, aby stworzyć trochę węgla drzewnego. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. + + + Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić piec w świecie, a następnie z niego skorzystaj. + + + 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*} + + + Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić drzwi. Użyj{*CONTROLLER_ACTION_USE*}, aby otwierać i zamykać drzwi. + + + 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*} + + + + Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + + Oto interfejs wytwarzania. Umożliwia on łączenie zebranych przedmiotów w nowe. + + + + Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku w trybie tworzenia. + + + + Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + {*B*} + Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić składniki niezbędne do stworzenia wybranego przedmiotu. + + + {*B*} + Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić opis przedmiotu. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak wytwarzać przedmioty. + + + + 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. + + + {*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. + + + + Oto ekwipunek w trybie tworzenia. Wyświetla wszystkie dostępne przedmioty oraz te, które możesz trzymać w ręku. + + + + Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran 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*}. + + + + 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. + + + + 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. + + + Woda + + + Szklana butelka + + + Butelka z wodą + + + Oko pająka + + + Samorodek złota + + + Narośl z Otchłani + + + {*splash*}{*prefix*}mikstura {*postfix*} + + + Sfermentow. oko pająka + + + Kociołek + + + Oko Kresu + + + Błyszczący arbuz + + + Płomienny proszek + + + Magmowy krem + + + Stacja alchemiczna + + + Łza ducha + + + Nasiona dyni + + + Nasiona arbuza + + + Surowy kurczak + + + Płyta muzyczna – „11” + + + Płyta muzyczna – „where are we now” + + + Nożyce + + + Smażony kurczak + + + Perła Kresu + + + Kawałek arbuza + + + Płomienna różdżka + + + Surowa wołowina + + + Smażony stek + + + Zgniłe mięso. + + + Zaklęta butelka + + + Deski dębowe + + + Deski świerkowe + + + Deski brzozowe + + + Blok z trawą + + + Ziemia + + + Kamień brukowy + + + Deski z drew. z dżungli + + + Sadzonka brzozy + + + Sadzonka drzewa z dżungli + + + Skała macierzysta + + + Sadzonka + + + Sadzonka dębu + + + Sadzonka świerku + + + Kamień + + + Ramka + + + Przywołaj: {*CREATURE*} + + + Cegła z Otchłani + + + Ognisty ładunek + + + Ognisty ład. (węg. drz.) + + + Ognisty ładunek (węg.) + + + Czaszka + + + Głowa + + + Głowa gracza %s + + + Głowa czyhacza + + + Czaszka kościotrupa + + + Czaszka uschniętego kościotrupa + + + Głowa zombie + + + 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ń + + skoku - - oddychania pod wodą + + Uschnięty - - niewidzialności + + Wzmocnienie zdrowia - - oślepienia - - - widzenia w ciemności - - - głodu - - - zatrucia + + Absorpcja @@ -5135,9 +6065,78 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? III + + niewidzialności + IV + + oddychania pod wodą + + + odporności na ogień + + + widzenia w ciemności + + + zatrucia + + + głodu + + + absorpcji + + + nasycenia + + + wzmocnienia zdrowia + + + oślepienia + + + rozkładu + + + Nieudolna + + + Rozcieńczona + + + Rozmyta + + + Klarowna + + + Mleczna + + + Dziwna + + + Maślana + + + Gładka + + + Niezręczna + + + Niegazowana + + + Duża + + + Mdła + Rozpryskowa @@ -5147,50 +6146,14 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Nudna - - Mdła + + Fantazyjna - - Klarowna + + Nasycona - - Mleczna - - - Rozmyta - - - Nieudolna - - - Rozcieńczona - - - Dziwna - - - Niegazowana - - - Duża - - - Niezręczna - - - Maślana - - - Gładka - - - Łagodna - - - Wytworna - - - Gęsta + + Urocza Elegancka @@ -5198,149 +6161,152 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Wymyślna - - Urocza - - - Fantazyjna - - - Czysta - - - Nasycona - Gazowana - - Mocna - - - Obrzydliwa - - - Bezzapachowa - Cuchnąca Ostra + + Bezzapachowa + + + Mocna + + + Obrzydliwa + + + Łagodna + + + Czysta + + + Gęsta + + + Wytworna + + + Stopniowo przywraca zdrowie graczy, zwierząt i potworów. + + + Natychmiast obniża zdrowie graczy, zwierząt i potworów. + + + 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. + 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. + + + Używana jako podstawa do wszystkich mikstur. Wykorzystywana w stacji alchemicznej do warzenia mikstur. + Wstrętna Śmierdząca - - Używana jako podstawa do wszystkich mikstur. Wykorzystywana w stacji alchemicznej do warzenia mikstur. - - - 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. - - - 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 obrażenia zadawane atakami przez graczy i potwory. - - - Zmniejsza obrażenia zadawane atakami przez graczy i potwory. - - - Natychmiast przywraca zdrowie graczy, zwierząt i potworów. - - - Natychmiast obniża zdrowie graczy, zwierząt i potworów. - - - Stopniowo przywraca zdrowie graczy, zwierząt i potworów. - - - Sprawia, że gracze, zwierzęta i potwory są niewrażliwi na ogień, lawę i dystansowe ataki płomieni. - - - Stopniowo obniża zdrowie graczy, zwierząt i potworów. + + Porażenie Ostrość - - Porażenie + + Stopniowo obniża zdrowie graczy, zwierząt i potworów. - - Zguba stawonogów + + Obrażenia od ataku Odrzucenie - - Aspekt ognia + + Zguba stawonogów - - Ochrona + + Szybkość - - Ochrona przed ogniem + + Wsparcie zombie - - Powolne opadanie + + Siła skoku konia - - Ochrona przed wybuchami + + Po użyciu: - - Ochrona przed pociskami + + Odporność na odrzucenie - - Oddychanie + + Zasięg podążania istot - - Podwodna wydajność - - - Wydajność + + Maksymalne zdrowie Delikatny dotyk - - Niezniszczalność + + Wydajność - - Grabież + + Podwodna wydajność Szczęście - - Moc + + Grabież - - Płomień + + Niezniszczalność - - Uderzenie + + Ochrona przed ogniem - - Nieskończoność + + Ochrona - - I + + Aspekt ognia - - II + + Powolne opadanie - - III + + Oddychanie + + + Ochrona przed pociskami + + + Ochrona przed wybuchami IV @@ -5351,23 +6317,29 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? VI + + Uderzenie + VII - - VIII + + III - - IX + + Płomień - - X + + Moc - - Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć szmaragdy. + + Nieskończoność - - 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. + + II + + + I Aktywuje się, gdy istota przejdzie przez podłączoną linkę. @@ -5378,44 +6350,59 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Sprawny sposób przechowywania szmaragdów. - - Murek z kamienia brukowego. + + 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. - - Służy do naprawy broni, narzędzi i pancerza. + + IX - - Po przetopieniu w piecu daje kwarc z Otchłani. + + VIII - - Służy do dekoracji. + + Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć szmaragdy. - - Służy do handlu z osadnikami. - - - Służy do dekoracji. Można w niej zasadzić kwiaty, sadzonki, kaktusy i grzyby. + + X Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotej marchewki. Można posadzić na polu uprawnym. + + Służy do dekoracji. Można w niej zasadzić kwiaty, sadzonki, kaktusy i grzyby. + + + Murek z kamienia brukowego. + Odnawia 0,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można posadzić na polu uprawnym. - - Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu ziemniaka w piecu. + + Po przetopieniu w piecu daje kwarc z Otchłani. + + + Służy do naprawy broni, narzędzi i pancerza. + + + Służy do handlu z osadnikami. + + + Służy do dekoracji. + + + Odnawia 4{*ICON_SHANK_01*}. - 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. + Odnawia 1{*ICON_SHANK_01*}. Może ci zaszkodzić. Służy do kierowania świnią podczas jazdy. - - Odnawia 4{*ICON_SHANK_01*}. + + Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu ziemniaka w piecu. + + + Odnawia 3{*ICON_SHANK_01*}. Powstaje z połączenia marchewki i samorodków złota. W połączeniu z kowadłem umożliwia zaklinanie broni, narzędzi lub pancerza. @@ -5423,6 +6410,15 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? 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 + + Ciasto dyniowe - - Ziemniak - - - 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,72 +6557,76 @@ 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. + + + Zabarw obrożę + + + + Aby rozpocząć pracę nad przedmiotem, umieść go w pierwszym miejscu. @@ -5643,37 +6634,29 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? 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. - + - Aby rozpocząć pracę nad przedmiotem, umieść go w pierwszym miejscu. + Można też umieścić identyczny przedmiot w drugim miejscu, aby połączyć przedmioty. Gdy odpowiedni materiał zostanie umieszczony w drugim miejscu (np. sztabki żelaza, aby naprawić uszkodzony żelazny miecz), wynik naprawy pojawi się w ostatnim miejscu. - + - Można też umieścić identyczny przedmiot w drugim miejscu, aby połączyć przedmioty. + 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. Aby zakląć przedmiot za pomocą kowadła, umieść zaklętą księgę w drugim 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. 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,29 +6698,37 @@ 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. + + + + Wciśnij{*CONTROLLER_VK_A*}, aby wymienić wymagane przedmioty na oferowany przez osadnika. + + + + Gracze mogą wymieniać się z osadnikami przedmiotami z ekwipunku. @@ -5745,17 +6736,13 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? 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. - + - Gracze mogą wymieniać się z osadnikami przedmiotami z ekwipunku. + Dokonanie różnych wymian powiększy lub zaktualizuje listę oferowanych przez osadnika przedmiotów. Przedmioty oferowane przez osadnika zależą od jego profesji. - - - - Dokonanie różnych wymian powiększy lub zaktualizuje listę oferowanych przez osadnika przedmiotów. @@ -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,37 +1,123 @@  - + + Czy chcesz wpisać się do sieci "PSN"? + + + 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. + + + SELECT + + + 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ą. + + + System PlayStation®Vita + + + 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. + + + Sieć Ad Hoc + + + Zmiana trybu sieci + + + Wybór trybu sieci + + + Identyfikatory internetowe w tr. podziel. ekranu + + + Trofea + + + 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. + + + 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. + + + Identyfikatory internetowe: + + + 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. + + + Patch 1.04 (aktualizacja 14) + + + Identyfikatory internetowe w grze + + + Zobacz, co zrobiłem w Minecraft: PlayStation®Vita Edition! + + + Podczas pobierania wystąpił błąd. Spróbuj ponownie później. + + + Nie można dołączyć do gry ze względu na ustawienia NAT. Sprawdź swoje ustawienia sieciowe. + + + Podczas wgrywania wystąpił błąd. Spróbuj ponownie później. + + + Pobieranie zakończone! + + + +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! + + + + Zapis nieukończony + + + Na dysku nie ma miejsca, by zapisać Minecraft: Edycję PlayStation®Vita. Aby zwolnić miejsce, usuń inne zapisy Minecraft: Edycji PlayStation®Vita. + + + Wgrywanie anulowane + + + Anulowałeś wgrywanie tego zapisanego stanu gry do miejsca przechowywania zapisanych stanów gry. + + + Wgraj zapis stanu gry z PS3™/PS4™ + + + Wgrywanie danych: %d%% + + + "PSN" + + + Pob. zapisany stan gry z PS3™ + + + Pobieranie danych: %d%% + + + Zapisywanie + + + Wgrywanie zakończone! + + + Czy na pewno chcesz wgrać ten zapis stanu gry i nadpisać stan obecnie znajdujący się w chmurze? + + + Konwertowanie danych + + NOT USED - - Możesz wykorzystać ekran dotykowy systemu PlayStation®Vita, aby poruszać się po menu! - - - Minecraftforum ma dział poświęcony edycji PlayStation®Vita. - - - Najnowsze informacje o grze można zdobyć na @4JStudios i @Kappische, na Twitterze! - - - Nie patrz w oczy kresostworów! - - - Wydaje nam się, że 4J Studios usunęło Herobrine'a z edycji PlayStation®Vita, ale nie mamy pewności. - - - Minecraft: Edycja PlayStation®Vita pobiła wiele rekordów! - - - {*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. - - - {*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. + + NOT USED {*T3*}INSTRUKCJA : TRYB TWORZENIA{*ETW*}{*B*}{*B*} @@ -46,32 +132,80 @@ Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, 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. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Zaproś znajomych - 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ć? Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. Na pewno chcesz kontynuować? - - Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. + + "NOT USED" - - 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ć? + + Zaproś znajomych + + + Minecraftforum ma dział poświęcony edycji PlayStation®Vita. + + + Najnowsze informacje o grze można zdobyć na @4JStudios i @Kappische, na Twitterze! + + + NOT USED + + + Możesz wykorzystać ekran dotykowy systemu PlayStation®Vita, aby poruszać się po menu! + + + Nie patrz w oczy kresostworów! + + + {*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. + + + {*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. + + + Wydaje nam się, że 4J Studios usunęło Herobrine'a z edycji PlayStation®Vita, ale nie mamy pewności. + + + Minecraft: Edycja PlayStation®Vita pobiła wiele rekordów! + + + Osiągnięto limit czasu próbnej wersji Minecraft: PlayStation®Vita Edition! Czy chcesz odblokować pełną wersję gry, aby kontynuować zabawę? + + + Nastąpił błąd podczas wczytywania Minecraft: PlayStation®Vita Edition. Dalsze działanie jest niemożliwe. + + + Warzenie + + + Powróciłeś na ekran tytułowy, ponieważ zostałeś wypisany z sieci "PSN". + + + 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. + + + 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ą. + + + 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ą. + + + 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ą. + + + 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. Utracono połączenie z siecią "PSN". Powrót do głównego menu. @@ -79,11 +213,23 @@ Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, Utracono połączenie z siecią "PSN". + + Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. + + + 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ć? + 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? + + Goście nie mogą odblokować pełnej wersji gry. Wpisz się na konto Sony Entertainment Network. + + + Identyfikator internetowy + 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". @@ -93,151 +239,7 @@ Czy chcesz odblokować pełną wersję gry? 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? - - Goście nie mogą odblokować pełnej wersji gry. Wpisz się na konto Sony Entertainment Network. - - - Identyfikator internetowy - - - Warzenie - - - Powróciłeś na ekran tytułowy, ponieważ zostałeś wypisany z sieci "PSN". - - - - Osiągnięto limit czasu próbnej wersji Minecraft: PlayStation®Vita Edition! Czy chcesz odblokować pełną wersję gry, aby kontynuować zabawę? - - - Nastąpił błąd podczas wczytywania Minecraft: PlayStation®Vita Edition. Dalsze działanie jest niemożliwe. - - - 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. - - - 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ą. - - - 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. - - - 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ą. - - - 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ą. - - - 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. - - - 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. - - - Identyfikatory internetowe w tr. podziel. ekranu - - - Trofea - - - Identyfikatory internetowe: - - - Identyfikatory internetowe w grze - - - Zobacz, co zrobiłem w Minecraft: PlayStation®Vita Edition! - - - 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. - - - Patch 1.04 (aktualizacja 14) - - - SELECT - - - 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ą. - - - Czy chcesz wpisać się do sieci "PSN"? - - - 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. - - - System PlayStation®Vita - - - Zmiana trybu sieci - - - Wybór trybu sieci - - - 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. - - - Sieć Ad Hoc - - - "PSN" - - - Pob. zapisany stan gry z systemu PlayStation®3 - - - Wgraj zapis stanu gry z system PlayStation®3/PlayStation®4 - - - Wgrywanie anulowane - - - Anulowałeś wgrywanie tego zapisanego stanu gry do miejsca przechowywania zapisanych stanów gry. - - - Wgrywanie danych: %d%% - - - Pobieranie danych: %d%% - - - Czy na pewno chcesz wgrać ten zapis stanu gry i nadpisać stan obecnie znajdujący się w chmurze? - - - Konwertowanie danych - - - Zapisywanie - - - Wgrywanie zakończone! - - - Podczas wgrywania wystąpił błąd. Prosimy spróbować ponownie później. - - - Pobieranie zakończone! - - - Podczas pobierania wystąpił błąd. Prosimy spróbować ponownie później. - - - Nie można dołączyć do gry ze względu na ustawienia NAT. Prosimy sprawdzić swoje ustawienia sieciowe. - - - - 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. - - - - Zapis nieukończony - - - Na dysku nie ma miejsca, by zapisać Minecraft: Edycję PlayStation®Vita. Aby zwolnić miejsce, usuń inne zapisy Minecraft: Edycji PlayStation®Vita. + + 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. - - - Você retornou à tela de título porque sua sessão da "PSN" foi finalizada - - - A partida terminou porque sua sessão da "PSN" foi finalizada - - - - Você não está conectado. - - - - Este jogo tem recursos que exigem conexão com a "PSN", 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. - - - Este recurso exige que a sessão da "PSN" seja iniciada. - - - - Conectar-se à "PSN" - - - Conexão à Rede Ad Hoc - - - Problema com troféu - - - Houve um problema ao acessar sua conta da Sony Entertainment Network. Não foi possível conceder seu troféu no momento. + + Falha ao salvar configurações na conta da Sony Entertainment Network. Problema na conta da Sony Entertainment Network - - Falha ao salvar configurações na conta da Sony Entertainment Network. + + Houve um problema ao acessar sua conta da Sony Entertainment Network. Não foi possível conceder seu troféu no momento. 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? + + 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. + + + Problema com troféu + + + A partida terminou porque sua sessão da "PSN" foi finalizada + + + + Você retornou à tela de título porque sua sessão da "PSN" foi finalizada + + + O armazenamento do sistema selecionado não tem espaço livre suficiente para salvar um jogo. + + + Você não está conectado. + + + Conectar-se à "PSN" + + + Este recurso exige que a sessão da "PSN" seja iniciada. + + + + 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,3110 +1,905 @@  - - 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! - - - Nem todas as pessoas na Suécia têm cabelos loiros. Alguns, como Jens de Mojang, são ruivos! - - - No futuro haverá uma atualização deste jogo! - - - Quem é Notch? - - - Mojang tem mais prêmios que ajudantes! - - - Algumas celebridades jogam Minecraft! - - - deadmau5 curte o Minecraft! - - - Não olhe diretamente para os bugs. - - - Os Creepers nasceram de um bug de código. - - - Isso é uma galinha ou um pato? - - - Você estava na Minecon? - - - Ninguém da Mojang já viu o rosto do Junkboy. - - - Você sabia que existe um Wiki do Minecraft? - - - O novo escritório da Mojang é maneiro! - - - A Minecon 2013 foi em Orlando, na Flórida, EUA! - - - .party() estava excelente! - - - Considere os rumores sempre falsos, em vez de considerá-los verdadeiros! - - - {*T3*}COMO JOGAR: NOÇÕES BÁSICAS{*ETW*}{*B*}{*B*} -Minecraft é um jogo que consiste em colocar blocos para construir qualquer coisa que imaginar. À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça.{*B*}{*B*} -Use{*CONTROLLER_ACTION_LOOK*} para olhar à sua volta.{*B*}{*B*} -Use{*CONTROLLER_ACTION_MOVE*} para se mover.{*B*}{*B*} -Pressione {*CONTROLLER_ACTION_JUMP*}para pular.{*B*}{*B*} -Pressione {*CONTROLLER_ACTION_MOVE*}duas vezes para frente rapidamente para correr. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*}pressionado para a frente, o personagem continuará correndo, a não ser que o tempo de corrida acabe ou que a Barra de Alimentos tenha menos de {*ICON_SHANK_03*}.{*B*}{*B*} -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. - - - {*T3*}COMO JOGAR: BAÚ{*ETW*}{*B*}{*B*} -Depois de criar um baú, poderá colocá-lo no mundo e usá-lo com{*CONTROLLER_ACTION_USE*} para guardar itens do seu inventário.{*B*}{*B*} -Use o ponteiro para mover itens entre o inventário e o baú.{*B*}{*B*} -Os itens no baú ficarão guardados lá para você até devolvê-los ao inventário mais tarde. - - - - {*T3*}COMO JOGAR: BAÚ GRANDE{*ETW*}{*B*}{*B*} -Dois baús colocados lado a lado serão combinados para formar um Baú Grande. Ele pode guardar ainda mais itens.{*B*}{*B*} -É usado da mesma maneira que um baú normal. - - - - {*T3*}COMO JOGAR: FABRICAÇÃO{*ETW*}{*B*}{*B*} -Na interface de fabricação, você pode combinar itens do seu inventário para criar novos tipos de itens. Use{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação.{*B*}{*B*} -Role pelas guias na parte superior usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de item que deseja criar e, em seguida, use {*CONTROLLER_MENU_NAVIGATE*}para selecionar o item a ser criado.{*B*}{*B*} -A área de fabricação mostra os itens necessários para criar o novo item. Pressione{*CONTROLLER_VK_A*} para 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: 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: 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: 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: 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*} - -{*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. - - - - Próxima Página - - - Página Anterior - - - Noções Básicas - - - HUD - - - Inventário - - - Baús - - - Fabricação - - - Fornalha - - - Distribuidor - - - Criação de Animais - - - Reprodução de Animais - - + Poções - - Feitiços - - - Portal do Submundo - - - Multijogador - - - Compartilhando Capturas de Tela - - - Banindo Níveis - - - Modo Criativo - - - Opções de Host e Jogador - - - Comércio - - - Bigorna - - - Final - - - {*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 - - - Novidades - - - {*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*} - - - - {*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*} - - - - Causa mais danos que à mão. - - - Usada para cavar terra, grama, areia, cascalho e neve mais rápido que à mão. As pás são necessárias para cavar bolas de neve. - - - Necessária para extrair blocos relacionados a pedra e minério. - - - Usado para cortar blocos relacionados à madeira mais rápido que à mão. - - - Usada para trabalhar blocos de terra e grama para preparar para plantação. - - - Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. - - - Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. - - - NÃO USADO - - - NÃO USADO - - - NÃO USADO - - - NÃO USADO - - - Dá ao usuário 1 de Armadura quando usado. - - - Dá ao usuário 3 de Armadura quando usado. - - - Dá ao usuário 2 de Armadura quando usado. - - - Dá ao usuário 1 de Armadura quando usado. + + Ferramentas, Armas e Armaduras - - Dá ao usuário 2 de Armadura quando usado. + + Materiais - - Dá ao usuário 5 de Armadura quando usado. + + Blocos de Construção - - Dá ao usuário 4 de Armadura quando usado. + + Redstone e Transporte - - Dá ao usuário 1 de Armadura quando usado. + + Diversos - - Dá ao usuário 2 de Armadura quando usado. + + Entradas: - - Dá ao usuário 6 de Armadura quando usado. + + Sair sem salvar - - Dá ao usuário 5 de Armadura quando usado. + + Tem certeza de que deseja sair para o menu principal? O progresso não salvo será perdido. - - Dá ao usuário 2 de Armadura quando usado. + + Tem certeza de que deseja sair para o menu principal? Seu progresso será perdido! - - Dá ao usuário 2 de Armadura quando usado. + + Este jogo salvo está corrompido ou danificado. Gostaria de excluí-lo? - - Dá ao usuário 5 de Armadura quando usado. + + Tem certeza de que deseja sair para o menu principal e desconectar todos os jogadores do jogo? O progresso não salvo será perdido. - - Dá ao usuário 3 de Armadura quando usado. + + Sair e salvar - - Dá ao usuário 1 de Armadura quando usado. + + Criar novo mundo - - Dá ao usuário 3 de Armadura quando usado. + + Digite um nome para o mundo - - Dá ao usuário 8 de Armadura quando usado. + + Insira a semente para a criação do seu mundo - - Dá ao usuário 6 de Armadura quando usado. + + Carregar mundo salvo - - Dá ao usuário 3 de Armadura quando usado. + + Jogar tutorial - - Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. + + Tutorial - - 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. + + Nomear mundo - - 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. + + Jogo danificado - - Usada para obter escadas compactas. + + OK - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + Cancelar - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + Loja Minecraft - - Usada para iluminar. As tochas também derretem neve e gelo. + + Girar - - Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. + + Ocultar - - Usado como material de construção. Não sofre ação da gravidade como a areia normal. + + Limpar Todos os Espaços - - Usado como material de construção. + + Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? O progresso não salvo será perdido. - - Usada para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. + + Tem certeza de que deseja substituir o salvamento anterior deste mundo pela versão atual dele? - - 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ã. + + Tem certeza de que deseja sair sem salvar? Você perderá todo o progresso neste mundo! - - Permite fabricar maior variedade de itens que a fabricação normal. + + Iniciar o jogo - - Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. + + Sair do Jogo - - Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. + + Salvar Jogo - - 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. + + Sair sem salvar - - Usada para escalar verticalmente. + + Pressione START p/ entrar - - 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. + + Oba! Você ganhou uma imagem do jogador com o Steve do Minecraft! - - Mostra o texto digitado por você ou por outros jogadores. + + Oba! Você ganhou uma imagem do jogador com um Creeper! - - Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + + Desbloquear jogo completo - - 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. + + 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. - - Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. + + Novo mundo - - Usado para guardar e transportar água, lava e leite. + + Brinde desbloqueado! - - Usado para armazenar e transportar água. + + 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? - - Usado para armazenar e transportar lava. + + Amigos - - Usado para armazenar e transportar leite. + + Minha pontuação - - Usado para criar fogo, detonar TNT e abrir um portal depois de construído. + + Geral - - Usada para pegar peixes. + + Aguarde - - Mostra as posições do sol e da lua. + + Sem resultados - - Aponta para seu ponto inicial. + + Filtro: - - Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. + + Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. - - Permite ataques à distância usando flechas. + + Conexão perdida - - Usada como munição para arcos. + + A conexão com o servidor foi perdida. Saindo para o menu principal. - - Restaura 2,5{*ICON_SHANK_01*}. + + Desconectado pelo servidor - - Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. + + Saindo do jogo - - Restaura 1{*ICON_SHANK_01*}. + + Erro. Saindo para o menu principal. - - Restaura 1{*ICON_SHANK_01*}. + + Falha na conexão - - Restaura 3{*ICON_SHANK_01*}. + + Você foi expulso do jogo - - Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Comê-la pode envenenar você. + + O host saiu do jogo. - - Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar frango cru na fornalha. + + Você não pode entrar neste jogo, pois não é amigo de nenhuma pessoa no jogo. - - Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + Você não pode entrar neste jogo, pois já foi expulso antes pelo host. - - Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar carne crua na fornalha. + + Você foi expulso do jogo por voar - - Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + A tentativa de conexão demorou muito - - Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar uma costeleta de porco crua na fornalha. + + O servidor está cheio - - Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser dado para o Ocelote comer, para torná-lo amigável. + + 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! - - Restaura 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru na fornalha. + + Temas - - Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. + + Pacotes de capas - - Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criada com uma Maçã e Pepitas de Ouro. + + Permite os amigos dos amigos - - Restaura 2{*ICON_SHANK_01*}. Comê-la pode envenenar você. + + Expulsar - - Usado na receita de bolo, como ingrediente para fazer poções. + + Tem certeza de que deseja expulsar este jogador do jogo? Eles não poderão entrar de novo até que você reinicie o mundo. - - Usada para enviar uma carga elétrica ao ser ligada ou desligada. Fica na posição ligada ou desligada até ser apertada novamente. + + Pacotes de imagens do jogador - - 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. + + Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. - - Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. + + Conteúdo oferecido para download corrompido - - Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. + + 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. - - Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. + + 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. - - Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. + + Não é possível entrar no jogo - - Usado para guiar carrinhos de minas. + + Selecionado - - Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. + + Capa selecionada: - - Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. + + Obter versão completa - - Usado para transportar você, um animal ou um monstro sobre trilhos. + + Desbloquear pacote de textura - - Usado para transportar mercadorias sobre trilhos. + + Para usar este pacote de textura no seu mundo, você precisa desbloqueá-lo. +Você deseja desbloquear agora? - - Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. + + Pacote de texturas para avaliação - - Usado para viajar pela água mais rapidamente do que nadando. + + Semente - - Coletada das ovelhas, pode ser tingida com corantes. + + Desbloquear pacote de capas - - 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. + + Para usar a capa selecionada, você precisa desbloquear este pacote de capas. +Deseja desbloquear o pacote de capas agora? - - Usado como corante para criar lã preta. + + 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? - - Usado como corante para criar lã verde. + + Fazer download da versão completa - - Usado como corante para criar lã marrom, como ingrediente para biscoitos ou para criar cápsulas de cacau. + + 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? - - Usado como corante para criar lã prateada. + + Obter versão de avaliação - - Usado como corante para criar lã amarela. + + Pacote de textura não disponível - - Usada como corante para criar lã vermelha. + + Desbloquear a versão completa - - Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. + + Fazer download da versão de avaliação - - Usado como corante para criar lã rosa. + + Seu modo de jogo foi alterado - - Usado como corante para criar lã laranja. + + Quando habilitado, apenas jogadores convidados poderão entrar. - - Usado como corante para criar lã verde-lima. + + Quando habilitado, os amigos das pessoas em sua Lista de Amigos poderão entrar no jogo. - - Usado como corante para criar lã cinza. + + Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência. - - 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.) + + Normal - - Usado como corante para criar lã azul-clara. + + Superplano - - Usado como corante para criar lã ciano. + + Quando habilitado, o jogo será um jogo online. - - Usado como corante para criar lã roxa. + + Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. - - Usado como corante para criar lã magenta. + + Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. - - Usado como corante para criar lã azul. + + Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo. - - Toca discos de música. + + Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. - - Usado para criar ferramentas, armas ou armaduras muito fortes. + + Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. - - Usada para iluminar mais que tochas. Derrete neve/gelo e pode ser usada embaixo d'água. + + Quando habilitado, a TNT explodirá quando ativada. - - Usado para criar livros e mapas. + + Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes. - - Pode ser usado para criar Estantes ou enfeitiçado para fazer Livros Encantados. + + Desativado - - Permite a criação de feitiços mais poderosos quando colocada perto da Mesa de Feitiços. + + Modo de jogo: Criativo - - Usada como decoração. + + Sobrevivência - - Pode ser extraído com uma picareta de ferro ou de material melhor e depois fundido na fornalha para produzir barras de ouro. + + Criativo - - Pode ser extraído com uma picareta de pedra ou de material melhor e depois fundido na fornalha para produzir barras de ferro. + + Renomeie seu mundo - - Pode ser extraído com uma picareta para coletar carvão. + + Digite o novo nome para seu mundo - - Pode ser extraído com uma picareta de pedra ou de material melhor para coletar lápis-azul. + + Modo de jogo: Sobrevivência - - Pode ser extraído com uma picareta de ferro ou de material melhor para coletar diamantes. + + Criado em Sobrevivência - - Pode ser extraído com uma picareta de ferro ou de material melhor para coletar pó de redstone. + + Renomear salvamento - - Pode ser extraída com uma picareta para coletar pedregulhos. + + Salvando automaticamente em %d... - - Coletada com uma pá. Pode ser usada para construção. + + Ativado - - Pode ser plantada e quando crescer será uma árvore. + + Criado em Criativo - - Não pode ser quebrada. + + Renderizar Nuvens - - Ateia fogo em qualquer coisa que a toca. Pode ser coletada em um balde. + + O que deseja fazer com este jogo salvo? - - 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. + + Tamanho do HUD (tela dividida) - - Coletado com uma pá. Pode produzir sílex quando cavado. Sofrerá ação da gravidade se não houver outra peça sob ele. + + Ingrediente - - Cortada com um machado. Pode ser usada para fabricar tábuas ou como combustível. + + Combustível - - Criado na fornalha ao fundir areia. Pode ser usado para construção, mas quebrará se tentar extraí-lo. - - - Extraído de pedra usando uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. - - - Argila cozida na fornalha. - - - Pode ser cozida na fornalha para fazer tijolos. - - - Quando quebrada, derruba bolas de argila que podem ser cozidas para fazer tijolos na fornalha. - - - Um modo compacto de armazenar bolas de neve. - - - Pode ser cavada com uma pá para criar bolas de neve. - - - Pode produzir sementes de trigo quando quebrada. - - - Pode ser usada para fabricar corante. - - - Pode ser combinado com uma vasilha para fabricar sopa. - - - Só pode ser extraída com uma picareta de diamante. É produzida pelo encontro de água e lava parada e é usada para construir um portal. - - - Gera monstros no mundo. - - - É colocado no chão para transportar uma carga elétrica. Quando usado com uma poção, ele aumentará a duração de seu efeito. - - - Quando alcançarem a fase de pleno crescimento, as colheitas poderão ser coletadas para obter trigo. - - - Solo que foi preparado para o plantio de sementes. - - - Pode ser cozido em uma fornalha para fabricar corante verde. - - - Pode ser usada para fabricar açúcar. - - - Pode ser usada como capacete ou combinada com uma tocha para fabricar uma lanterna de abóbora. Também é o ingrediente principal da Torta de Abóbora. - - - Queima para sempre se for acesa. - - - Torna mais lento o movimento de quem anda sobre ela. - - - 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. - - - 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! - - - Coletado nas colheitas e pode ser usado para fabricar alimentos. - - - Coletado ao cavar cascalho e pode ser usado para fabricar sílex e aço. - - - Quando usada em um porco, permite que você monte nele. O porco pode ser controlado usando uma Cenoura no Palito. - - - Coletada ao cavar neve e pode ser atirada. - - - É coletado ao matar uma vaca e pode ser usado para fabricar uma armadura ou para fazer Livros. - - - Coletado ao matar um Slime e usado como ingrediente para fazer poções ou para fabricar Pistões Aderentes. - - - As galinhas soltam aleatoriamente e pode ser usado para fabricar alimentos. - - - É coletado ao extrair Glowstone e pode ser usado para fabricar blocos de Glowstone novamente ou usado para fazer poções que aumentam a potência desse efeito. - - - Coletado ao matar um esqueleto. Pode ser usado para fabricar farelo de osso. Você pode alimentar um lobo com isto para domá-lo. - - - Coletado ao fazer um esqueleto matar um creeper. Pode ser tocado em uma jukebox. - - - Apaga o fogo e ajuda as plantações a crescerem. Pode ser coletada em um balde. - - - Quando quebrada, às vezes derruba uma muda que pode ser replantada para se tornar uma árvore. - - - Encontrada em calabouços, pode ser usada para construção e decoração. - - - Usada para obter lã da ovelha e colher blocos de folhas. - - - Quando acionado (usando um botão, alavanca, placa de pressão, tocha de redstone ou redstone com algum destes), um pistão estende-se, se possível, e empurra blocos. - - - Quando acionado (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. - - - Feitos com pedra, geralmente encontrados em Fortalezas. - - - Usadas como barreiras semelhantes às cercas. - - - Semelhante a uma porta, mas usado principalmente com cercas. - - - Pode ser fabricado com Fatias de Melão. - - - Blocos transparentes que podem ser usados no lugar dos blocos de vidro. - - - Podem ser plantadas para cultivar abóboras. - - - Podem ser plantadas para cultivar melões. - - - 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. - - - Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construção. - - - Pode ser usada para construção e decoração. - - - Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. - - - Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. - - - Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. - - - É escorregadio. Transforma-se em água se estiver sobre outro bloco quando destruído. Derrete se estiver muito próximo de uma fonte de luz ou se colocado no Submundo. - - - Pode ser usado como decoração. - - - Usada para fazer poções e para localizar Fortalezas. É derrubada pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. - - - Usada para fazer poções. É derrubada pelos Ghasts, quando eles morrem. - - - É derrubada pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. Usada como ingrediente para fazer poções. - - - Usada para fazer poções. Pode ser encontrada naturalmente nas Fortalezas do Submundo. Também pode ser plantada na Areia Movediça. - - - Quando usada, pode ter vários efeitos, dependendo de onde for utilizada. - - - Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. - - - Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. - - - Usado para fazer poções, especialmente para criar poções com efeito negativo. - - - Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. - - - Usado para fazer poções. - - - Usada para fazer Poções e Poções de Lançamento. - - - Pode ser cheio com água da chuva ou usando um balde de água e pode ser usado para encher Garrafas de Vidro com água. - - - Quando atirado, mostrará a direção para um Portal Final. Quando doze deles forem colocados nas estruturas do Portal Final, o Portal Final será ativado. - - - Usado para fazer poções. - - - Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. - - - Flutua na água e permite andar em cima. - - - Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. - - - Usada em Fortalezas do Submundo. - - - Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. - - - Desta forma os jogadores podem enfeitiçar Espadas, Picaretas, Machados, Pás, Arcos e Armadura, usando os Pontos de Experiência do jogador. - - - Isto pode ser ativado usando doze Olhos de Ender, e o jogador poderá viajar até a dimensão Final. - - - Usado para formar um Portal Final. - - - Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. - - - Este bloco é criado ao derrotar o Dragão no Final. - - - Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. - - - Útil para pôr fogo nas coisas, ou para começar incêndios quando disparada de um Distribuidor. - - - É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. - - - Quando lançado pode gerar uma criatura do tipo indicado. - - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. - - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. - - - Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. - - - Quando carregada, ela emite luz. - - - Pode ser cultivado para coletar grãos de cacau. - - - As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. - - - Lula - - - Solta sacos de tinta quando morta. - - - Vaca - - - Solta couro quando morta. Pode ser ordenhada com um balde. - - - Ovelha - - - Solta lã quando tosquiada (se já não tiver sido tosquiada). Pode ser tingida para produzir lã de cores diferentes. - - - Galinha - - - Solta penas quando morta e põe ovos aleatoriamente. - - - Porco - - - Solta costeletas quando morto. Pode ser montado usando uma sela. - - - Lobo - - - Dócil até ser atacado, quando atacará de volta. Pode ser domado usando ossos, o que faz o lobo segui-lo e atacar qualquer coisa que ataque você. - - - Creeper - - - Explode se você chegar muito perto! - - - Esqueleto - - - Dispara flechas em você. Deixa cair flechas quando morto. - - - Aranha - - - Ataca quando você chega perto. Escala paredes. Solta fio quando morta. - - - Zumbi - - - Ataca quando você chega perto. - - - Homem-porco zumbi - - - Inicialmente dócil, mas ataca em grupos se você ataca um deles. - - - Ghast - - - Atira bolas de fogo em você, que explodem ao contato. - - - Slime - - - Divide-se em slimes menores quando atingido. - - - Enderman - - - Atacará se você olhar para ele. Também pode mover blocos. - - - Traça - - - Atrai as Traças próximas quando atacada. Esconde-se em blocos de pedra. - - - Aranha de Caverna - - - Tem uma mordida venenosa. - - - Vacogumelo - - - Faz sopa de cogumelo quando usada com uma vasilha. Derruba cogumelos e torna-se uma vaca normal depois de tosquiada. - - - Golem de Neve - - - O Golem de Neve pode ser criado pelos jogadores usando blocos de neve e uma abóbora. Ele atira bolas de neve nos inimigos dos seus criadores. - - - Dragão Ender - - - Este é um grande dragão negro encontrado no Final. - - - Chama - - - Estes são inimigos encontrados no Submundo, geralmente dentro das Fortalezas do Submundo. Derrubam Varas de Chamas quando são mortos. - - - Cubo de Magma - - - Eles são encontrados no Submundo. Similares aos Slimes, dividem-se em versões menores quando são mortos. - - - Aldeão - - - Ocelote - - - Estes podem ser encontrados nas florestas. Eles podem ser domesticados, alimentando-os com Peixe Cru. Mas você deve deixar o Ocelote se aproximar, pois quaisquer movimentos bruscos podem assustá-lo e fazê-lo fugir. - - - Golem de Ferro - - - Aparece em vilas para protegê-las e podem ser criados usando blocos de ferro e abóboras. - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - Lead Game Programmer Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Espada de Madeira - - - Espada de Pedra - - - Espada de Ferro - - - Espada de Diamante - - - Espada de Ouro - - - Pá de Madeira - - - Pá de Pedra - - - Pá de Ferro - - - Pá de Diamante - - - Pá de Ouro - - - Picareta de Madeira - - - Picareta de Pedra - - - Picareta de Ferro - - - Picareta de Diamante - - - Picareta de Ouro - - - Machado de Madeira - - - Machado de Pedra - - - Machado de Ferro - - - Machado de Diamante - - - Machado de Ouro - - - Enxada de Madeira - - - Enxada de Pedra - - - Enxada de Ferro - - - Enxada de Diamante - - - Enxada de Ouro - - - Porta de Madeira - - - Porta de Ferro - - - Capacete de Malha - - - Peitoral de Malha - - - Perneiras de Malha - - - Botas de Malha - - - Chapéu de Couro - - - Capacete de Ferro - - - Capacete de Diamante - - - Capacete de Ouro - - - Túnica de Couro - - - Peitoral de Ferro - - - Peitoral de Diamante - - - Peitoral de Ouro - - - Calças de Couro - - - Perneiras de Ferro - - - Perneiras de Diamante - - - Perneiras de Ouro - - - Botas de Couro - - - Botas de Ferro - - - Botas de Diamante - - - Botas de Ouro - - - Barra de Ferro - - - Barra de Ouro - - - Balde - - - Balde de Água - - - Balde de Lava - - - Sílex e Aço - - - Maçã - - - Arco - - - Flecha - - - Carvão - - - Carvão Vegetal - - - Diamante - - - Vareta - - - Vasilha - - - Sopa de Cogumelo - - - Fio - - - Pena - - - Pólvora - - - Sementes de Trigo - - - Trigo - - - Pão - - - Sílex - - - Costeleta de Porco Crua - - - Costeleta de Porco Cozida - - - Pintura - - - Maçã de Ouro - - - Placa - - - Carrinho de Minas - - - Sela - - - Redstone - - - Bola de Neve - - - Barco - - - Couro - - - Balde de Leite - - - Tijolo - - - Argila - - - Cana-de-açúcar - - - Papel - - - Livro - - - Slimeball - - - Carrinho com Baú - - - Carrinho com Fornalha - - - Ovo - - - Bússola - - - Vara de Pescar - - - Relógio - - - Pó de Glowstone - - - Peixe Cru - - - Peixe Cozido - - - Corante em Pó - - - Saco de Tinta - - - Rosa Vermelha - - - Verde Cacto - - - Grãos de Cacau - - - Lápis-azul - - - Corante Roxo - - - Corante Ciano - - - Corante Cinzento - - - Corante Cinza - - - Corante Rosa - - - Corante Verde-lima - - - Amarelo-narciso - - - Corante Azul-claro - - - Corante Magenta - - - Corante Laranja - - - Farelo de Osso - - - Osso - - - Açúcar - - - Bolo - - - Cama - - - Repetidor de Redstone - - - Biscoito - - - Mapa - - - Disco - "13" - - - Disco de Música - "cat" - - - Disco de Música - "blocks" - - - Disco de Música - "chirp" - - - Disco de Música - "far" - - - Disco de Música - "mall" - - - Disco de Música - "mellohi" - - - Disco de Música - "stal" - - - Disco de Música - "strad" - - - Disco de Música - "ward" - - - Disco - "11" - - - Disco de Música - "where are we now" - - - Tosquiadeira - - - Sementes de Abóbora - - - Sementes de Melão - - - Frango Cru - - - Frango Cozido - - - Carne Crua - - - Bife - - - Carne Podre - - - Pérola do Ender - - - Fatia de Melão - - - Vara de Chamas - - - Lágrima de Ghast - - - Pepita de Ouro - - - Verruga do Submundo - - - {*prefix*}Poção {*postfix*} {*splash*} - - - Garrafa de Vidro - - - Garrafa de Água - - - Olho de Aranha - - - Olho Aranha Ferm. - - - Pó de Chamas - - - Creme de Magma - - - Barraca de Poções - - - Caldeirão - - - Olho de Ender - - - Melão Cintilante - - - Garrafa de Feitiços - - - Carga de Fogo - - - Carga Fogo: Carv. Veg. - - - Carga Fogo: Carvão - - - Quadro de Item - - - Criar {*CREATURE*} - - - Bloco do Submundo - - - Caveira - - - Caveira do esqueleto - - - Caveira do esqueleto murcho - - - Cabeça de zumbi - - - Cabeça - - - Cabeça de %s - - - Cabeça de creeper - - - Pedra - - - Bloco de Grama - - - Terra - - - Pedregulho - - - Tábuas de Carvalho - - - Tábuas de Abeto - - - Tábuas de Bétula - - - Tábuas da Selva - - - Muda - - - Muda de Carvalho - - - Muda de Abeto - - - Muda de Bétula - - - Broto de árvore da floresta - - - Pedra Indestrutível - - - Água - - - Lava - - - Areia - - - Arenito - - - Cascalho - - - Minério de Ouro - - - Minério de Ferro - - - Minério de Carvão - - - Madeira - - - Madeira de Carvalho - - - Madeira de Abeto - - - Madeira de Bétula - - - Madeira de floresta - - - Carvalho - - - Abeto - - - Bétula - - - Folhas - - - Folhas de Carvalho - - - Folhas de Abeto - - - Folhas de Bétula - - - Folhas de floresta - - - Esponja - - - Vidro - - - - - - Lã Preta - - - Lã Vermelha - - - Lã Verde - - - Lã Marrom - - - Lã Azul - - - Lã Roxa - - - Lã Ciano - - - Lã Cinzenta - - - Lã Cinza - - - Lã Rosa - - - Lã Verde-lima - - - Lã Amarela - - - Lã Azul-clara - - - Lã Magenta - - - Lã Laranja - - - Lã Branca - - - Flor - - - Rosa - - - Cogumelo - - - Bloco de Ouro - - - Um modo compacto de armazenar Ouro. - - - Bloco de Ferro - - - Um modo compacto de armazenar Ferro. - - - Degrau de Pedra - - - Degrau de Pedra - - - Degrau de Arenito - - - Degrau de Carvalho - - - Degrau de Pedregulho - - - Degrau de Tijolo - - - Degrau Bloc.Pedra - - - Degrau de Carvalho - - - Degrau de Abeto - - - Degrau de Bétula - - - Chapa madeira florestal - - - Degrau: Bloco Submundo - - - Tijolos - - - TNT - - - Estante de Livros - - - Pedra de Musgo - - - Obsidiana - - - Tocha - - - Tocha (Carvão) - - - Tocha (Carvão Vegetal) - - - Fogo - - - Criador de Monstros - - - Escada de Carvalho - - - Baú - - - Pó de Redstone - - - Minério de Diamante - - - Bloco de Diamante - - - Um modo compacto de armazenar Diamantes. - - - Bancada - - - Colheitas - - - Campo - - - Fornalha - - - Placa - - - Porta de Madeira - - - Escada de Mão - - - Trilho - - - Trilho com Propulsão - - - Trilho Detector - - - Escadas de Pedra - - - Alavanca - - - Chapa de Pressão - - - Porta de Ferro - - - Minério de Redstone - - - Tocha de Redstone - - - Botão - - - Neve - - - Gelo - - - Cacto - - - Argila - - - Cana-de-açúcar - - - Jukebox - - - Cerca - - - Abóbora - - - Lanterna de Abóbora - - - Pedra Inflamável - - - Areia Movediça - - - Glowstone - - - Portal - - - Minério de Lápis-azul - - - Bloco Lápis-azul - - - Um modo compacto de armazenar Lápis-azul. - - + Distribuidor - - Bloco de Nota + + Baú - - Bolo + + Feitiço - - Cama + + Fornalha - - Teia + + Não há ofertas de conteúdo oferecido para download desse tipo disponíveis para este título no momento. - - Grama Alta + + Tem certeza de que deseja excluir este jogo salvo? - - Arbusto Seco + + A confirmar - - Diodo + + Censurado - - Baú Trancado + + %s entrou no jogo. - - Alçapão + + %s saiu do jogo. - - Lã (qualquer cor) + + %s foi expulso do jogo. - - Pistão - - - Pistão Aderente - - - Bloco Traça - - - Blocos de Pedra - - - Blocos de Pedra com Musgo - - - Blocos de Pedra Rachada - - - Tijolos de pedra cinzentos - - - Cogumelo - - - Cogumelo - - - Barras de Ferro - - - Painel de Vidro - - - Melão - - - Broto de Abóbora - - - Broto de Melão - - - Vinhas - - - Portão de Cerca - - - Escadas de Blocos - - - Escadas: Blocos de Pedra - - - Pedra Traça - - - Pedregulho de Traça - - - Bloco de pedra de Traça - - - Micélio - - - Vitória-Régia - - - Bloco do Submundo - - - Cerca: Blocos Submundo - - - Escadas: Blocos Submundo - - - Verruga do Submundo - - - Bancada de Feitiços - - + Barraca de Poções - - Caldeirão + + Digitar texto da placa - - Portal Final + + Digite uma linha de texto para sua placa - - Estrutura do Portal Final + + Digitar título - - Pedra Final + + Tempo limite de avaliação - - Ovo de Dragão + + Versão completa - - Arbusto + + Falha ao entrar no jogo, pois não há espaços restantes - - Samambaia + + Digite um título para sua postagem - - Escada de Arenito + + Digite uma descrição para sua postagem - - Escada de Abeto - - - Escada de Bétula - - - Escada: madeira de floresta - - - Lâmpada de Redstone - - - Cacau - - - Caveira - - - Controles Atuais - - - Estilo - - - Mover/Correr - - - Olhar - - - Pausar - - - Pular - - - Pular/Voar Acima - - + Inventário - - Rodízio de Itens + + Ingredientes - - Ação + + Digitar legenda - - Usar + + Digite uma legenda para sua postagem - - Fabricação + + Digitar descrição - - Soltar + + Tocando agora: - - Esgueirar-se + + Tem certeza de que deseja adicionar este nível à lista de níveis banidos? +Selecionar OK também fechará este jogo. - - Esgueirar-se/Voar Abaixo + + Remover da Lista de Banidos - - Alterar Modo Câmera + + Intervalo Salv. Autom. - - Jogadores/Convidar + + Nível banido - - Movimento (Ao Voar) + + 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. - - Estilo 1 + + Banir este nível? - - Estilo 2 + + Intervalo Salv. Autom.: DESL. - - Estilo 3 + + Opacidade da interface - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Preparando salvamento automático do nível - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Tamanho do HUD - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Min. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Não é possível colocar aqui! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Não é permitido colocar lava perto do ponto de criação do nível devido à possibilidade de morte imediata dos jogadores criados. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Capas favoritas - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Jogo de %s - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Jogo com host desconhecido - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Convidado saiu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Redefinir Configurações - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Tem certeza de que deseja redefinir suas configurações para os valores padrão? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Erro de carregamento - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Falha ao criar jogo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Seleção automática - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Nenhum pacote: Capas padrão - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Entrar - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Multijogador não é permitido - - <![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;]]> + + Beber - - {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. - - - {*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} - Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. - - - Minecraft é um jogo onde você coloca blocos para construir qualquer coisa que imaginar. -À noite os monstros aparecem. Então, construa um abrigo antes que isso aconteça. - - - Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. - - - Use{*CONTROLLER_ACTION_MOVE*} para se mover. - - - Para correr, pressione {*CONTROLLER_ACTION_MOVE*}para frente rapidamente duas vezes. Enquanto segurar {*CONTROLLER_ACTION_MOVE*}, o personagem continuará correndo, a não ser que o tempo de corrida ou o alimento acabem. - - - Pressione{*CONTROLLER_ACTION_JUMP*} para pular. - - - 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... - - - 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. - - - Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. - - - Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} - Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. - - - Conforme você se move, extrai ou ataca, sua barra de alimentos vai esvaziando {*ICON_SHANK_01*}. Correr e correr pulando consomem muito mais alimento que caminhar e correr normalmente. - - - Se você perder energia, mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será preenchida automaticamente. Comer preenche sua barra de alimentos. - - - Com um item de comida na mão, mantenha pressionado {*CONTROLLER_ACTION_USE*}para comer e preencher sua barra de alimentos. Você não poderá comer se sua barra de alimentos estiver cheia. - - - Sua barra de alimentos está baixa e você perdeu energia. Coma o bife do seu inventário para preencher sua barra de alimentos e começar a cura.{*ICON*}364{*/ICON*} - - - A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} - - - Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} - - - Para coletar blocos mais rapidamente, você pode construir ferramentas próprias para o trabalho. Algumas ferramentas têm cabo feito de varetas. Fabrique algumas varetas agora.{*SticksIcon*} - - - Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. - - - Use{*CONTROLLER_ACTION_USE*} para usar itens, interagir com objetos e colocar alguns itens. Os itens colocados podem ser coletados novamente se extraídos com a ferramenta correta. - - - Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. - - - Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. - - - A pá ajuda a cavar blocos macios, como terra e neve, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie uma pá de madeira.{*WoodenShovelIcon*} - - - O machado ajuda a cortar madeira e 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 picareta ajuda a cavar blocos duros, como pedra e minério, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis e poderá extrair materiais mais duros. Crie uma picareta de madeira.{*WoodenPickaxeIcon*} - - - Abrir o recipiente - - + -A noite pode cair rapidamente e é perigoso ficar lá fora sem estar preparado. Você pode fabricar armaduras e armas, mas é melhor ter um abrigo seguro. + Nesta área foi estabelecida uma fazenda. Se você a cultivar, terá uma fonte renovável de comida e outros itens. - - -Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. - - - - -Você precisará coletar os recursos para concluir o abrigo. As paredes e o teto podem ser feitos com peças de qualquer tipo, mas você precisará criar uma porta, algumas janelas e iluminação. - - - - Use a picareta para extrair alguns blocos de pedra. Blocos de pedra produzem pedregulho quando extraídos. Se coletar 8 blocos de pedregulho poderá construir uma fornalha. Talvez seja necessário cavar a terra para chegar à pedra. Então, use a pá para isso.{*StoneIcon*} - - - Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. - - - Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. - - - Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? - - - Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? - - - Um bom abrigo precisa de porta para você poder entrar e sair sem precisar extrair e repor as paredes. Fabrique uma porta de madeira agora.{*WoodenDoorIcon*} - - - Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. - - - À noite pode ficar bem escuro. Então, é bom ter alguma iluminação no interior do abrigo para poder enxergar. Fabrique uma tocha agora com varetas e carvão vegetal, usando a interface de fabricação.{*TorchIcon*} - - - - Você concluiu a primeira parte do tutorial. - - - + {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar o tutorial.{*B*} - Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + Pressione{*CONTROLLER_VK_A*} para saber mais sobre fazendas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar as fazendas. - - 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. - + + 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. - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário. - + + Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. - + + Vá até o lado oposto deste buraco para continuar. + + + Você já concluiu o tutorial do modo Criativo. + + + 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. + + + Os Cactos devem ser plantados na Areia, e crescerão com até três blocos de altura. Da mesma forma que a Cana-de-açúcar, se o bloco inferior for destruído, você também coletará os blocos que estão acima dele.{*ICON*}81{*/ICON*} + + + Os Cogumelos devem ser plantados em uma área com pouca iluminação e se espalharão para os blocos próximos pouco iluminados.{*ICON*}39{*/ICON*} + + + O Farelo de osso pode ser usado para as plantações chegarem à etapa mais desenvolvida, ou para fazer os Cogumelos se transformarem em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + + + O trigo passa por várias etapas enquanto está crescendo, e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + + + As abóboras e melões também precisam de um bloco próximo de onde as sementes foram plantadas, para que os frutos cresçam assim que os caules estiverem crescidos. + + + A cana-de-açúcar deve ser plantada em um bloco de Grama, Terra ou Areia que esteja ao lado de um bloco de água. Se você cortar um bloco de Cana-de-açúcar, também derrubará todos os blocos que estão acima dele.{*ICON*}83{*/ICON*} + + + 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. + + -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. + 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. - + -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. + Nesta área há um Portal para o Submundo! - + -Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. + {*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. - + - Para obter mais informações sobre um item, passe o ponteiro sobre ele e pressione{*CONTROLLER_VK_BACK*}. + 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*} - + - Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. + Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. + {*ICON*}356{*/ICON*} - + - 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. + 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*} - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário do modo criativo. - - - + -Use{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. -Quando estiver na lista de itens, use{*CONTROLLER_VK_A*} para pegar o item sob o ponteiro e use{*CONTROLLER_VK_Y*} para pegar a pilha toda do item. + 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 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. + 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. - + -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*}. + Agora você está no Modo Criativo. - + -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. + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre o Modo Criativo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o Modo Criativo. - + - Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_VK_BACK*}. + 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. - + -Pressione{*CONTROLLER_VK_B*} agora para sair do inventário do modo criativo. + 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. - + -Esta é a interface de fabricação. Esta interface de fabricação lhe permite combinar os itens coletados para fazer novos itens. + 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. - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber fabricar. - + + Agora você completou o tutorial da fazenda. - - {*B*} - Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. - + + Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar um machado para cortar troncos de árvores. - - {*B*} - Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. - + + 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. - - {*B*} - Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. - + + Algumas ferramentas são melhores para atacar inimigos. Pense em usar uma espada para atacar. - + + Os Golens de Ferro também aparecem naturalmente para proteger vilas e o atacarão se você atacar algum aldeão. + + + Você só poderá sair desta área quando concluir o tutorial. + + + Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma pá para extrair materiais macios como terra ou areia. + + + 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... + + + No baú ao lado do rio há um barco. Para usar o barco, aponte o cursor para a água e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} ao apontar para o barco para entrar nele. + + + No baú ao lado do lago há uma vara de pescar. Tire a vara do baú e selecione-a como o item atual em sua mão para usá-la. + + + Este mecanismo de pistão mais avançado cria uma ponte que se conserta automaticamente! Pressione o botão para ativar e veja como os componentes interagem para aprender mais. + + + A ferramenta que está usando está danificada. Sempre que você usa uma ferramenta ela sofre danos e pode quebrar. A barra colorida abaixo do item no inventário mostra o estado atual dos danos. + + + Mantenha{*CONTROLLER_ACTION_JUMP*} pressionado para nadar. + + + Nesta área há um carrinho de minas sobre um trilho. Para entrar no carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} no botão para mover o carrinho. + + + 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. + + + 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. + + + Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto. + + + Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos. + + -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. + Nesta área os animais foram cercados. Você pode criar animais para produzir filhotes deles. - + -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. + {*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. - + + Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor". + + + 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*} + + - 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. + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Golens.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os Golens. - + + Os Golens são criados colocando uma abóbora sobre uma pilha de blocos. + + + 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. + + - 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. + 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. - + + Agora você completou o tutorial de criação de animais. + + - A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. + Nesta área há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. - + - A lista dos ingredientes necessários para fabricar o item é exibida. - - - - A madeira que você coletou pode ser usada para fabricar tábuas. Selecione o ícone de tábuas e pressione{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} - - - - Você já construiu uma bancada e agora deve colocá-la no mundo para poder construir uma variedade maior de itens.{*B*} - Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. - - - - - Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de ferramentas.{*ToolsIcon*} - - - - - Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de estruturas.{*StructuresIcon*} - - - - - Use{*CONTROLLER_MENU_NAVIGATE*} para alterar para o item que deseja fabricar. Alguns itens têm várias versões, dependendo dos materiais usados. Selecione a pá de madeira.{*WoodenShovelIcon*} - - - - - Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Use{*CONTROLLER_MENU_NAVIGATE*} para alterar para o item que deseja fabricar. Selecione a bancada.{*CraftingTableIcon*} - - - - - Com as ferramentas que construiu, você está pronto para começar bem e poderá coletar diversos materiais com mais eficiência.{*B*} - Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. - - - - - Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} - - - - - Coloque no mundo a fornalha que fabricou. É bom colocá-la dentro do seu abrigo.{*B*} - Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. - - - - - Esta é a interface da fornalha. Com ela você pode alterar os itens queimando-os. Por exemplo, nela você pode transformar minério de ferro em barras de ferro. - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. - - - - - Você precisa colocar um pouco de combustível na abertura inferior da fornalha e o item a ser transformado na abertura superior. A fornalha acenderá e começará a funcionar, colocando o resultado na abertura à direita. - - - - - Muitos itens de madeira podem ser usados como combustível, mas nem tudo demora o mesmo tempo para queimar. Você pode descobrir outros itens no mundo que podem ser usados como combustível. - - - - - Depois de queimar os itens, você poderá movê-los da área de saída para o inventário. Experimente ingredientes diferentes para ver o que pode fazer. - - - - - Se usar madeira como ingrediente, você poderá fazer carvão vegetal. Coloque um pouco de combustível na fornalha e madeira na abertura do ingrediente. Pode demorar algum tempo para que a fornalha crie o carvão vegetal. Se preferir, vá fazer outra coisa e volte para verificar o progresso. - - - - - O carvão vegetal pode ser usado como combustível e também ser combinado com uma vareta para fabricar uma tocha. - - - - - Se colocar areia na abertura do ingrediente, você poderá fazer vidro. Crie alguns blocos de vidro para usar como janelas no seu abrigo. - - - - - Esta é a interface de poções. Você pode usar isto para criar poções com diversos efeitos diferentes. - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar a barraca de poções. - - - - - Para fazer poções você deve colocar um ingrediente no slot superior e uma poção ou garrafa de água nos slots de baixo (é possível fazer até 3 poções de uma vez). Depois que uma combinação válida for colocada, o processo começará e a poção será criada depois de pouco tempo. - - - - - Todas as poções começam com uma Garrafa de Água. A maioria das poções é criada usando primeiro uma Verruga do Submundo para fazer uma Poção Maligna, e precisa de pelo menos mais um ingrediente para fazer a poção final. - - - - - Depois que tiver uma poção, você pode modificar seus efeitos. Se adicionar Pó de Redstone, a duração do efeito aumenta, e se adicionar Pó de Glowstone, o efeito será mais poderoso. - - - - - A adição de Olho de Aranha Fermentado corrompe a poção e a transforma em uma poção com o efeito contrário, e a adição de Pólvora transforma a poção em uma Poção de Lançamento, que pode ser atirada para aplicar seus efeitos a uma área próxima. - - - - - Crie uma Poção de Resistência ao Fogo primeiro adicionando Verruga do Submundo a uma Garrafa de Água, e depois adicionando Creme de Magma. - - - - - Pressione{*CONTROLLER_VK_B*} agora para sair da interface de poções. - - - - - Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poções. - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre como fazer poções.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber como fazer poções. - - - - - A primeira etapa para fazer uma poção é criar uma Garrafa de Água. Pegue uma Garrafa de Vidro no baú. - - - - - Você pode encher a garrafa de vidro com um Caldeirão que tenha água dentro, ou com um bloco de água. Encha a garrafa de vidro agora apontando para uma fonte de água e pressionando{*CONTROLLER_ACTION_USE*}. + 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. @@ -3121,11 +916,42 @@ A área de fabricação mostra os itens necessários para fabricar o novo item. 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. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre como fazer poções.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como fazer poções. + + + + + A primeira etapa para fazer uma poção é criar uma Garrafa de Água. Pegue uma Garrafa de Vidro no baú. + + + + + Você pode encher a garrafa de vidro com um Caldeirão que tenha água dentro, ou com um bloco de água. Encha a garrafa de vidro agora apontando para uma fonte de água e pressionando{*CONTROLLER_ACTION_USE*}. Use sua Poção de Resistência ao fogo em si mesmo. + + + + + 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. + + + + + Quando um item for colocado no slot de feitiços, os botões da direita mudarão para uma seleção de feitiços aleatórios. + + + + + O número no botão representa o custo em níveis de experiência para aplicar esse feitiço ao item. Se você não tiver o nível necessário, o botão estará desabilitado. @@ -3144,118 +970,80 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. Pressione{*CONTROLLER_VK_B*} se já souber usar a interface de feitiços. - + - Para enfeitiçar um item, primeiro coloque-o no slot de feitiços. Armas, armadura e algumas ferramentas podem ser enfeitiçadas para adicionar efeitos especiais como maior resistência a danos ou aumento do número de itens produzidos ao minerar um bloco. + Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poçõ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. + O carvão vegetal pode ser usado como combustível e também ser combinado com uma vareta para fabricar uma tocha. - + - 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. + Se colocar areia na abertura do ingrediente, você poderá fazer vidro. Crie alguns blocos de vidro para usar como janelas no seu abrigo. + + + + + Esta é a interface de poções. Você pode usar isto para criar poções com diversos efeitos diferentes. + + + + + Muitos itens de madeira podem ser usados como combustível, mas nem tudo demora o mesmo tempo para queimar. Você pode descobrir outros itens no mundo que podem ser usados como combustível. + + + + + Depois de queimar os itens, você poderá movê-los da área de saída para o inventário. Experimente ingredientes diferentes para ver o que pode fazer. + + + + + Se usar madeira como ingrediente, você poderá fazer carvão vegetal. Coloque um pouco de combustível na fornalha e madeira na abertura do ingrediente. Pode demorar algum tempo para que a fornalha crie o carvão vegetal. Se preferir, vá fazer outra coisa e volte para verificar o progresso. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a barraca de poções. + + + + + 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. + + + + + Crie uma Poção de Resistência ao Fogo primeiro adicionando Verruga do Submundo a uma Garrafa de Água, e depois adicionando Creme de Magma. + + + + + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de poções. + + + + + Para fazer poções você deve colocar um ingrediente no slot superior e uma poção ou garrafa de água nos slots de baixo (é possível fazer até 3 poções de uma vez). Depois que uma combinação válida for colocada, o processo começará e a poção será criada depois de pouco tempo. + + + + + Todas as poções começam com uma Garrafa de Água. A maioria das poções é criada usando primeiro uma Verruga do Submundo para fazer uma Poção Maligna, e precisa de pelo menos mais um ingrediente para fazer a poção final. + + + + + Depois que tiver uma poção, você pode modificar seus efeitos. Se adicionar Pó de Redstone, a duração do efeito aumenta, e se adicionar Pó de Glowstone, o efeito será mais poderoso. Selecione um feitiço e pressione{*CONTROLLER_VK_A*} para enfeitiçar o item. Isso irá diminuir seu nível de experiência correspondente ao custo do feitiço. - - - - - Apesar dos feitiços serem aleatórios, alguns dos melhores feitiços só estarão disponíveis se você tiver um nível de experiência alto e muitas estantes ao redor da Bancada de Feitiços para aumentar seu poder. - - - - - Nesta área há uma Bancada de Feitiços e alguns outros itens para você aprender mais sobre feitiços. - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre feitiços.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os feitiços. - - - - - 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. - - - - - Colocar estantes de livros ao redor da Bancada de Feitiços aumenta seu poder e permite o acesso a feitiços de nível mais alto. - - - - - Enfeitiçar itens custa Níveis de Exp. que podem ser conquistados coletando Esferas de Exp. produzidas ao matar monstros e animais, minerar minérios, criar animais, pescar e fundir/cozinhar algumas coisas na fornalha. - - - - - Também pode conquistar níveis de exp. usando a Garrafa de Feitiços, que ao ser atirada cria Esferas de Exp. perto de onde cair. Essas esferas podem ser coletadas. - - - - - Nos baús desta área encontrará alguns itens enfeitiçados, Garrafas de Feitiços e alguns itens que ainda não foram enfeitiçados, para experimentar na Bancada de Feitiços. - - - - - Agora você está andando no carrinho de minas. Para sair do carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre os carrinhos de minas.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os carrinhos de minas. - - - - - O carrinho de minas corre sobre trilhos. Você também pode fabricar um carrinho com propulsão com uma fornalha e um carrinho de minas com um baú nele. - {*RailIcon*} - - - - - Você também pode fabricar trilhos com propulsão, que usam a energia de tochas e circuitos de redstone para acelerar o carrinho. Eles podem ser conectados a acionadores, alavancas e chapas de pressão para criar sistemas complexos. - {*PoweredRailIcon*} - - - - - Agora você está andando de barco. Aponte o cursor para o barco e pressione{*CONTROLLER_ACTION_USE*} para sair.{*BoatIcon*} - - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre os barcos.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os barcos. - - - - - Com o barco é possível viajar mais rapidamente sobre a água. Você pode navegá-lo usando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - - - Agora você está usando uma vara de pescar. Pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*FishingRodIcon*} - - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre a pesca.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber pescar. @@ -3274,11 +1062,46 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. 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*} + + + + + Com o barco é possível viajar mais rapidamente sobre a água. Você pode navegá-lo usando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Agora você está usando uma vara de pescar. Pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*FishingRodIcon*} + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a pesca.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber pescar. Esta é uma cama. Pressione{*CONTROLLER_ACTION_USE*} ao apontar para ela à noite para dormir a noite toda e despertar de manhã.{*ICON*}355{*/ICON*} + + + + + Nesta área, há alguns circuitos simples de redstone e pistão, além de um baú com mais itens para ampliar esses circuitos. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre circuitos de redstone e pistões.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar circuitos de redstone e pistões. + + + + + Alavancas, botões, chapas de pressão e tochas de redstone podem fornecer energia aos circuitos, seja conectando-os diretamente ao item a ser ativado ou conectando-os com pó de redstone. @@ -3300,249 +1123,304 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. {*ICON*}355{*/ICON*} - - - Nesta área, há alguns circuitos simples de redstone e pistão, além de um baú com mais itens para ampliar esses circuitos. - - - + {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre circuitos de redstone e pistões.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar circuitos de redstone e pistões. + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os barcos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os barcos. - + - 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. + 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. - + - 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. + 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. - + - 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*} + 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. - + - Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. - {*ICON*}356{*/ICON*} + 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. - + - 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*} + Nesta área há uma Bancada de Feitiços e alguns outros itens para você aprender mais sobre feitiços. - + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre feitiços.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os feitiços. + + + - 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. + 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. - + - Nesta área há um Portal para o Submundo! + 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*} - + - {*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. + 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*} - + - 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. + Agora você está andando de barco. Aponte o cursor para o barco e pressione{*CONTROLLER_ACTION_USE*} para sair.{*BoatIcon*} - + - 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. + 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. - + - 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. + Agora você está andando no carrinho de minas. Para sair do carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - 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. + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os carrinhos de minas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os carrinhos de minas. - - - O mundo do Submundo pode ser usado para viajar rapidamente na Superfície. Viajar a uma distância de um bloco no Submundo equivale a viajar 3 blocos na Superfície. - - - - - Agora você está no Modo Criativo. - - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre o Modo Criativo.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar o Modo Criativo. - - - - No modo Criativo você tem um número infinito de todos os itens e blocos disponíveis, pode destruir blocos com um clique sem uma ferramenta, você é invulnerável e pode voar. - - - Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. - - - Vá até o lado oposto deste buraco para continuar. - - - Você já concluiu o tutorial do modo Criativo. - - - - Nesta área foi estabelecida uma fazenda. Se você a cultivar, terá uma fonte renovável de comida e outros itens. - - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre fazendas.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar as fazendas. - - - - Trigo, abóboras e melões são cultivados a partir de sementes. As sementes de trigo são coletadas quebrando Grama Alta ou colhendo trigo, e as sementes de abóbora e melão são fabricadas a partir de abóboras e melões, respectivamente. - - - Antes de plantar as sementes os blocos de terra devem ser transformados em Campo usando uma Enxada. Uma fonte próxima de água ajudará a manter o Campo hidratado e fará as colheitas crescerem mais rápido, além de manter a área iluminada. - - - O trigo passa por várias etapas enquanto está crescendo, e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} - - - As abóboras e melões também precisam de um bloco próximo de onde as sementes foram plantadas, para que os frutos cresçam assim que os caules estiverem crescidos. - - - A cana-de-açúcar deve ser plantada em um bloco de Grama, Terra ou Areia que esteja ao lado de um bloco de água. Se você cortar um bloco de Cana-de-açúcar, também derrubará todos os blocos que estão acima dele.{*ICON*}83{*/ICON*} - - - Os Cactos devem ser plantados na Areia, e crescerão com até três blocos de altura. Da mesma forma que a Cana-de-açúcar, se o bloco inferior for destruído, você também coletará os blocos que estão acima dele.{*ICON*}81{*/ICON*} - - - Os Cogumelos devem ser plantados em uma área com pouca iluminação e se espalharão para os blocos próximos pouco iluminados.{*ICON*}39{*/ICON*} - - - O Farelo de osso pode ser usado para as plantações chegarem à etapa mais desenvolvida, ou para fazer os Cogumelos se transformarem em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} - - - Agora você completou o tutorial da fazenda. - - - - Nesta área os animais foram cercados. Você pode criar animais para produzir filhotes deles. - - - - - {*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. - - - - Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor". - - - Dê Trigo para uma vaca, vacogumelo ou ovelha, 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. - - - Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto. - - - Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos. - - - Alguns animais 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*} - - - - 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. - - - - Agora você completou o tutorial de criação de animais. - - - - Nesta área há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. - - - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre Golens.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os Golens. - - - - Os Golens são criados colocando uma abóbora sobre uma pilha de blocos. - - - 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. - - - 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. - - - Os Golens de Ferro também aparecem naturalmente para proteger vilas e o atacarão se você atacar algum aldeão. - - - Você só poderá sair desta área quando concluir o tutorial. - - - Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma pá para extrair materiais macios como terra ou areia. - - - Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar um machado para cortar troncos de árvores. - - - Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma picareta para extrair pedra e minério. Talvez seja necessário fabricar sua picareta com materiais melhores para obter recursos de alguns blocos. - - - Algumas ferramentas são melhores para atacar inimigos. Pense em usar uma espada para atacar. - - - Dica: mantenha {*CONTROLLER_ACTION_ACTION*}pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... - - - A ferramenta que está usando está danificada. Sempre que você usa uma ferramenta ela sofre danos e pode quebrar. A barra colorida abaixo do item no inventário mostra o estado atual dos danos. - - - Mantenha{*CONTROLLER_ACTION_JUMP*} pressionado para nadar. - - - Nesta área há um carrinho de minas sobre um trilho. Para entrar no carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} no botão para mover o carrinho. - - - No baú ao lado do rio há um barco. Para usar o barco, aponte o cursor para a água e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} ao apontar para o barco para entrar nele. - - - No baú ao lado do lago há uma vara de pescar. Tire a vara do baú e selecione-a como o item atual em sua mão para usá-la. - - - Este mecanismo de pistão mais avançado cria uma ponte que se conserta automaticamente! Pressione o botão para ativar e veja como os componentes interagem para aprender mais. - Se você mover o ponteiro para fora da interface ao segurar um item, poderá derrubá-lo. + + Ler + + + Pendurar + + + Atirar + + + Abrir + + + Alterar Tom + + + Detonar + + + Plantar + + + Desbloquear jogo completo + + + Excluir Salvamento + + + Excluir + + + Arar + + + Colher + + + Continuar + + + Nadar + + + Atingir + + + Ordenhar + + + Coletar + + + Esvaziar + + + Selar + + + Colocar + + + Comer + + + Montar + + + Velejar + + + Cultivar + + + Dormir + + + Acordar + + + Tocar + + + Opções + + + Mover Armadura + + + Mover Arma + + + Equipar + + + Mover Ingrediente + + + Mover Combustível + + + Ferramenta Mover + + + Puxar + + + Página Acima + + + Página Abaixo + + + Modo do Amor + + + Lançar + + + Privilégios + + + Bloquear + + + Criativo + + + Banir Nível + + + Selecionar Capa + + + Acender + + + Convidar Amigos + + + Aceitar + + + Tosquiar + + + Navegar + + + Reinstalar + + + Opções Salvamento + + + Executar Comando + + + Instalar Versão Completa + + + Instalar Versão de Avaliação + + + Instalar + + + Ejetar + + + Lista de Jogos Online + + + Jogos de Grupo + + + Todos os Jogos + + + Sair + + + Cancelar + + + Cancelar Entrada + + + Alterar Grupo + + + Fabricação + + + Criar + + + Pegar/Colocar + + + Mostrar Inventário + + + Mostrar Descrição + + + Mostrar Ingredientes + + + Voltar + + + Lembrete: + + + + + + Novos recursos foram adicionados ao jogo na versão mais recente, incluindo novas áreas no mundo do tutorial. + 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. @@ -3554,29 +1432,9 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. {*EXIT_PICTURE*} Quando estiver pronto para explorar mais, há uma escadaria nesta área perto do abrigo do mineiro que leva a um pequeno castelo. - - Lembrete: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Novos recursos foram adicionados ao jogo na versão mais recente, incluindo novas áreas no mundo do tutorial. - {*B*}Pressione{*CONTROLLER_VK_A*} para jogar no tutorial normalmente.{*B*} Pressione{*CONTROLLER_VK_B*} para pular o tutorial principal. - - - Nesta área, você encontrará áreas configuradas para ajudá-lo a aprender sobre pesca, barcos, pistões e redstone. - - - Fora desta área, você encontrará exemplos de construções, cultivo, carrinhos de mineração e trilhos, feitiços, poções, comércio, forjamento de metais e muito mais! - - - - Sua barra de alimentos chegou a um nível em que não há mais cura. - @@ -3591,102 +1449,20 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. Usar - - Voltar + + Nesta área, você encontrará áreas configuradas para ajudá-lo a aprender sobre pesca, barcos, pistões e redstone. - - Sair + + 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! - - Cancelar - - - Cancelar Entrada - - - Lista de Jogos Online - - - Jogos de Grupo - - - Todos os Jogos - - - Alterar Grupo - - - Mostrar Inventário - - - Mostrar Descrição - - - Mostrar Ingredientes - - - Fabricação - - - Criar - - - Pegar/Colocar + + + Sua barra de alimentos chegou a um nível em que não há mais cura. + Pegar - - Pegar tudo - - - Pegar metade - - - Colocar - - - Colocar tudo - - - Colocar um - - - Soltar - - - Soltar tudo - - - Soltar um - - - Trocar - - - Mover rápido - - - Limpar Seleção Rápida - - - O que é isto? - - - Compartilhar no Facebook - - - Alterar Filtro - - - Enviar Pedido de Amizade - - - Página Abaixo - - - Página Acima - Próximo @@ -3696,18 +1472,18 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. Expulsar + + Enviar Pedido de Amizade + + + Página Abaixo + + + Página Acima + Tingir - - Extrair - - - Alimentar - - - Domar - Curar @@ -3717,1066 +1493,874 @@ As poções tchibum podem ser criadas adicionando pólvora a poções normais. Seguir-me - - Ejetar + + Extrair - - Esvaziar + + Alimentar - - Selar + + Domar - + + Alterar Filtro + + + Colocar tudo + + + Colocar um + + + Soltar + + + Pegar tudo + + + Pegar metade + + Colocar - - Atingir + + Soltar tudo - - Ordenhar + + Limpar Seleção Rápida - - Coletar + + O que é isto? - - Comer + + Compartilhar no Facebook - - Dormir + + Soltar um - - Acordar + + Trocar - - Tocar - - - Montar - - - Velejar - - - Cultivar - - - Nadar - - - Abrir - - - Alterar Tom - - - Detonar - - - Ler - - - Pendurar - - - Atirar - - - Plantar - - - Arar - - - Colher - - - Continuar - - - Desbloquear jogo completo - - - Excluir Salvamento - - - Excluir - - - Opções - - - Convidar Amigos - - - Aceitar - - - Tosquiar - - - Banir Nível - - - Selecionar Capa - - - Acender - - - Navegar - - - Instalar Versão Completa - - - Instalar Versão de Avaliação - - - Instalar - - - Reinstalar - - - Opções Salvamento - - - Executar Comando - - - Criativo - - - Mover Ingrediente - - - Mover Combustível - - - Ferramenta Mover - - - Mover Armadura - - - Mover Arma - - - Equipar - - - Puxar - - - Lançar - - - Privilégios - - - Bloquear - - - Página Acima - - - Página Abaixo - - - Modo do Amor - - - Beber - - - Girar - - - Ocultar - - - Limpar Todos os Espaços - - - OK - - - Cancelar - - - Loja Minecraft - - - Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? O progresso não salvo será perdido. - - - Sair do Jogo - - - Salvar Jogo - - - Sair sem salvar - - - Tem certeza de que deseja substituir o salvamento anterior deste mundo pela versão atual dele? - - - Tem certeza de que deseja sair sem salvar? Você perderá todo o progresso neste mundo! - - - Iniciar o jogo - - - Jogo danificado - - - Este jogo salvo está corrompido ou danificado. Gostaria de excluí-lo? - - - Tem certeza de que deseja sair para o menu principal e desconectar todos os jogadores do jogo? O progresso não salvo será perdido. - - - Sair e salvar - - - Sair sem salvar - - - Tem certeza de que deseja sair para o menu principal? O progresso não salvo será perdido. - - - Tem certeza de que deseja sair para o menu principal? Seu progresso será perdido! - - - Criar novo mundo - - - Jogar tutorial - - - Tutorial - - - Nomear mundo - - - Digite um nome para o mundo - - - Insira a semente para a criação do seu mundo - - - Carregar mundo salvo - - - Pressione START p/ entrar - - - Saindo do jogo - - - Erro. Saindo para o menu principal. - - - Falha na conexão - - - Conexão perdida - - - A conexão com o servidor foi perdida. Saindo para o menu principal. - - - Desconectado pelo servidor - - - Você foi expulso do jogo - - - Você foi expulso do jogo por voar - - - A tentativa de conexão demorou muito - - - O servidor está cheio - - - O host saiu do jogo. - - - Você não pode entrar neste jogo, pois não é amigo de nenhuma pessoa no jogo. - - - Você não pode entrar neste jogo, pois já foi expulso antes pelo host. - - - Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. - - - Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão mais nova do jogo. - - - Novo mundo - - - Brinde desbloqueado! - - - Oba! Você ganhou uma imagem do jogador com o Steve do Minecraft! - - - Oba! Você ganhou uma imagem do jogador com um Creeper! - - - 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 - - - Filtro: - - - Amigos - - - Minha pontuação - - - Geral - - - Entradas: - - - Classif. - - - Preparando para salvar nível - - - Preparando partes... - - - Finalizando... - - - Construindo terreno - - - Simulando o mundo um pouquinho - - - Inicializando o servidor - - - Produzindo área de criação - - - Carregando área de criação - - - Entrando no Submundo - - - Saindo do Submundo - - - Renascendo - - - Criando nível - - - Carregando nível - - - Salvando jogadores - - - Conectando ao host - - - Baixando terreno - - - Alternando para jogo offline - - - Aguarde enquanto o host salva o jogo - - - Entrando no FINAL - - - Saindo do FINAL - - - Esta cama está ocupada - - - Você só pode dormir à noite - - - %s está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. - - - A cama de sua casa estava desaparecida ou obstruída - - - Você não pode descansar agora, há monstros por perto - - - Você está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. - - - Ferramentas e Armas - - - Armas - - - Alimentos - - - Estruturas - - - Armadura - - - Mecanismos - - - Transporte - - - Decorações - - - Blocos de Construção - - - Redstone e Transporte - - - Diversos - - - Poções - - - Ferramentas, Armas e Armaduras - - - Materiais - - - Sessão finalizada - - - Dificuldade - - - Música - - - Som - - - Gama - - - Sensibilidade do Jogo - - - Sensib. Interface - - - Pacífico - - - Fácil - - - Normal - - - Difícil - - - Neste modo, o jogador ganha energia com o tempo e não há inimigos no ambiente. - - - Neste modo, inimigos são gerados no ambiente, mas causam menos danos ao jogador que no modo Normal. - - - Neste modo, inimigos são gerados no ambiente e causam uma quantidade padrão de danos ao jogador. - - - Neste modo, inimigos são gerados no ambiente e causam muitos danos ao jogador. Tome cuidado também com os Creepers, pois eles não podem cancelar o ataque explosivo quando você se afasta deles! - - - Tempo limite de avaliação - - - Versão completa - - - Falha ao entrar no jogo, pois não há espaços restantes - - - Digitar texto da placa - - - Digite uma linha de texto para sua placa - - - Digitar título - - - Digite um título para sua postagem - - - Digitar legenda - - - Digite uma legenda para sua postagem - - - Digitar descrição - - - Digite uma descrição para sua postagem - - - Inventário - - - Ingredientes - - - Barraca de Poções - - - Baú - - - Feitiço - - - Fornalha - - - Ingrediente - - - Combustível - - - Distribuidor - - - Não há ofertas de conteúdo oferecido para download desse tipo disponíveis para este título no momento. - - - %s entrou no jogo. - - - %s saiu do jogo. - - - %s foi expulso do jogo. - - - Tem certeza de que deseja excluir este jogo salvo? - - - A confirmar - - - Censurado - - - Tocando agora: - - - Redefinir Configurações - - - Tem certeza de que deseja redefinir suas configurações para os valores padrão? - - - Erro de carregamento - - - Jogo de %s - - - Jogo com host desconhecido - - - Convidado saiu - - - Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. - - - Entrar - - - Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? - - - Multijogador não é permitido - - - Falha ao criar jogo - - - Seleção automática - - - Nenhum pacote: Capas padrão - - - Capas favoritas - - - Nível banido - - - O jogo em que está entrando está em sua lista de níveis banidos. -Se você optar por participar desse jogo, o nível será removido de sua lista de níveis banidos. - - - Banir este nível? - - - Tem certeza de que deseja adicionar este nível à lista de níveis banidos? -Selecionar OK também fechará este jogo. - - - Remover da Lista de Banidos - - - Intervalo Salv. Autom. - - - Intervalo Salv. Autom.: DESL. - - - Min. - - - Não é possível colocar aqui! - - - Não é permitido colocar lava perto do ponto de criação do nível devido à possibilidade de morte imediata dos jogadores criados. - - - Opacidade da interface - - - Preparando salvamento automático do nível - - - Tamanho do HUD - - - Tamanho do HUD (tela dividida) - - - Semente - - - Desbloquear pacote de capas - - - Para usar a capa selecionada, você precisa desbloquear este pacote de capas. -Deseja desbloquear o pacote de capas agora? - - - Desbloquear pacote de textura - - - Para usar este pacote de textura no seu mundo, você precisa desbloqueá-lo. -Você deseja desbloquear agora? - - - Pacote de texturas para avaliação - - - Você está usando uma versão de avaliação do pacote de texturas. Você não poderá salvar este mundo até desbloquear a versão completa. -Gostaria de desbloquear a versão completa do pacote de texturas? - - - Pacote de textura não disponível - - - Desbloquear a versão completa - - - Fazer download da versão de avaliação - - - Fazer download da versão completa - - - Este mundo usa um pacote de combinações ou pacote de texturas que você não tem! -Deseja instalar o pacote de combinações ou o pacote de texturas agora? - - - Obter versão de avaliação - - - Obter versão completa - - - Expulsar - - - Tem certeza de que deseja expulsar este jogador do jogo? Eles não poderão entrar de novo até que você reinicie o mundo. - - - Pacotes de imagens do jogador - - - Temas - - - Pacotes de capas - - - Permite os amigos dos amigos - - - Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. - - - Não é possível entrar no jogo - - - Selecionado - - - Capa selecionada: - - - Conteúdo oferecido para download corrompido - - - 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. - - - 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. - - - Seu modo de jogo foi alterado - - - Renomeie seu mundo - - - Digite o novo nome para seu mundo - - - Modo de jogo: Sobrevivência - - - Modo de jogo: Criativo - - - Sobrevivência - - - Criativo - - - Criado em Sobrevivência - - - Criado em Criativo - - - Renderizar Nuvens - - - O que deseja fazer com este jogo salvo? - - - Renomear salvamento - - - Salvando automaticamente em %d... - - - Ativado - - - Desativado - - - Normal - - - Superplano - - - Quando habilitado, o jogo será um jogo online. - - - Quando habilitado, apenas jogadores convidados poderão entrar. - - - Quando habilitado, os amigos das pessoas em sua Lista de Amigos poderão entrar no jogo. - - - Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência. - - - Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. - - - Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. - - - Quando habilitado, a TNT explodirá quando ativada. - - - Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes. - - - Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. - - - Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo. - - - Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. + + Mover rápido Pacotes de capas - - Temas + + Painel de Cristal Tingido de Vermelho - - Imagens do jogador + + Painel de Cristal Tingido de Verde - - Itens de avatar + + Painel de Cristal Tingido de Marrom - - Pacotes de texturas + + Cristal Tingido de Branco - - Pacotes de combinações + + Painel de Cristal Tingido - - {*PLAYER*} incendiou-se + + Painel de Cristal Tingido de Preto - - {*PLAYER*} queimou até a morte + + Painel de Cristal Tingido de Azul - - {*PLAYER*} tentou nadar na lava + + Painel de Cristal Tingido de Cinza - - {*PLAYER*} asfixiou-se em uma parede + + Painel de Cristal Tingido de Rosa - - {*PLAYER*} afogou-se + + Painel de Cristal Tingido de Verde-limão - - {*PLAYER*} morreu de fome + + Painel de Cristal Tingido de Roxo - - {*PLAYER*} foi espetado até a morte + + Painel de Cristal Tingido de Cíano - - {*PLAYER*} atingiu o chão com muita força + + Painel de Cristal Tingido de Cinza-claro - - {*PLAYER*} caiu para fora do mundo + + Cristal Tingido de Laranja - - {*PLAYER*} morreu + + Cristal Tingido de Azul - - {*PLAYER*} explodiu + + Cristal Tingido de Roxo - - {*PLAYER*} foi morto por magia + + Cristal Tingido de Cíano - - {*PLAYER*} foi morto pelo sopro do Dragão Ender + + Cristal Tingido de Vermelho - - {*PLAYER*} foi assassinado por {*SOURCE*} + + Cristal Tingido de Verde - - {*PLAYER*} foi assassinado por {*SOURCE*} + + Cristal Tingido de Marrom - - {*PLAYER*} levou um tiro de {*SOURCE*} + + Cristal Tingido de Cinza-claro - - {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + + Cristal Tingido de Amarelo - - {*PLAYER*} foi esmurrado por {*SOURCE*} + + Cristal Tingido de Azul-claro - - {*PLAYER*} foi morto por {*SOURCE*} + + Cristal Tingido de Magenta - - Neblina Base + + Cristal Tingido de Cinza - - Exibir HUD + + Cristal Tingido de Rosa - - Exibir Mão + + Cristal Tingido de Verde-limão - - Mensagens de Morte + + Painel de Cristal Tingido de Amarelo - - Personagem Animado + + Cinza-claro - - Anim. capa personalizada + + Cinza - - Você não pode mais minerar nem usar itens + + Rosa - - Agora você pode minerar e usar itens + + Azul - - Você não pode mais colocar blocos + + Roxo - - Agora você pode colocar blocos + + Cíano - - Agora você pode usar portas e acionadores + + Verde-limão - - Você não pode mais usar portas e acionadores + + Laranja - - Agora você pode usar recipientes (por exemplo, baús) + + Branco - - Você não pode mais usar recipientes (por exemplo, baús) + + Personalizado - - Você não pode mais atacar multidões + + Amarelo - - Agora você pode atacar multidões + + Azul-claro - - Você não pode mais atacar jogadores + + Magenta - - Agora você pode atacar jogadores + + Marrom - - Você não pode mais atacar animais + + Painel de Cristal Tingido de Branco - - Agora você pode atacar animais + + Bola pequena - - Agora você é um moderador + + Bola grande - - Você não é mais um moderador + + Painel de Cristal Tingido de Azul-claro - - Agora você pode voar + + Painel de Cristal Tingido de Magenta - - Você não pode mais voar + + Painel de Cristal Tingido de Laranja - - Você não vai mais ficar cansado + + Formato de estrela - - Agora você vai ficar cansado + + Preto - - Agora você é invisível + + Vermelho - - Você não é mais invisível + + Verde - - Agora você é invulnerável + + Formato de Creeper - - Você não é mais invulnerável + + Explosão - - %d MSP + + Formato desconhecido - - Dragão Ender + + Cristal Tingido de Preto - - %s entrou no Final + + Armadura de Ferro de Cavalo - - %s saiu do Final + + Armadura de Ouro de Cavalo - - {*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*} + + Armadura de Diamante de Cavalo + + + Comparador de Redstone + + + Carrinho de minas com TNT + + + Carrinho de Minas com Funil + + + Laço + + + Sinalizador + + + Baú Confinado + + + Chapa de Pressão Medida (leve) + + + Crachá + + + Tábuas de madeira (qualquer tipo) + + + Bloco de Comandos + + + Estrela de Fogo de Artifício + + + Esses animais podem ser domados e depois cavalgados. Pode-se conectar um baú a eles. + + + Mula + + + Nascida quando um Cavalo e um Burro cruzam. Esses animais podem ser domados, cavalgados e carregar baús. + + + Cavalo + + + Esses animais podem ser domados e depois cavalgados. + + + Burro + + + Cavalo Zumbi + + + Mapa vazio + + + Estrela do Submundo + + + Foguete de Fogo de Artifício + + + Cavalo do esqueleto + + + Wither + + + São fabricados com Caveiras murchas e Areia Movediça. Disparam caveiras explosivas em você. + + + Chapa de Pressão Medida (pesado) + + + Argila Tingida de Cinza-claro + + + Argila Tingida de Cinza + + + Argila Tingida de Rosa + + + Argila Tingida de Azul + + + Argila Tingida de Roxo + + + Argila Tingida de Cíano + + + Argila Tingida de Verde-limão + + + Argila Tingida de Laranja + + + Argila Tingida de Branco + + + Cristal Tingido + + + Argila Tingida de Amarelo + + + Argila Tingida de Azul-claro + + + Argila Tingida de Magenta + + + Argila Tingida de Marrom + + + Funil + + + Trilho Ativador + + + Liberador + + + Comparador de Redstone + + + Sensor de Luz do Dia + + + Bloco de Redstone + + + Argila Tingida + + + Argila Tingida de Preto + + + Argila Tingida de Vermelho + + + Argila Tingida de Verde + + + Fardo de Feno + + + Argila Endurecida + + + Bloco de Carvão + + + Transição para + + + 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. + + + Quando ativado, os jogadores mantêm seu inventário depois de morrer. + + + Ao ser desativado, as multidões não são criadas naturalmente. + + + Modo de jogo: Aventura + + + Aventura + + + Coloque uma semente para gerar o mesmo terreno novamente. Deixar em branco para mundo aleatório. + + + Ao ser desativado, monstros e animais não derrubam itens (por exemplo, Creepers não derrubam pólvora). + + + {*PLAYER*} caiu de uma escada + + + {*PLAYER*} caiu de umas vinhas + + + {*PLAYER*} caiu fora d'água + + + Ao ser desativado, os blocos não derrubam itens quando são destruídos (por exemplo, blocos de Pedra não derrubam Pedregulho). + + + Ao ser desativado, os jogadores não regeneram a energia naturalmente. + + + Ao ser desativado, a hora do dia não muda. + + + Carrinho de Minas + + + Laçar + + + Soltar + + + Conectar + + + Descer + + + Conectar baú + + + Lançar + + + Dar nome + + + Sinalizador + + + Poder principal + + + Poder secundário + + + Cavalo + + + Liberador + + + Funil + + + {*PLAYER*} caiu de um lugar alto + + + 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. + + + Este animal não pode entrar em Modo do Amor. O número máximo de cavalos reprodutores foi alcançado. + + + Opções de Jogo + + + {*SOURCE*} lançou bolas de fogo em {*PLAYER*} usando {*ITEM*} + + + {*PLAYER*} levou um murro de {*SOURCE*} usando {*ITEM*} + + + {*SOURCE*} matou {*PLAYER*} usando {*ITEM*} + + + Vandalismo de multidão + + + Bloco derruba itens + + + Regeneração Natural + + + Ciclo da Luz do Dia + + + Manter inventário + + + Criação de multidão + + + Pilhagem de multidão + + + {*PLAYER*} levou um tiro de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} caiu muito longe e sofreu finalização por {*SOURCE*} + + + {*PLAYER*} caiu muito longe e foi finalizado por {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} caminhou até o fogo ao lutar com {*SOURCE*} + + + {*PLAYER*} sofreu feitiço para cair por {*SOURCE*} + + + {*PLAYER*} sofreu feitiço para cair por {*SOURCE*} + + + {*PLAYER*} sofreu feitiço para cair por {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ardeu em chamas durante a luta {*SOURCE*} + + + {*PLAYER*} sofreu uma explosão por {*SOURCE*} + + + {*PLAYER*} sofreu decomposição + + + {*SOURCE*} matou {*PLAYER*} usando {*ITEM*} + + + {*PLAYER*} tentou nadar na lava para escapar de {*SOURCE*} + + + {*PLAYER*} se afogou tentando escapar de {*SOURCE*} + + + {*PLAYER*} pisou em um cacto enquanto tentava fugir de {*SOURCE*} + + + Montar + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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ê. + + + + + Depois de domados, aparecerão Corações de Amor em volta deles e eles não vão mais tentar derrubar ninguém. + + + + + Tente cavalgar o cavalo agora. Use {*CONTROLLER_ACTION_USE*} sem itens ou ferramentas na mão para montar em cima dele. + + + + + 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. + + + + + 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. + + + + + 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. + + + + No topo dessa pirâmide há um Sinalizador desativado. + + + + Essa é a interface do Sinalizador, que você pode usar para selecionar poderes que o Sinalizador concede. + + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione {*CONTROLLER_VK_B*} se você já souber como usar a interface do Sinalizador. + + + + + 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. + + + + + 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. + + + + + Esta é a interface do inventário do cavalo. + + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione {*CONTROLLER_VK_B*} se você já souber como usar o inventário do cavalo. + + + + + O inventário do cavalo possibilita transferir ou equipar itens no seu Cavalo, Burro ou Mula. + + + + Brilho + + + Trilho + + + Duração do voo: + + + + 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. + + + + Você encontrou uma Mula. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais Cavalos, Burros e Mulas. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre Cavalos, Burros e Mulas. + + + + + Cavalos e Burros são em geral encontrados em planícies abertas. Mulas nascem do cruzamento de um Burro com um Cavalo, mas são inférteis. + + + + + Também é possível transferir itens do seu inventário para os alforjes amarrados aos Burros e às Mulas nesse menu. + + + + Você encontrou um Cavalo. + + + Você encontrou um Burro. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Sinalizadores. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre Sinalizadores. + + + + + Estrelas de Fogo de Artifício podem ser fabricadas colocando-se Pólvora e Corante na grade de fabricação. + + + + + O Corante definirá a cor da explosão da Estrela de Fogo de Artifício. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + Com isso, você pode remover o Fogo de Artifício do espaço de saída quando quiser fabricá-lo. + + + + + É possível adicionar um rastro ou um brilho usando Diamantes ou Pó de Glowstone. + + + + + 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. + + + + + 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. + + + + + Tente fabricar um Fogo de Artifício na Bancada usando uma variedade de ingredientes dos baús. + + + + + 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. + + + + + Dentro dos baús aqui há vários itens usados na criação de FOGOS DE ARTIFÍCIO! + + + + + {*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. + + + + + Para fabricar um Fogo de Artifício, coloque Pólvora e Papel na grade de fabricação 3x3 que é exibida sobre seu inventário. + + + + Essa sala contém Funis + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Funis. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre os Funis. + + + + + Funis são usados para inserir ou remover itens de recipientes e para pegar automaticamente os itens jogados neles. + + + + + 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. + + + + + 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. + + + + + Tente usar o Sinalizador para configurar o poder concedido, é possível usar as Barras de Ferro fornecidas como o pagamento necessário. + + + + + Eles podem afetar Barracas de Poções, Baús, Distribuidores, Liberadores, Carrinhos com Baús, Carrinhos com Funis, bem como outros Funis. + + + + + Há vários estilos de Funis para você ver e experimentar nessa sala. + + + + + 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. + + + + + {*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. + + + + + 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. + + + + + No entanto, se um Funil for acionado por Redstone ele vai ficar inativo e vai parar de sugar e inserir itens. + + + + + 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. + + + + Esses inimigos podem ser encontrados em pântanos e atacam você lançando Poções. Eles derrubam Poções depois de morrer. + + + O número máximo de pinturas/quadros de itens foi alcançado. + + + Você não pode gerar inimigos no Modo Pacífico. + + + 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. + + + 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. + + + 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. + + + Este animal não pode entrar em Modo Amor. O número máximo de lobos foi alcançado. + + + O número máximo de Cabeças de multidão no mundo foi alcançado. + + + Inverter + + + Canhoto + + + Este animal não pode entrar em Modo Amor. O número máximo de frangos foi alcançado. + + + Este animal não pode entrar em Modo Amor. O número máximo de vacogumelos foi alcançado. + + + O número máximo de barcos em um mundo foi alcançado. + + + 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. {*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*} @@ -4826,9 +2410,61 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Reiniciar Submundo + + %s entrou no Final + + + %s saiu do Final + + + {*C3*}Vejo o jogador ao qual você se refere.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. Tome cuidado. Ele está em um nível superior agora. Ele pode ler nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Mas isso não importa. Acho que faz parte do jogo.{*EF*}{*B*}{*B*} +{*C3*}Gosto desse jogador. Ele jogou bem. Não desistiu.{*EF*}{*B*}{*B*} +{*C2*}Está lendo nossos pensamentos como se fossem palavras em uma tela.{*EF*}{*B*}{*B*} +{*C3*}É como ele escolhe imaginar muitas coisas, quando vai fundo em um jogo.{*EF*}{*B*}{*B*} +{*C2*}As palavras formam uma interface maravilhosa. Muito flexível. E menos aterrorizante que a realidade por trás da tela.{*EF*}{*B*}{*B*} +{*C3*}Eles costumavam ouvir vozes. Antes 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*} + Tem certeza de que quer redefinir o Submundo para o estado padrão neste jogo salvo? Você perderá tudo o que construiu no Submundo! + + 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. + + + Não é possível usar o Ovo de Criação no momento. O número máximo de vacogumelos foi alcançado. + + + 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. + Reiniciar Submundo @@ -4836,113 +2472,11 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Não redefinir Submundo - Não é possível cortar este Vacogumelo no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. - - - Não é possível usar o Ovo de Criação no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. - - - Não é possível usar o Ovo de Criação no momento. O número máximo de vacogumelos foi alcançado. - - - 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. - - - 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. - - - 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. - - - Não é possível usar o Ovo de Criação no momento. O número máximo de inimigos no mundo já foi alcançado. - - - Não é possível usar o Ovo de Criação no momento. O número máximo de aldeões no mundo já foi alcançado. - - - O número máximo de pinturas/quadros de itens foi alcançado. - - - Você não pode gerar inimigos no Modo Pacífico. - - - 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. - - - Este animal não pode entrar em Modo Amor. O número máximo de lobos foi alcançado. - - - Este animal não pode entrar em Modo Amor. O número máximo de frangos foi alcançado. - - - Este animal não pode entrar em Modo Amor. O número máximo de vacogumelos foi alcançado. - - - O número máximo de barcos em um mundo foi alcançado. - - - O número máximo de Cabeças de multidão no mundo foi alcançado. - - - Inverter - - - Canhoto + Não é possível cortar este Vacogumelo no momento. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos foi alcançado. Morreu! - - Renascer - - - Ofertas de conteúdo oferecido para download - - - Alterar Capa - - - Como Jogar - - - Controles - - - Configurações - - - Créditos - - - Reinstalar Conteúdo - - - Configurações de Depuração - - - Fogo Espalha - - - TNT Explode - - - Jogador x Jogador - - - Confiar nos Jogadores - - - Privilégios do Host - - - Gerar Estruturas - - - Mundo Superplano - - - Baú de Bônus - Opções de Mundo @@ -4952,18 +2486,18 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Pode Usar Portas e Acionadores + + Gerar Estruturas + + + Mundo Superplano + + + Baú de Bônus + Pode Abrir Recipientes - - Pode Atacar Jogadores - - - Pode Atacar Animais - - - Moderador - Expulsar @@ -4973,185 +2507,308 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Desabilitar Exaustão + + Pode Atacar Jogadores + + + Pode Atacar Animais + + + Moderador + + + Privilégios do Host + + + Como Jogar + + + Controles + + + Configurações + + + Renascer + + + Ofertas de conteúdo oferecido para download + + + Alterar Capa + + + Créditos + + + TNT Explode + + + Jogador x Jogador + + + Confiar nos Jogadores + + + Reinstalar Conteúdo + + + Configurações de Depuração + + + Fogo Espalha + + + Dragão Ender + + + {*PLAYER*} foi morto pelo sopro do Dragão Ender + + + {*PLAYER*} foi assassinado por {*SOURCE*} + + + {*PLAYER*} foi assassinado por {*SOURCE*} + + + {*PLAYER*} morreu + + + {*PLAYER*} explodiu + + + {*PLAYER*} foi morto por magia + + + {*PLAYER*} levou um tiro de {*SOURCE*} + + + Neblina Base + + + Exibir HUD + + + Exibir Mão + + + {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + + + {*PLAYER*} foi esmurrado por {*SOURCE*} + + + {*PLAYER*} foi morto por {*SOURCE*} usando magia + + + {*PLAYER*} caiu para fora do mundo + + + Pacotes de texturas + + + Pacotes de combinações + + + {*PLAYER*} incendiou-se + + + Temas + + + Imagens do jogador + + + Itens de avatar + + + {*PLAYER*} queimou até a morte + + + {*PLAYER*} morreu de fome + + + {*PLAYER*} foi espetado até a morte + + + {*PLAYER*} atingiu o chão com muita força + + + {*PLAYER*} tentou nadar na lava + + + {*PLAYER*} asfixiou-se em uma parede + + + {*PLAYER*} afogou-se + + + Mensagens de Morte + + + Você não é mais um moderador + + + Agora você pode voar + + + Você não pode mais voar + + + Você não pode mais atacar animais + + + Agora você pode atacar animais + + + Agora você é um moderador + + + Você não vai mais ficar cansado + + + Agora você é invulnerável + + + Você não é mais invulnerável + + + %d MSP + + + Agora você vai ficar cansado + + + Agora você é invisível + + + Você não é mais invisível + + + Agora você pode atacar jogadores + + + Agora você pode minerar e usar itens + + + Você não pode mais colocar blocos + + + Agora você pode colocar blocos + + + Personagem Animado + + + Anim. capa personalizada + + + Você não pode mais minerar nem usar itens + + + Agora você pode usar portas e acionadores + + + Você não pode mais atacar multidões + + + Agora você pode atacar multidões + + + Você não pode mais atacar jogadores + + + Você não pode mais usar portas e acionadores + + + Agora você pode usar recipientes (por exemplo, baús) + + + Você não pode mais usar recipientes (por exemplo, baús) + Invisível - - Opções do Host + + Sinalizadores - - Jogadores/Convidar + + {*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*} + - - Jogo online + + Fogos de Artifício - - Só convidados + + Idiomas - - Mais Opções + + Cavalos - - Carregar + + {*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*} + - - Novo mundo + + {*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. + - - Nome do Mundo + + {*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. + - - Semente para Criação de Mundo + + Ao ser usado, ele se torna um mapa da parte do mundo onde você está, sendo preenchido conforme você explora. - - Deixar em branco para semente aleatória + + É derrubada pelo Wither e usado na fabricação de Faróis. - - Jogadores + + Funis - - Entrar no Jogo + + {*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*} + - - Iniciar jogo + + Liberadores - - Nenhum Jogo Encontrado - - - Jogar - - - Placares de Líderes - - - Ajuda e Opções - - - Desbloquear jogo completo - - - Continuar Jogo - - - Salvar Jogo - - - Dificuldade: - - - Tipo de Jogo: - - - Estruturas: - - - Tipo de Nível: - - - JxJ: - - - Confiar Jogadores: - - - TNT: - - - Fogo Espalha: - - - Reinstalar Tema - - - Reinstalar Imagem do Jogador 1 - - - Reinstalar Imagem do Jogador 2 - - - Reinstalar Item de Avatar 1 - - - Reinstalar Item de Avatar 2 - - - Reinstalar Item de Avatar 3 - - - Opções - - - Áudio - - - Controle - - - Gráficos - - - Interface do Usuário - - - Restaurar Padrões - - - Exibição de oscilação - - - Dicas - - - Dicas: Ferramentas do Jogo - - - Dividir Tela para 2 Jogadores - - - Concluído - - - Editar mensagem da placa: - - - Preencha os detalhes que acompanharão sua captura de tela - - - Legenda - - - Captura de tela do jogo - - - Editar mensagem da placa: - - - Texturas, ícones e interface do usuário clássicos do Minecraft! - - - Exibir todos os Mundos de Combinações - - - Sem efeitos - - - Rapidez - - - Lentidão - - - Pressa - - - Fadiga do Minerador - - - Força - - - Fraqueza + + NÃO USADO Saúde Imediata @@ -5162,62 +2819,3324 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Salto Turbinado + + Fadiga do Minerador + + + Força + + + Fraqueza + Náuseas + + NÃO USADO + + + NÃO USADO + + + NÃO USADO + Regeneração Resistência - - Resistência ao Fogo + + Procurando Semente para Criação de Mundo - - Respirar na Água + + 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. - - Invisibilidade + + Um tipo de trilho que pode ativar ou desativar os Carrinhos de Minas com Funil e ativar os Carrinhos de Minas com TNT. - - Cegueira + + Usado para pegar e soltar itens, ou inserir itens em outros recipientes, quando recebe uma carga de Redstone. - - Visão Noturna + + Blocos coloridos fabricados usando argila endurecida tingida. - - Fome + + Fornece uma carga de Redstone. A carga será mais forte se houver mais itens na chapa. Requer mais peso do que a chapa leve. + + + Usado como uma fonte de energia de Redstone. Pode voltar a se tornar Redstone. + + + Usado para pegar itens ou transferi-los para dentro e fora de recipientes. + + + Pode virar alimento de Cavalos, Burros ou Mulas para curá-los com até 10 Corações. Acelera o crescimento de potros. + + + Morcego + + + Essas criaturas voadoras são encontradas em cavernas e outros espaços grandes e recônditos. + + + Bruxa + + + Criada pela fusão de Argila em uma fornalha. + + + Fabricado com cristal e corante. + + + Fabricado com Cristal Tingido + + + Fornece uma carga de Redstone. A carga será mais forte se houver mais itens na chapa. + + + É um bloco que emite um sinal de Redstone baseado na luz solar (ou falta de luz solar). + + + É um tipo especial de Carrinho de minas que funciona quase igual ao Funil. Ele coleta itens deixados em trilhos e de recipientes. + + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 5 de Armadura. + + + Usada para determinar as cores, efeitos e formatos de um Fogo de Artifício. + + + Usado em circuitos de Redstone para manter, comparar ou subtrair a intensidade do sinal, ou para medir certos estados de bloco. + + + É um tipo de carrinho de minas que atua como um bloco de TNT. + + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 7 de Armadura. + + + Usado para executar comandos. + + + Projeta um raio de luz no céu e pode fornecer Efeitos de Status a jogadores próximos. + + + 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. + + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 11 de Armadura. + + + Usado para laçar multidões ao jogador ou em postes de Cerca. + + + Usado para nomear as multidões no mundo. + + + Pressa + + + Desbloquear jogo completo + + + Continuar Jogo + + + Salvar Jogo + + + Jogar + + + Placares de Líderes + + + Ajuda e Opções + + + Dificuldade: + + + JxJ: + + + Confiar Jogadores: + + + TNT: + + + Tipo de Jogo: + + + Estruturas: + + + Tipo de Nível: + + + Nenhum Jogo Encontrado + + + Só convidados + + + Mais Opções + + + Carregar + + + Opções do Host + + + Jogadores/Convidar + + + Jogo online + + + Novo mundo + + + Jogadores + + + Entrar no Jogo + + + Iniciar jogo + + + Nome do Mundo + + + Semente para Criação de Mundo + + + Deixar em branco para semente aleatória + + + Fogo Espalha: + + + Editar mensagem da placa: + + + Preencha os detalhes que acompanharão sua captura de tela + + + Legenda + + + Dicas: Ferramentas do Jogo + + + Dividir Tela para 2 Jogadores + + + Concluído + + + Captura de tela do jogo + + + Sem efeitos + + + Rapidez + + + Lentidão + + + Editar mensagem da placa: + + + Texturas, ícones e interface do usuário clássicos do Minecraft! + + + Exibir todos os Mundos de Combinações + + + Dicas + + + Reinstalar Item de Avatar 1 + + + Reinstalar Item de Avatar 2 + + + Reinstalar Item de Avatar 3 + + + Reinstalar Tema + + + Reinstalar Imagem do Jogador 1 + + + Reinstalar Imagem do Jogador 2 + + + Opções + + + Interface do Usuário + + + Restaurar Padrões + + + Exibição de oscilação + + + Áudio + + + Controle + + + Gráficos + + + Usada para fazer poções. É derrubada pelos Ghasts, quando eles morrem. + + + É derrubada pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. Usada como ingrediente para fazer poções. + + + Usada para fazer poções. Pode ser encontrada naturalmente nas Fortalezas do Submundo. Também pode ser plantada na Areia Movediça. + + + É 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. + + + Pode ser usado como decoração. + + + Usada para fazer poções e para localizar Fortalezas. É derrubada pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. + + + Quando usada, pode ter vários efeitos, dependendo de onde for utilizada. + + + Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. + + + Usado para fazer poções. + + + Usada para fazer Poções e Poções de Lançamento. + + + Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. + + + Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. + + + Usado para fazer poções, especialmente para criar poções com efeito negativo. + + + Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. + + + Semelhante a uma porta, mas usado principalmente com cercas. + + + Pode ser fabricado com Fatias de Melão. + + + Blocos transparentes que podem ser usados no lugar dos blocos de vidro. + + + 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. + + + Feitos com pedra, geralmente encontrados em Fortalezas. + + + Usadas como barreiras semelhantes às cercas. + + + Podem ser plantadas para cultivar abóboras. + + + Pode ser usada para construção e decoração. + + + Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. + + + Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. + + + Podem ser plantadas para cultivar melõ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. + + + Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construçã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. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. + + + Quando carregada, ela emite luz. + + + É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. + + + Quando lançado pode gerar uma criatura do tipo indicado. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Pode ser cultivado para coletar grãos de cacau. + + + Vaca + + + Solta couro quando morta. Pode ser ordenhada com um balde. + + + Ovelha + + + As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. + + + Lula + + + Solta sacos de tinta quando morta. + + + Útil para pôr fogo nas coisas, ou para começar incêndios quando disparada de um Distribuidor. + + + Flutua na água e permite andar em cima. + + + Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. + + + Usada em Fortalezas do Submundo. + + + Quando atirado, mostrará a direção para um Portal Final. Quando doze deles forem colocados nas estruturas do Portal Final, o Portal Final será ativado. + + + Usado para fazer poções. + + + Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. + + + Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. + + + Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. + + + Este bloco é criado ao derrotar o Dragão no Final. + + + Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. + + + 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 + + + Modo Criativo + + + Opções de Host e Jogador + + + {*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ê. + + + + {*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*} + + + + Causa mais danos que à mão. + + + Usada para cavar terra, grama, areia, cascalho e neve mais rápido que à mão. As pás são necessárias para cavar bolas de neve. + + + Correr + + + Novidades + + + {*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*} + + + + Compartilhando Capturas de Tela + + + Baús + + + Fabricação + + + Fornalha + + + Noções Básicas + + + 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! + + + No futuro haverá uma atualização deste jogo! + + + Se colocar dois baús lado a lado você terá um baú grande. + + + Tome cuidado ao construir estruturas feitas de lã ao ar livre, pois relâmpagos de tempestades podem incendiar a lã. + + + Um único balde de lava pode ser usado em uma fornalha para fundir 100 blocos. + + + O instrumento tocado por um bloco de nota depende do material abaixo dele. + + + A lava poderá demorar alguns minutos para desaparecer COMPLETAMENTE quando o bloco de origem for removido. + + + O pedregulho é resistente às bolas de fogo do Ghast, o que o torna útil para proteger portais. + + + Blocos que podem ser usados como fonte de luz derretem neve e gelo. Eles incluem tochas, glowstone e lanternas de abóbora. + + + Zumbis e esqueletos poderão sobreviver à luz do dia se estiverem na água. + + + As galinhas põem ovos a cada 5 ou 10 minutos. + + + A obsidiana só pode ser extraída com uma picareta de diamante. + + + Os Creepers são a fonte de pólvora mais fácil de se obter. + + + Se você atacar um lobo, todos os lobos da vizinhança ficarão hostis e o atacarão. Isso também acontece com os homens-porco zumbis. + + + Os lobos não podem entrar no Submundo. + + + Os lobos não atacam os Creepers. + + + Necessária para extrair blocos relacionados a pedra e minério. + + + Usado na receita de bolo, como ingrediente para fazer poções. + + + Usada para enviar uma carga elétrica ao ser ligada ou desligada. Fica na posição ligada ou desligada até ser apertada novamente. + + + 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. + + + Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. + + + Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criada com uma Maçã e Pepitas de Ouro. + + + Restaura 2{*ICON_SHANK_01*}. Comê-la pode envenenar você. + + + Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. + + + Usado para guiar carrinhos de minas. + + + Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. + + + Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. + + + Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. + + + Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. + + + Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. + + + Restaura 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru na fornalha. + + + Restaura 1{*ICON_SHANK_01*}. + + + Restaura 1{*ICON_SHANK_01*}. + + + Restaura 3{*ICON_SHANK_01*}. + + + Usada como munição para arcos. + + + Restaura 2,5{*ICON_SHANK_01*}. + + + Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. + + + Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Comê-la pode envenenar você. + + + Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + + Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar uma costeleta de porco crua na fornalha. + + + Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser dado para o Ocelote comer, para torná-lo amigável. + + + Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar frango cru na fornalha. + + + Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + + Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar carne crua na fornalha. + + + Usado para transportar você, um animal ou um monstro sobre trilhos. + + + Usado como corante para criar lã azul-clara. + + + Usado como corante para criar lã ciano. + + + Usado como corante para criar lã roxa. + + + Usado como corante para criar lã verde-lima. + + + Usado como corante para criar lã cinza. + + + 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. + + + Usada para iluminar mais que tochas. Derrete neve/gelo e pode ser usada embaixo d'água. + + + Usado para criar livros e mapas. + + + Pode ser usado para criar Estantes ou enfeitiçado para fazer Livros Encantados. + + + Usado como corante para criar lã azul. + + + Toca discos de música. + + + Usado para criar ferramentas, armas ou armaduras muito fortes. + + + Usado como corante para criar lã laranja. + + + Coletada das ovelhas, pode ser tingida com corantes. + + + 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. + + + Usado como corante para criar lã preta. + + + Usado para transportar mercadorias sobre trilhos. + + + Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. + + + Usado para viajar pela água mais rapidamente do que nadando. + + + Usado como corante para criar lã verde. + + + Usada como corante para criar lã vermelha. + + + Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. + + + Usado como corante para criar lã rosa. + + + Usado como corante para criar lã marrom, como ingrediente para biscoitos ou para criar cápsulas de cacau. + + + Usado como corante para criar lã prateada. + + + Usado como corante para criar lã amarela. + + + Permite ataques à distância usando flechas. + + + Dá ao usuário 5 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 5 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. + + + Permite fabricar barras, pedras preciosas ou corantes em blocos posicionáveis. Pode ser usado como um bloco caro de construção ou para armazenamento compacto do minério. + + + 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. + + + Dá ao usuário 8 de Armadura quando usado. + + + Dá ao usuário 6 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Dá ao usuário 6 de Armadura quando usado. + + + Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Usado para cortar blocos relacionados à madeira mais rápido que à mão. + + + Usada para trabalhar blocos de terra e grama para preparar para plantação. + + + Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 4 de Armadura quando usado. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 5 de Armadura quando usado. + + + Usada para obter escadas compactas. + + + Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. + + + Usado para guardar e transportar água, lava e leite. + + + Usado para armazenar e transportar água. + + + Mostra o texto digitado por você ou por outros jogadores. + + + Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + + + Usado para causar explosões. Ativado após a colocação com ignição por Sílex e Aço ou com carga elétrica. + + + Usado para armazenar e transportar lava. + + + Mostra as posições do sol e da lua. + + + Aponta para seu ponto inicial. + + + Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. + + + Usado para armazenar e transportar leite. + + + Usado para criar fogo, detonar TNT e abrir um portal depois de construído. + + + Usada para pegar peixes. + + + 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. + + + Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. + + + Usado como material de construção. Não sofre ação da gravidade como a areia normal. + + + Usado como material de construção. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Usada para iluminar. As tochas também derretem neve e gelo. + + + Usada para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. + + + Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. + + + 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. + + + Usada para escalar verticalmente. + + + 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ã. + + + Permite fabricar maior variedade de itens que a fabricação normal. + + + Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. + + + Machado de Ferro + + + Lâmpada de Redstone + + + Escada: madeira de floresta + + + Escada de Bétula + + + Controles Atuais + + + Caveira + + + Cacau + + + Escada de Abeto + + + Ovo de Dragão + + + Pedra Final + + + Estrutura do Portal Final + + + Escada de Arenito + + + Samambaia + + + Arbusto + + + Estilo + + + Fabricação + + + Usar + + + Ação + + + Esgueirar-se/Voar Abaixo + + + Esgueirar-se + + + Soltar + + + Rodízio de Itens + + + Pausar + + + Olhar + + + Mover/Correr + + + Inventário + + + Pular/Voar Acima + + + Pular + + + Portal Final + + + Broto de Abóbora + + + Melão + + + Painel de Vidro + + + Portão de Cerca + + + Vinhas + + + Broto de Melão + + + Barras de Ferro + + + Blocos de Pedra Rachada + + + Blocos de Pedra com Musgo + + + Blocos de Pedra + + + Cogumelo + + + Cogumelo + + + Tijolos de pedra cinzentos + + + Escadas de Blocos + + + Verruga do Submundo + + + Escadas: Blocos Submundo + + + Cerca: Blocos Submundo + + + Caldeirão + + + Barraca de Poções + + + Bancada de Feitiços + + + Bloco do Submundo + + + Pedregulho de Traça + + + Pedra Traça + + + Escadas: Blocos de Pedra + + + Vitória-Régia + + + Micélio + + + Bloco de pedra de Traça + + + Alterar Modo Câmera + + + 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. + + + 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. + + + Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} + Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + + + A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} + + + 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*} + + + 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. + + + Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. + + + 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. + + + Use{*CONTROLLER_ACTION_MOVE*} para se mover. + + + Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. + + + 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. + + + 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{*CONTROLLER_ACTION_JUMP*} para pular. + + + Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} + + + +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. + + + + Abrir o recipiente + + + 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*} + + + Use a picareta para extrair alguns blocos de pedra. Blocos de pedra produzem pedregulho quando extraídos. Se coletar 8 blocos de pedregulho poderá construir uma fornalha. Talvez seja necessário cavar a terra para chegar à pedra. Então, use a pá para isso.{*StoneIcon*} + + + +Você 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. + + + + +Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. + + + + 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*} + + + 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. + + + Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. + + + 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*} + + + 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*} + + + Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. + + + Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Estilo 1 + + + Movimento (Ao Voar) + + + Jogadores/Convidar + + + + + + Estilo 3 + + + Estilo 2 + + + + + + + + + + + + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + + + + + + + + + + + + + + + + + + + + + + + + + + + Bloco Traça + + + Degrau de Pedra + + + Um modo compacto de armazenar Ferro. + + + Bloco de Ferro + + + Degrau de Carvalho + + + Degrau de Arenito + + + Degrau de Pedra + + + Um modo compacto de armazenar Ouro. + + + Flor + + + Lã Branca + + + Lã Laranja + + + Bloco de Ouro + + + Cogumelo + + + Rosa + + + Degrau de Pedregulho + + + Estante de Livros + + + TNT + + + Tijolos + + + Tocha + + + Obsidiana + + + Pedra de Musgo + + + Degrau: Bloco Submundo + + + Degrau de Carvalho + + + Degrau Bloc.Pedra + + + Degrau de Tijolo + + + Chapa madeira florestal + + + Degrau de Bétula + + + Degrau de Abeto + + + Lã Magenta + + + Folhas de Bétula + + + Folhas de Abeto + + + Folhas de Carvalho + + + Vidro + + + Esponja + + + Folhas de floresta + + + Folhas + + + Carvalho + + + Abeto + + + Bétula + + + Madeira de Abeto + + + Madeira de Bétula + + + Madeira de floresta + + + + + + Lã Rosa + + + Lã Cinza + + + Lã Cinzenta + + + Lã Azul-clara + + + Lã Amarela + + + Lã Verde-lima + + + Lã Ciano + + + Lã Verde + + + Lã Vermelha + + + Lã Preta + + + Lã Roxa + + + Lã Azul + + + Lã Marrom + + + Tocha (Carvão) + + + Glowstone + + + Areia Movediça + + + Pedra Inflamável + + + Bloco Lápis-azul + + + Minério de Lápis-azul + + + Portal + + + Lanterna de Abóbora + + + Cana-de-açúcar + + + Argila + + + Cacto + + + Abóbora + + + Cerca + + + Jukebox + + + Um modo compacto de armazenar Lápis-azul. + + + Alçapão + + + Baú Trancado + + + Diodo + + + Pistão Aderente + + + Pistão + + + Lã (qualquer cor) + + + Arbusto Seco + + + Bolo + + + Bloco de Nota + + + Distribuidor + + + Grama Alta + + + Teia + + + Cama + + + Gelo + + + Bancada + + + Um modo compacto de armazenar Diamantes. + + + Bloco de Diamante + + + Fornalha + + + Campo + + + Colheitas + + + Minério de Diamante + + + Criador de Monstros + + + Fogo + + + Tocha (Carvão Vegetal) + + + Pó de Redstone + + + Baú + + + Escada de Carvalho + + + Placa + + + Minério de Redstone + + + Porta de Ferro + + + Chapa de Pressão + + + Neve + + + Botão + + + Tocha de Redstone + + + Alavanca + + + Trilho + + + Escada de Mão + + + Porta de Madeira + + + Escadas de Pedra + + + Trilho Detector + + + Trilho com Propulsão + + + Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. + + + Vara de Pescar + + + Relógio + + + Pó de Glowstone + + + Carrinho com Fornalha + + + Ovo + + + Bússola + + + Peixe Cru + + + Rosa Vermelha + + + Verde Cacto + + + Grãos de Cacau + + + Peixe Cozido + + + Corante em Pó + + + Saco de Tinta + + + Carrinho com Baú + + + Bola de Neve + + + Barco + + + Couro + + + Carrinho de Minas + + + Sela + + + Redstone + + + Balde de Leite + + + Papel + + + Livro + + + Slimeball + + + Tijolo + + + Argila + + + Cana-de-açúcar + + + Lápis-azul + + + Mapa + + + Disco - "13" + + + Disco de Música - "cat" + + + Cama + + + Repetidor de Redstone + + + Biscoito + + + Disco de Música - "blocks" + + + Disco de Música - "mellohi" + + + Disco de Música - "stal" + + + Disco de Música - "strad" + + + Disco de Música - "chirp" + + + Disco de Música - "far" + + + Disco de Música - "mall" + + + Bolo + + + Corante Cinza + + + Corante Rosa + + + Corante Verde-lima + + + Corante Roxo + + + Corante Ciano + + + Corante Cinzento + + + Amarelo-narciso + + + Farelo de Osso + + + Osso + + + Açúcar + + + Corante Azul-claro + + + Corante Magenta + + + Corante Laranja + + + Placa + + + Túnica de Couro + + + Peitoral de Ferro + + + Peitoral de Diamante + + + Capacete de Ferro + + + Capacete de Diamante + + + Capacete de Ouro + + + Peitoral de Ouro + + + Perneiras de Ouro + + + Botas de Couro + + + Botas de Ferro + + + Calças de Couro + + + Perneiras de Ferro + + + Perneiras de Diamante + + + Chapéu de Couro + + + Enxada de Pedra + + + Enxada de Ferro + + + Enxada de Diamante + + + Machado de Diamante + + + Machado de Ouro + + + Enxada de Madeira + + + Enxada de Ouro + + + Peitoral de Malha + + + Perneiras de Malha + + + Botas de Malha + + + Porta de Madeira + + + Porta de Ferro + + + Capacete de Malha + + + Botas de Diamante + + + Pena + + + Pólvora + + + Sementes de Trigo + + + Vasilha + + + Sopa de Cogumelo + + + Fio + + + Trigo + + + Costeleta de Porco Cozida + + + Pintura + + + Maçã de Ouro + + + Pão + + + Sílex + + + Costeleta de Porco Crua + + + Vareta + + + Balde + + + Balde de Água + + + Balde de Lava + + + Botas de Ouro + + + Barra de Ferro + + + Barra de Ouro + + + Sílex e Aço + + + Carvão + + + Carvão Vegetal + + + Diamante + + + Maçã + + + Arco + + + Flecha + + + Disco de Música - "ward" + + + + 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*} + + + + + 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*} + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + A madeira que você coletou pode ser usada para fabricar tábuas. Selecione o ícone de tábuas e pressione{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} + + + + Você pode fabricar uma seleção maior de itens usando uma bancada. A fabricação na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior de fabricação e uma variedade maior de itens para fabricar. + + + + +A á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. + + + + +Role pelas guias de Tipo de Grupo na parte superior usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do item que deseja fabricar. Em seguida, use{*CONTROLLER_MENU_NAVIGATE*} para selecionar o item a ser fabricado. + + + + + A lista dos ingredientes necessários para fabricar o item é exibida. + + + + + A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. + + + + + 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. + + + + + Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} + + + + Cascalho + + + Minério de Ouro + + + Minério de Ferro + + + Lava + + + Areia + + + Arenito + + + Minério de Carvão + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. + + + + + 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. + + + + + 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. + + + + Madeira + + + Madeira de Carvalho + + + + 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. + + + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário. + + + + 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 o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + + + +Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. + + + + +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. + + + + +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. + + + + + Você concluiu a primeira parte do tutorial. + + + + Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + + + Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + + + Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. + + + À 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*} + + + Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + + + 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*} + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + +Esta é a interface de fabricação. Esta interface de fabricação lhe permite combinar os itens coletados para fazer novos itens. + + + + +Pressione{*CONTROLLER_VK_B*} agora para sair do inventário do modo criativo. + + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. + + + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber fabricar. + + + + +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. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário do modo criativo. + + + + + 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. + + + + + Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. + + + + +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*}. + + + + +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. + + + + +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. + + + + Água + + + Garrafa de Vidro + + + Garrafa de Água + + + Olho de Aranha + + + Pepita de Ouro + + + Verruga do Submundo + + + {*prefix*}Poção {*postfix*} {*splash*} + + + Olho Aranha Ferm. + + + Caldeirão + + + Olho de Ender + + + Melão Cintilante + + + Pó de Chamas + + + Creme de Magma + + + Barraca de Poções + + + Lágrima de Ghast + + + Sementes de Abóbora + + + Sementes de Melão + + + Frango Cru + + + Disco - "11" + + + Disco de Música - "where are we now" + + + Tosquiadeira + + + Frango Cozido + + + Pérola do Ender + + + Fatia de Melão + + + Vara de Chamas + + + Carne Crua + + + Bife + + + Carne Podre + + + Garrafa de Feitiços + + + Tábuas de Carvalho + + + Tábuas de Abeto + + + Tábuas de Bétula + + + Bloco de Grama + + + Terra + + + Pedregulho + + + Tábuas da Selva + + + Muda de Bétula + + + Broto de árvore da floresta + + + Pedra Indestrutível + + + Muda + + + Muda de Carvalho + + + Muda de Abeto + + + Pedra + + + Quadro de Item + + + Criar {*CREATURE*} + + + Bloco do Submundo + + + Carga de Fogo + + + Carga Fogo: Carv. Veg. + + + Carga Fogo: Carvão + + + Caveira + + + Cabeça + + + Cabeça de %s + + + Cabeça de creeper + + + Caveira do esqueleto + + + Caveira do esqueleto murcho + + + Cabeça de zumbi + + + 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 Lentidão + + + de Pressa + + + de Fraqueza + + + de Força + + + Resistência ao Fogo + + + Saturação + de Resistência - - de Resistência ao Fogo + + de Salto - - de Respirar na Água + + Wither - - de Invisibilidade + + Impulso de Energia - - de Cegueira - - - de Visão Noturna - - - de Fome - - - de Veneno + + Absorção @@ -5258,9 +6186,78 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? III + + de Invisibilidade + IV + + de Respirar na Água + + + de Resistência ao Fogo + + + de Visão Noturna + + + de Veneno + + + de Fome + + + da Absorção + + + da Saturação + + + do Impulso de Energia + + + de Cegueira + + + da Decadência + + + Sem Artifícios + + + Fina + + + Difusa + + + Limpa + + + Leitosa + + + Maligna + + + Amanteigada + + + Suave + + + Desajeitada + + + Plana + + + Grande + + + Tranquila + De Lançamento @@ -5270,50 +6267,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Desinteressante - - Tranquila + + Ousada - - Limpa + + Cordial - - Leitosa - - - Difusa - - - Sem Artifícios - - - Fina - - - Maligna - - - Plana - - - Grande - - - Desajeitada - - - Amanteigada - - - Suave - - - Suave - - - Sofisticada - - - Grossa + + Charmosa Elegante @@ -5321,149 +6282,152 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Chique - - Charmosa - - - Ousada - - - Refinada - - - Cordial - Cintilante - - Potente - - - Desagradável - - - Inodora - Classificação Severa + + Inodora + + + Potente + + + Desagradável + + + Suave + + + Refinada + + + Grossa + + + Sofisticada + + + Restaura a saúde dos jogadores, animais e monstros afetados com o tempo. + + + Reduz imediatamente a saúde dos jogadores, animais e monstros afetados. + + + 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. + 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. + + + Usada como base de todas as poções. Use em uma barraca de poções para criar poções. + Grosseira Fedida - - Usada como base de todas as poções. Use em uma barraca de poções para criar poções. - - - Não tem efeitos, pode ser usada em uma barraca de poções para criar poções adicionando mais ingredientes. - - - Aumenta a velocidade de movimento dos jogadores, animais e monstros afetados, e a velocidade de corrida, a extensão dos saltos e o campo de visão dos jogadores. - - - Reduz a velocidade de movimento dos jogadores, animais e monstros afetados, e a velocidade de corrida, a extensão dos saltos e o campo de visão dos jogadores. - - - Aumenta os danos causados pelos jogadores e monstros afetados durante o ataque. - - - Reduz os danos causados pelos jogadores e monstros afetados durante o ataque. - - - Aumenta imediatamente a saúde dos jogadores, animais e monstros afetados. - - - Reduz imediatamente a saúde dos jogadores, animais e monstros afetados. - - - Restaura a saúde dos jogadores, animais e monstros afetados com o tempo. - - - Torna os jogadores, animais e monstros afetados imunes a danos do fogo, lava e ataques de Chamas à distância. - - - Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. + + Atacar Nitidez - - Atacar + + Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. - - Veneno de Artrópodes + + Dano de Ataque Coice - - Aspecto de Fogo + + Veneno de Artrópodes - - Proteção + + Rapidez - - Proteção contra Fogo + + Reforços zumbis - - Queda de Pena + + Força do Salto do Cavalo - - Proteção contra Explosão + + Ao ser aplicado: - - Proteção contra Projétil + + Resistência a Coice - - Respiração + + Alcance de perseguição da multidão - - Afinidade com a Água - - - Eficiência + + Energia máxima Toque de Seda - - Inquebrável + + Eficiência - - Pilhagem + + Afinidade com a Água Sorte - - Poder + + Pilhagem - - Chama + + Inquebrável - - Soco + + Proteção contra Fogo - - Infinito + + Proteção - - I + + Aspecto de Fogo - - II + + Queda de Pena - - III + + Respiração + + + Proteção contra Projétil + + + Proteção contra Explosão IV @@ -5474,23 +6438,29 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? VI + + Soco + VII - - VIII + + III - - IX + + Chama - - X + + Poder - - Pode ser extraído com uma picareta de Ferro ou de material melhor para coletar Esmeraldas. + + Infinito - - 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. + + II + + + I É ativado quando uma entidade passa por um Detonador conectado. @@ -5501,44 +6471,59 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Um modo compacto de armazenar Esmeraldas. - - Uma parede feita de Pedregulho. + + 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. - - Pode ser usada para consertar armas, ferramentas e armadura. + + IX - - Fundido em uma fornalha para produzir Quartzo do Submundo. + + VIII - - Usado como decoração. + + Pode ser extraído com uma picareta de Ferro ou de material melhor para coletar Esmeraldas. - - Pode ser comercializada com os aldeões. - - - Usado como decoração. Flores, Mudas, Cactos e Cogumelos podem ser plantados nele. + + X Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma cenoura dourada. Pode ser plantada no campo. + + Usado como decoração. Flores, Mudas, Cactos e Cogumelos podem ser plantados nele. + + + Uma parede feita de Pedregulho. + Restaura 0,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser plantada no campo. - - Restaura 3{*ICON_SHANK_01*}. Criada ao cozinhar uma batata na fornalha. + + Fundido em uma fornalha para produzir Quartzo do Submundo. + + + Pode ser usada para consertar armas, ferramentas e armadura. + + + Pode ser comercializada com os aldeões. + + + Usado como decoração. + + + Restaura 4{*ICON_SHANK_01*}. - 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. + Restaura 1{*ICON_SHANK_01*}. Comê-la pode envenenar você. Usada para controlar um porco selado ao andar nele. - - Restaura 4{*ICON_SHANK_01*}. + + Restaura 3{*ICON_SHANK_01*}. Criada ao cozinhar uma batata na fornalha. + + + Restaura 3{*ICON_SHANK_01*}. Fabricada com uma Cenoura e Pepitas de Ouro. Usado com uma Bigorna para enfeitiçar armas, ferramentas ou armaduras. @@ -5546,6 +6531,15 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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 + + Torta de Abóbora - - Batata - - - 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 - - Custo do Feitiço: %d - Caro Demais! - - Renomear + + Custo do Feitiço: %d Você tem: - - Itens para o comércio + + Renomear {*VILLAGER_TYPE*} oferece %s - - Conserto + + Itens para o comércio Comércio - - Coleira tingida + + Conserto 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 + + + + 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,24 +6768,14 @@ 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. 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. - - - - - É possível renomear o item editando o nome mostrado na caixa de texto. @@ -5803,9 +6783,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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. - + - Nesta área há uma Bigorna e um Baú contendo ferramentas e armas para serem trabalhadas. + É possível renomear o item editando o nome mostrado na caixa de texto. @@ -5815,9 +6795,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Pressione{*CONTROLLER_VK_B*} se já souber sobre a Bigorna. - + - Ao usar uma Bigorna, armas e ferramentas podem ser consertadas para restaurar sua durabilidade, renomeadas ou enfeitiçadas com Livros Encantados. + Nesta área há uma Bigorna e um Baú contendo ferramentas e armas para serem trabalhadas. @@ -5825,29 +6805,29 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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. - + - O uso da Bigorna custa Níveis de Experiência, e ela pode ser danificada sempre que for usada. - + Ao usar uma Bigorna, armas e ferramentas podem ser consertadas para restaurar sua durabilidade, renomeadas ou enfeitiçadas com Livros Encantados. + 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. - + - A renomeação de um item muda o nome exibido para todos os jogadores e reduz de modo permanente o custo do trabalho anterior. - + O uso da Bigorna custa Níveis de Experiência, e ela pode ser danificada sempre que for usada. + No Baú desta área, você encontrará Picaretas danificadas, matérias-primas, Garrafas de Feitiços e Livros Encantados para realizar experimentos. - + - Esta é a interface de comércio que mostra as trocas que podem ser feitas com um aldeão. + A renomeação de um item muda o nome exibido para todos os jogadores e reduz de modo permanente o custo do trabalho anterior. @@ -5857,9 +6837,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Pressione{*CONTROLLER_VK_B*} se já souber sobre a interface de comércio. - + - Todas as trocas comerciais que o aldeão estiver disposto a fazer no momento serão exibidas na parte superior. + Esta é a interface de comércio que mostra as trocas que podem ser feitas com um aldeão. @@ -5867,9 +6847,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? As trocas comerciais aparecerão em vermelho e não estarão disponíveis se você não tiver os itens necessários. - + - A quantidade e o tipo de itens que você dará ao aldeão são mostrados nas duas caixas à esquerda. + Todas as trocas comerciais que o aldeão estiver disposto a fazer no momento serão exibidas na parte superior. @@ -5877,14 +6857,24 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Você pode ver o número total dos itens necessários para a troca nas duas caixas à esquerda. - + - Pressione{*CONTROLLER_VK_A*} para trocar os itens que o aldeão exige pelo item em oferta. + A quantidade e o tipo de itens que você dará ao aldeão são mostrados nas duas caixas à esquerda. Nesta área há um aldeão e um Baú contendo Papel para comprar itens. + + + + + Pressione{*CONTROLLER_VK_A*} para trocar os itens que o aldeão exige pelo item em oferta. + + + + + 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,37 +1,124 @@  - + + Deseja iniciar sessão na "PSN"? + + + 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. + + + Botão SELECT + + + 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. + + + Sistema PlayStation®Vita + + + Escolha Rede Ad Hoc para se conectar com outros sistemas PlayStation®Vita nas proximidades, ou "PSN" para se conectar com amigos do mundo inteiro. + + + Rede Ad Hoc + + + Alterar Modo de Rede + + + Selecionar Modo de Rede + + + IDs online na tela dividida + + + Troféus + + + 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. + + + 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. + + + IDs online: + + + 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. + + + + Patch 1.04 (Atualização do jogo 14) + + + IDs online no jogo + + + Vejam o que eu fiz no Minecraft: PlayStation®Vita Edition! + + + Falha no download. Tente novamente mais tarde. + + + Falha ao entrar no jogo devido a um tipo NAT restritivo. Confira sua configuração de rede. + + + Falha no upload. Tente novamente mais tarde. + + + Download concluído! + + + +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. + + + + Salvamento não concluído + + + 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. + + + Upload cancelado + + + Você cancelou o upload deste salvamento para a área de transferência de salvamentos. + + + Upload de salvamento para PS3™/PS4™ + + + Fazendo upload de dados : %d%% + + + "PSN" + + + Download dados PS3™ + + + Fazendo download de dados : %d%% + + + Salvando + + + Upload concluído! + + + Tem certeza que deseja fazer upload deste salvamento e sobrescrever o salvamento atual que está na área de transferência de salvamento? + + + Convertendo dados + + NOT USED - - Você pode usar a tela de toque no sistema PlayStation®Vita para navegar pelos menus! - - - O minecraftforum tem uma seção dedicada à PlayStation®Vita Edition. - - - Você receberá as últimas informações sobre este jogo de @4JStudios e @Kappische no twitter! - - - Não olhe nos olhos de um Enderman! - - - Acreditamos que a 4J Studios removeu Herobrine do jogo no sistema PlayStation®Vita, mas não temos certeza. - - - Minecraft: PlayStation®Vita Edition bateu muitos recordes! - - - {*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. - - - {*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. + + NOT USED {*T3*}COMO JOGAR: MODO CRIATIVO{*ETW*}{*B*}{*B*} @@ -45,32 +132,80 @@ No modo de voo, você pode manter pressionado{*CONTROLLER_ACTION_JUMP*} para se 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. - - NOT USED - - - NOT USED - "NÃO USADO" - - "NÃO USADO" - - - Convidar Amigos - 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? 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? - - Este mundo já foi salvo no Modo Criativo e terá as atualizações de troféus e de placar de líderes desabilitadas. + + "NÃO USADO" - - 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? + + Convidar Amigos + + + O minecraftforum tem uma seção dedicada à PlayStation®Vita Edition. + + + Você receberá as últimas informações sobre este jogo de @4JStudios e @Kappische no twitter! + + + NOT USED + + + Você pode usar a tela de toque no sistema PlayStation®Vita para navegar pelos menus! + + + Não olhe nos olhos de um Enderman! + + + {*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. + + + {*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. + + + Acreditamos que a 4J Studios removeu Herobrine do jogo no sistema PlayStation®Vita, mas não temos certeza. + + + Minecraft: PlayStation®Vita Edition bateu muitos recordes! + + + 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? + + + "Minecraft: PlayStation®Vita Edition" falhou ao carregar e não é possível continuar. + + + Poções + + + Você retornou à tela de título porque sua sessão da "PSN" foi finalizada. + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. A conexão com a "PSN" foi perdida. Saindo para o menu principal. @@ -78,11 +213,23 @@ No modo de voo, mantenha pressionado{*CONTROLLER_ACTION_JUMP*} para se mover par A conexão com a "PSN" foi perdida. + + Este mundo já foi salvo no Modo Criativo e terá as atualizações de troféus e de placar de líderes desabilitadas. + + + Se você criar, carregar ou salvar um mundo com os Privilégios do Host habilitados, esse mundo terá desabilitadas as atualizações de 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? + 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? + + Os jogadores convidados não podem desbloquear a versão completa do jogo. Inicie a sessão com a conta da Sony Entertainment Network. + + + ID online + 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". @@ -92,152 +239,7 @@ Deseja desbloquear a versão completa do jogo? 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? - - Os jogadores convidados não podem desbloquear a versão completa do jogo. Inicie a sessão com a conta da Sony Entertainment Network. - - - ID online - - - Poções - - - Você retornou à tela de título porque sua sessão da "PSN" foi finalizada. - - - - 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? - - - "Minecraft: PlayStation®Vita Edition" falhou ao carregar e não é possível continuar. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - IDs online na tela dividida - - - Troféus - - - IDs online: - - - IDs online no jogo - - - Vejam o que eu fiz no Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Patch 1.04 (Atualização do jogo 14) - - - Botão SELECT - - - 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. - - - Deseja iniciar sessão na "PSN"? - - - 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. - - - Sistema PlayStation®Vita - - - Alterar Modo de Rede - - - Selecionar Modo de Rede - - - Escolha Rede Ad Hoc para se conectar com outros sistemas PlayStation®Vita nas proximidades, ou "PSN" para se conectar com amigos do mundo inteiro. - - - Rede Ad Hoc - - - "PSN" - - - Download dados sistema PlayStation®3 - - - Upload de salvamento para sistema PlayStation®3/PlayStation®4 - - - Upload cancelado - - - Você cancelou o upload deste salvamento para a área de transferência de salvamentos. - - - Fazendo upload dos dados : %d%% - - - Fazendo download dos dados : %d%% - - - Tem certeza que deseja fazer upload deste salvamento e sobrescrever o salvamento atual que está na área de transferência de salvamento? - - - Convertendo dados - - - Salvando - - - Upload concluído! - - - Falha ao fazer upload. Tente novamente mais tarde. - - - Download concluído! - - - Falha ao fazer download. Tente novamente mais tarde. - - - Falha ao entrar no jogo devido a um tipo NAT restritivo. Verifique suas configurações de rede. - - - - 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. - - - - Salvamento não concluído - - - 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. + + 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. - - - Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". - - - O jogo terminou porque terminaste a sessão na "PSN". - - - - Sem sessão iniciada de momento. - - - O jogo tem algumas funcionalidades que requerem uma sessão iniciada na "PSN", mas de 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. - - - Esta funcionalidade requer uma sessão iniciada na "PSN". - - - - Ligar à "PSN". - - - Ligar à Rede Ad Hoc - - - Problema com Troféu - - - Ocorreu um problema ao aceder à tua conta Sony Entertainment Network. Não foi possível atribuir-te o troféu, neste momento. + + Falha ao guardar as definições para a tua conta Sony Entertainment Network. Problema com a conta Sony Entertainment Network - - Falha ao guardar as definições para a tua conta Sony Entertainment Network. + + Ocorreu um problema ao aceder à tua conta Sony Entertainment Network. Não foi possível atribuir-te o troféu, neste 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? + + 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. + + + Problema com Troféu + + + O jogo terminou porque terminaste a sessão na "PSN". + + + + Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". + + + O armazenamento do sistema não tem espaço livre suficiente para criar uma gravação de jogo. + + + Sem sessão iniciada de momento. + + + Ligar à "PSN". + + + Esta funcionalidade requer uma sessão iniciada na "PSN". + + + + 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,252 +1,3632 @@  - - 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. - - - {*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. - - - {*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. + + OK + + + Cancelar + + + Loja Minecraft + + + Rodar + + + Esconder + + + Limpar Todos os Espaços + + + Tens a certeza de que queres sair do jogo atual e entrar num novo jogo? Os progressos não gravados serão perdidos. + + + Tens a certeza de que queres substituir qualquer gravação anterior deste mundo pela versão atual deste mundo? + + + Tens a certeza de que queres sair sem gravar? Irás perder todo o progresso neste mundo! + + + Iniciar Jogo + + + Sair do Jogo + + + Gravar Jogo + + + Sair sem gravar + + + Prime START para jogar + + + 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 + + + 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. + + + Novo Mundo + + + Prémio Desbloqueado! + + + 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? + + + Amigos + + + A Minha Pontuação + + + Geral + + + Por favor, aguarda + + + Sem resultados + + + Filtro: + + + 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. + + + Ligação perdida + + + Perdeste a ligação ao servidor. A sair para o menu principal. + + + Desligado pelo servidor + + + A sair do jogo + + + Ocorreu um erro. A sair para o menu principal. + + + Falha na ligação + + + Foste expulso do jogo + + + O anfitrião saiu do jogo. + + + Não podes juntar-te a este jogo porque não és amigo de nenhum dos participantes. + + + Não podes juntar-te a este jogo porque foste expulso pelo anfitrião anteriormente. + + + Foste expulso do jogo por voares + + + A tentativa de ligação excedeu o tempo + + + O servidor está cheio + + + 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! + + + Temas + + + Pack de Skins + + + Permitir amigos de amigos + + + Expulsar Jogador + + + Tens a certeza de que queres expulsar este jogador do jogo? Ele não poderá voltar a juntar-se até reiniciares o mundo. + + + Packs de Imagens de Jogador + + + Não podes juntar-te a este jogo porque está limitado a amigos do anfitrião. + + + Conteúdo Transferível Corrompido + + + 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. + + + 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. + + + Impossível Juntares-te ao Jogo + + + Selecionado + + + Skin selecionada: + + + Obtém a Versão Completa + + + Desbloquear Pack de Texturas + + + Para usares este pack de texturas no teu mundo, precisas de desbloqueá-lo. +Queres desbloqueá-lo agora? + + + Pack de Texturas de Avaliação + + + Semear + + + Desbloquear Pack de Skins + + + Para utilizares a skin selecionada, tens de desbloquear este pack de skins. +Queres desbloquear agora este pack de skins? + + + 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? + + + Transferir Versão Completa + + + 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? + + + Obtém a Versão de Avaliação + + + Pack de Texturas Não Disponível + + + Desbloquear Versão Completa + + + Transferir Versão de Avaliação + + + O teu modo de jogo foi alterado + + + Quando ativada, só os jogadores convidados podem juntar-se. + + + Quando ativada, amigos de pessoas na tua Lista de Amigos podem juntar-se. + + + Quando ativada, os jogadores podem infligir danos aos outros jogadores. Afeta apenas o modo de Sobrevivência. + + + Normal + + + Superplano + + + Quando ativada, o jogo ficará online. + + + Quando desativada, os jogadores que se juntaram ao jogo não podem construir ou escavar, até receberem autorização. + + + Quando ativada, são geradas estruturas como Aldeias e Fortalezas no mundo. + + + Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo. + + + Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. + + + Quando ativada, o fogo pode propagar-se aos blocos inflamáveis mais próximos. + + + Quando ativada, o TNT explode ao ser acionado. + + + Quando ativada, o Submundo será regenerado. É útil se tiveres um ficheiro mais antigo em que não existissem Fortalezas do Submundo. + + + Desligado + + + Modo Jogo: Criativo + + + Sobrevivência + + + Criativo + + + Muda o Nome do Teu Mundo + + + Introduz o novo nome para o teu mundo + + + Modo Jogo: Sobrevivência + + + Criado no Modo Sobrevivência + + + Mudar o Nome + + + A gravar automaticamente em %d... + + + Ligado + + + Criado no Modo Criativo + + + Compor Nuvens + + + O que queres fazer com esta gravação de jogo? + + + Tamanho de HUD (Ecrã Dividido) + + + Ingrediente + + + Combustível + + + Distribuidor + + + Baú + + + Encantar + + + Fornalha + + + De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. + + + Tens a certeza de que queres eliminar este jogo gravado? + + + A aguardar aprovação + + + Censurado + + + %s juntou-se ao jogo. + + + %s saiu do jogo. + + + %s foi expulso do jogo. + + + Posto de Poções + + + Introduzir Texto de Sinal + + + Introduz uma linha de texto para o teu sinal + + + Introduzir Título + + + Tempo Limite da Avaliação Excedido + + + Jogo cheio + + + Falha ao entrar no jogo, não existem espaços livres + + + Introduz um título para a tua publicação + + + Introduz uma descrição da tua publicação + + + Inventário + + + Ingredientes + + + Introduzir Legenda + + + Introduz uma legenda para a tua publicação + + + Introduzir Descrição + + + A tocar: + + + Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? +Se selecionares OK, irás sair do jogo. + + + Removido da Lista de Excluídos + + + Gravação Automática + + + Nível Excluído + + + 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. + + + Excluir este Nível? + + + Gravação Automática: DESLIGADO + + + Opacidade + + + A Preparar Gravação Automática do Nível + + + Tamanho de HUD + + + Mins + + + Não Podes Colocar Aqui! + + + Não é possível colocar lava junto ao ponto de regeneração do nível, devido à possibilidade de morte instantânea dos jogadores regenerados. + + + Skins Favoritas + + + Jogo de %s + + + Jogo anfitrião desconhecido + + + Um convidado terminou a sessão + + + Repor Definições + + + Tens a certeza de que queres repor as definições para os valores predefinidos? + + + Erro de Carregamento + + + Um jogador convidado terminou sessão. Como tal, todos os jogadores convidados foram removidos do jogo. + + + Falha ao criar jogo + + + Auto Selecionado + + + Sem Pack: Skins Predefinidas + + + Iniciar Sessão + + + Não tens sessão iniciada. Para jogares este jogo, tens de iniciar uma sessão. Queres iniciar sessão agora? + + + Multijogador não é permitido + + + Beber + + + Nesta área, foi criada uma quinta. As quintas permitem-te criar uma fonte renovável de alimentos e outros objetos. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre quintas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre quintas. + + + O Trigo, as Abóboras e 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. + + + Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + + + Atravessa este buraco para continuares. + + + Concluíste o tutorial do modo Criativo. + + + 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. + + + 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*} + + + Os Cogumelos têm de ser plantados numa área com pouca luz e irão espalhar-se pelos blocos pouco iluminados em redor.{*ICON*}39{*/ICON*} + + + Podes usar Pó de Ossos para fazer crescer totalmente as plantações ou transformar Cogumelos em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + + + O Trigo passa por várias fases de crescimento e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + + + Para que as Abóboras e os Melões cresçam, é necessário colocar um bloco junto ao local onde plantaste a semente, depois de ter crescido o caule. + + + A Cana de Açúcar tem de ser plantada em blocos de Erva, Terra ou Areia ao lado de um bloco de água. Cortar um bloco de Cana de Açúcar também fará cair todos os blocos por cima dele.{*ICON*}83{*/ICON*} + + + 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. + + + No baú, nesta área, existem alguns componentes para criar circuitos com pistões. Experimenta usar ou completar os circuitos nesta área ou cria o teu próprio circuito. Existem mais exemplos fora da área do tutorial. + + + Nesta área existe um Portal para o Submundo! + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saber mais sobre Portais e sobre o Submundo.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre Portais e o Submundo. + + + + 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*} + + + + + Os repetidores de Redstone podem ser usados para aumentar o alcance da energia ou colocar um retardador no circuito. + {*ICON*}356{*/ICON*} + + + + + Quando é ativado, o Pistão estica e empurra até 12 blocos. Quando recolhem, os Pistões Pegajosos conseguem puxar um bloco de quase todos os tipos. + {*ICON*}33{*/ICON*} + + + + 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. + + + O Submundo pode ser usado para viajar rapidamente no Mundo Superior - um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior. + + + Agora estás em Modo Criativo. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre o modo Criativo.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre o modo Criativo. + + + Para ativar um Portal do Submundo, incendeia os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a sua estrutura se partir, se ocorrer uma explosão nas proximidades ou se escorrer líquido sobre os blocos. + + + Para utilizar um Portal do Submundo, fica dentro dele. O ecrã fica roxo e ouves um som. Alguns segundos depois, serás transportado para outra dimensão. + + + O Submundo pode ser um local perigoso, cheio de lava, mas também pode ser útil para recolher Blocos do Submundo, que ardem para sempre depois de acesos, e Glowstone, que produz luz. + + + Concluíste o tutorial sobre quintas. + + + Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar um machado para cortar troncos de árvore. + + + Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma picareta para extrair pedra e minério. Podes ter de construir uma picareta com materiais melhores, para obter recursos de certos blocos. + + + Algumas ferramentas são melhores para atacar inimigos. Experimenta usar uma espada para atacares. + + + Os Golems de Ferro também aparecem naturalmente para proteger as aldeias e, caso ataques quaisquer aldeões, eles atacam-te. + + + Não podes sair desta área até teres completado o tutorial. + + + Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma pá para escavar materiais moles como terra e areia. + + + 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... + + + No baú, junto ao rio, encontra-se um barco. Para usares o barco, aponta o ponteiro para a água e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} enquanto apontas para o barco para entrares. + + + No baú, junto ao lago, encontra-se uma cana de pesca. Retira-a do baú e seleciona-a como objeto atual na tua mão, para a usares. + + + Este mecanismo de pistão mais avançado cria uma ponte que se repara automaticamente! Prime o botão para ativar e descobre como interagem os componentes. + + + 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. + + + Mantém premido{*CONTROLLER_ACTION_JUMP*} para nadares para cima. + + + Nesta área, existe uma vagoneta sobre carris. Para entrares na vagoneta, aponta o ponteiro para a mesma e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} no botão para fazeres a vagoneta andar. + + + 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. + + + 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. + + + 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. + + + Os animais só podem voltar a entrar no Modo Amor ao fim de cerca de cinco minutos. + + + Nesta área, os animais foram colocados dentro de uma cerca. Podes criar animais para produzir crias dos mesmos. + + + {*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. + + + + Para que os animais procriem, terás de lhes dar os alimentos certos para que entrem em "Modo Amor". + + + 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*} + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes o que precisas sobre Golems. + + + Os Golems são criados colocando uma abóbora no topo de uma pilha de blocos. + + + Os Golems de Neve são criados com dois Blocos de Neve, um por cima do outro, com uma abóbora em cima. Os Golems de Neve atiram bolas de neve aos inimigos. + + + + 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. + + + + Concluíste o tutorial sobre criação de animais. + + + Nesta zona há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + + + 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. + + + Se esvaziares o caldeirão, podes voltar a enchê-lo com um Balde de Água. + + + Utiliza o Posto de Poções para criar uma Poção de Resistência ao Fogo. Precisas de uma Garrafa de Água, uma Verruga do Submundo e Creme de Magma. + + + + Com uma poção na mão, 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. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre poções e a sua preparação.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre poções e a sua preparação. + + + O primeiro passo para preparar uma poção é criar uma Garrafa de Água. Retira uma Garrafa de Vidro do baú. + + + Podes encher uma garrafa de vidro num Caldeirão com água ou a partir de um bloco de água. Enche a garrafa de vidro apontando para a fonte de água e premindo{*CONTROLLER_ACTION_USE*}. + + + Utiliza a Poção de Resistência ao Fogo em ti mesmo. + + + 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. + + + 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. + + + 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. + + + Agora que és resistente ao fogo e à lava, poderás ir a sítios onde nunca foste. + + + Esta é a interface dos feitiços que podes usar para enfeitiçar armas, armaduras e algumas ferramentas. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a interface de feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a interface de feitiços. + + + Nesta área existe um Posto de Poções, um Caldeirão e um baú cheio de ingredientes para criar poções. + + + O carvão vegetal pode ser usado como combustível ou para criar tochas, juntamente com um pau. + + + Para fazeres vidro, coloca areia no espaço dos ingredientes. Cria blocos de vidro para usares como janelas para o teu abrigo. + + + Esta é a interface de preparação de poções. Podes utilizá-la para criar poções com diferentes efeitos. + + + Muitos objetos de madeira podem ser usados como combustíveis, mas nem todos queimam durante o mesmo tempo. Podes também descobrir outros objetos no mundo que podem ser usados como combustível. + + + Depois de 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. + + + 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. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes como usar o posto de poções. + + + 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. + + + Cria uma Poção de Resistência ao Fogo juntando uma Verruga de Submundo a uma Garrafa de Água e adicionando Creme de Magma. + + + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de preparação de poções. + + + 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. + + + Todas as poções começam com uma Garrafa de Água. A maioria das poções são criadas utilizando uma Verruga do Submundo para criar uma Poção Estranha e necessitam de pelo menos mais um ingrediente para criar a poção final. + + + Depois de criares uma poção, podes modificar os seus efeitos. Se adicionares Pó de Redstone, aumentas a duração do efeito, e se adicionares Pó de Glowstone, o efeito será mais poderoso. + + + 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. + + + Prime{*CONTROLLER_ACTION_USE*} para lançares a linha e começares a pescar. Prime{*CONTROLLER_ACTION_USE*} novamente para enrolares a linha de pesca. + {*FishingRodIcon*} + + + Para apanhares peixe, espera até que o flutuador mergulhe na água e só depois deves enrolar a linha. O peixe pode ser comido cru ou cozinhado na fornalha, para restituir saúde. + {*FishIcon*} + + + Tal como acontece com outras ferramentas, a cana de pesca tem um número limitado de utilizações. Mas as utilizações não se limitam à pesca. Faz experiências para veres que outras coisas podes apanhar ou ativar... + {*FishingRodIcon*} + + + O barco permite-te viajar mais rapidamente sobre a água. Podes conduzi-lo utilizando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + Estás a usar uma cana de pesca. Prime{*CONTROLLER_ACTION_USE*} para a usares.{*FishingRodIcon*} + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre pesca.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre pesca. + + + Isto é uma cama. De noite, prime{*CONTROLLER_ACTION_USE*} enquanto apontas para a cama, para dormires e acordares de manhã.{*ICON*}355{*/ICON*} + + + Nesta área existem alguns circuitos simples de Redstone e Pistões, além de um baú com mais objetos para aumentar estes circuitos. + + + {*B*} + Prime {*CONTROLLER_VK_A*} para saberes mais sobre os circuitos de Redstone e pistões.{*B*} + Prime {*CONTROLLER_VK_B*} se já sabes tudo sobre os circuitos de Redstone e pistões. + + + As Alavancas, Botões, Placas de Pressão e Tochas de Redstone podem fornecer energia aos circuitos, acoplando-os diretamente ao objeto que queres ativar ou ligando-os com pó de Redstone. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre camas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre camas. + + + A cama deve ser colocada num local seguro e bem iluminado, para que os monstros não te acordem a meio da noite. Depois de usares uma cama, se morreres serás ressuscitado nessa cama. + {*ICON*}355{*/ICON*} + + + Se existirem outros jogadores no teu jogo, todos têm de estar na cama ao mesmo tempo, para poderem dormir. + {*ICON*}355{*/ICON*} + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre barcos.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre barcos. + + + Utilizar uma Mesa de Feitiços permite-te adicionar efeitos especiais, tais como aumentar o número de objetos produzidos ao escavar um bloco ou melhorar a resistência a armas, armaduras e algumas ferramentas. + + + Colocar estantes em redor da Mesa de Feitiços aumenta o seu poder e permite o acesso a feitiços de nível mais alto. + + + Enfeitiçar objetos tem um custo em Níveis de 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. + + + 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. + + + Nesta área existe uma Mesa de Feitiços e outros objetos que te ajudarão a aprender tudo sobre feitiços. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre feitiços. + + + + 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. + + + As vagonetas andam sobre carris. Podes criar uma vagoneta motorizada com uma fornalha e uma vagoneta com baú dentro dela. + {*RailIcon*} + + + 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*} + + + Estás a navegar num barco. Para saíres do barco, coloca o ponteiro sobre o mesmo e prime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + 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. + + + Estás a conduzir uma vagoneta. Para saíres da vagoneta, coloca o ponteiro sobre a vagoneta e prime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre vagonetas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre vagonetas. + + + Se deslocares o ponteiro para fora dos limites da interface, quando estiveres a transportar um objeto, poderás largá-lo. + + + Ler + + + Pendurar + + + Atirar + + + Abrir + + + Alterar Tom + + + Detonar + + + Plantar + + + Desbloquear Jogo Completo + + + Apagar Gravação + + + Apagar + + + Lavrar + + + Colher + + + Continuar + + + Nadar para Cima + + + Atingir + + + Ordenhar + + + Recolher + + + Esvaziar + + + Selar + + + Colocar + + + Comer + + + Montar + + + Velejar + + + Crescer + + + Dormir + + + Acordar + + + Tocar + + + Opções + + + Mover Armadura + + + Mover Arma + + + Equipar + + + Mover Ingrediente + + + Mover Combustível + + + Mover Ferramenta + + + Puxar + + + Página Acima + + + Página Abaixo + + + Modo Amor + + + Soltar + + + Privilégios + + + Bloquear + + + Criativo + + + Excluir Nível + + + Selecionar Skin + + + Acender + + + Convidar Amigos + + + Aceitar + + + Tosquiar + + + Navegar + + + Reinstalar + + + Op. Gravação + + + Executar Comando + + + Instalar Versão Completa + + + Instalar Versão de Avaliação + + + Instalar + + + Ejetar + + + Atualizar Lista de Jogos Online + + + Jogos Party + + + Todos os Jogos + + + Sair + + + Cancelar + + + Cancelar Juntar + + + Alterar Grupo + + + Criação + + + Criar + + + Retirar/Colocar + + + Mostrar Inventário + + + Mostrar Descrição + + + Mostrar Ingredientes + + + Anterior + + + Lembrete: + + + + + + Foram adicionadas novas funcionalidades na última versão do jogo, incluindo novas áreas no mundo do tutorial. + + + Não tens todos os ingredientes necessários para criar este objeto. A caixa no canto inferior esquerdo mostra os ingredientes de que precisas. + + + Parabéns, concluíste o tutorial. Agora, o tempo de jogo passa normalmente e não tens muito tempo até que anoiteça e os monstros saiam para a rua! Termina o teu abrigo! + + + {*EXIT_PICTURE*} Quando estiveres preparado para explorar mais, existe uma escadaria nesta área, junto ao abrigo dos Mineiros, que conduz a um pequeno castelo. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para jogares o tutorial normalmente.{*B*} + Prime {*CONTROLLER_VK_B*} para ignorar o tutorial principal. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a barra de comida e a alimentação.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a barra de comida e a alimentação. + + + Selecionar + + + Usar + + + Nesta área, tens a possibilidade de aprender mais sobre pesca, barcos, pistões e Redstone. + + + Fora desta área, irás encontrar exemplos de edifícios, quintas, vagonetas e carris, feitiços, poções, trocas, ferreiros e muito mais! + + + O nível da tua barra de comida está demasiado baixo para restaurar a tua saúde. + + + Retirar + + + Seguinte + + + Anterior + + + Expulsar Jogador + + + Enviar Pedido de Amizade + + + Página Abaixo + + + Página Acima + + + Tingir + + + Curar + + + Senta + + + Segue-me + + + Escavar + + + Alimentar + + + Domar + + + Alterar Filtro + + + Colocar tudo + + + Colocar um + + + Largar + + + Retirar tudo + + + Retirar metade + + + Colocar + + + Largar tudo + + + Limpar Seleção Rápida + + + O que é isto? + + + Partilhar no Facebook + + + Largar um + + + Trocar + + + Mover rápido + + + Packs de Skins + + + Painel de Vidro Pintado Vermelho + + + Painel de Vidro Pintado Verde + + + Painel de Vidro Pintado Castanho + + + Vidro Pintado Branco + + + Painel de Vidro Pintado + + + Painel de Vidro Pintado Preto + + + Painel de Vidro Pintado Azul + + + Painel de Vidro Pintado Cinzento + + + Painel de Vidro Pintado Cor-de-Rosa + + + Painel de Vidro Pintado Verde-Lima + + + Painel de Vidro Pintado Roxo + + + Painel de Vidro Pintado Ciano + + + Painel de Vidro Pintado Cinzento Claro + + + Vidro Pintado Cor-de-Laranja + + + Vidro Pintado Azul + + + Vidro Pintado Roxo + + + Vidro Pintado Ciano + + + Vidro Pintado Vermelho + + + Vidro Pintado Verde + + + Vidro Pintado Castanho + + + Vidro Pintado Cinzento Claro + + + Vidro Pintado Amarelo + + + Vidro Pintado Azul Claro + + + Vidro Pintado Magenta + + + Vidro Pintado Cinzento + + + Vidro Pintado Cor-de-Rosa + + + Vidro Pintado Verde-Lima + + + Painel de Vidro Pintado Amarelo + + + Cinzento Claro + + + Cinzento + + + Cor-de-Rosa + + + Azul + + + Roxo + + + Ciano + + + Verde-Lima + + + Cor-de-Laranja + + + Branco + + + Personalizada + + + Amarelo + + + Azul Claro + + + Magenta + + + Castanho + + + Painel de Vidro Pintado Branco + + + Bola Pequena + + + Bola Grande + + + Painel de Vidro Pintado Azul Claro + + + Painel de Vidro Pintado Magenta + + + Painel de Vidro Pintado Cor-de-Laranja + + + Forma de Estrela + + + Preto + + + Vermelho + + + Verde + + + Forma de Creeper + + + Explosão + + + Forma Desconhecida + + + Vidro Pintado Preto + + + Armadura de Cavalo de Ferro + + + Armadura de Cavalo de Ouro + + + Armadura de Cavalo de Diamante + + + Comparador de Redstone + + + Vagoneta com TNT + + + Vagoneta com Funil + + + Trela + + + Sinalizador + + + Baú Armadilhado + + + Placa de Pressão de Pesagem (Leve) + + + Etiqueta com Nome + + + Tábuas de Madeira (qualquer tipo) + + + Bloco de Comando + + + Estrela de Fogo de Artifício + + + Estes animais pode ser domados e depois montados. Podem ter um baú acoplado. + + + Mula + + + Nascida da criação entre um Cavalo e um Burro. Estes animais podem ser domados, depois montados e carregar baús. + + + Cavalo + + + Estes animais podem ser domados e depois montados. + + + Burro + + + Cavalo Morto-vivo + + + Mapa Vazio + + + Estrela do Submundo + + + Foguete de Fogo de Artifício + + + Cavalo Esqueleto + + + Wither + + + Estas criaturas são criadas a partir de Caveiras Atrofiadas e Areia Movediça. Disparam caveiras explosivas contra ti. + + + Placa de Pressão de Pesagem (Pesada) + + + Barro Pintado Cinzento Claro + + + Barro Pintado Cinzento + + + Barro Pintado Cor-de-Rosa + + + Barro Pintado Azul + + + Barro Pintado Roxo + + + Barro Pintado Ciano + + + Barro Pintado Verde-Lima + + + Barro Pintado Cor-de-Laranja + + + Barro Pintado Branco + + + Vidro Pintado + + + Barro Pintado Amarelo + + + Barro Pintado Azul Claro + + + Barro Pintado Magenta + + + Barro Pintado Castanho + + + Funil + + + Carril Ativador + + + Largador + + + Comparador de Redstone + + + Sensor de Luz do Dia + + + Bloco de Redstone + + + Barro Pintado + + + Barro Pintado Preto + + + Barro Pintado Vermelho + + + Barro Pintado Verde + + + Fardo de Palha + + + Barro Endurecido + + + Bloco de Carvão + + + Desvanecer para + + + 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. + + + Quando ativada, os jogadores mantêm o seu inventário, depois de morrerem. + + + Quando desativada, os habitantes deixam de ser regenerados naturalmente. + + + Modo de Jogo: Aventura + + + Aventura + + + Introduz uma semente para criares o mesmo terreno novamente. Deixa em branco para um mundo aleatório. + + + Quando desativada, os monstros e animais não largam o saque (por exemplo, os Creepers não largam pólvora). + + + {*PLAYER*} caiu de uma escada + + + {*PLAYER*} caiu de umas trepadeiras + + + {*PLAYER*} caiu fora da água + + + Quando desativada, os blocos não largam objetos quando são destruídos (por exemplo, os blocos de Pedra não largam Pedra Arredondada). + + + Quando desativada, os jogadores não regeneram saúde naturalmente. + + + Quando desativada, a hora do dia não muda. + + + Vagoneta + + + Prende com Trela + + + Solta + + + Acopla + + + Desmonta + + + Fixa o Baú + + + Lança + + + Nomear + + + Sinalizador + + + Poder Primário + + + Poder Secundário + + + Cavalo + + + Largador + + + Funil + + + {*PLAYER*} caiu de um local elevado + + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Morcegos num mundo. + + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de cavalos de criação. + + + Opções de Jogo + + + {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} utilizando {*ITEM*} + + + {*PLAYER*} foi cilindrado por {*SOURCE*} utilizando {*ITEM*} + + + {*PLAYER*} foi morto por {*SOURCE*} utilizando {*ITEM*} + + + Habitantes Contidos + + + Espólio de Blocos + + + Regeneração Natural + + + Ciclo de Luz do Dia + + + Manter Inventário + + + Regeneração de Habitantes + + + Saque de Habitantes + + + {*PLAYER*} foi alvejado por {*SOURCE*} utilizando {*ITEM*} + + + {*PLAYER*} caiu longe demais e foi liquidado por {*SOURCE*} + + + {*PLAYER*} caiu longe demais e foi liquidado por {*SOURCE*} utilizando {*ITEM*} + + + {*PLAYER*} entrou no fogo enquanto lutava com {*SOURCE*} + + + {*PLAYER*} foi condenado a cair por {*SOURCE*} + + + {*PLAYER*} foi condenado a cair por {*SOURCE*} + + + {*PLAYER*} foi condenado a cair por {*SOURCE*} utilizando {*ITEM*} + + + {*PLAYER*} foi completamente tostado enquanto lutava com {*SOURCE*} + + + {*PLAYER*} foi rebentado por {*SOURCE*} + + + {*PLAYER*} foi demonizado + + + {*PLAYER*} foi dilacerado por {*SOURCE*} utilizando {*ITEM*} + + + {*PLAYER*} tentou nadar pela lava para escapar a {*SOURCE*} + + + {*PLAYER*} afogou-se enquanto tentava escapar a {*SOURCE*} + + + {*PLAYER*} foi contra um cato enquanto tentava escapar a {*SOURCE*} + + + Monta + + + +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. + + + + +Os Burros e Mulas domados podem receber alforges; para isso fixa um baú. Podes aceder a estes alforges enquanto o montas ou quando rastejas. + + + + +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. + + + + +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. + + + + +Quando domado, vão surgir Corações de Amor à sua volta e deixará de tentar derrubar o jogador. + + + + +Tenta agora montar este cavalo. Usa {*CONTROLLER_ACTION_USE*} sem objetos ou ferramentas na mão, para montá-lo. + + + + +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. + + + + +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. + + + + +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. + + + + No topo desta pirâmide está um Sinalizador inativo. + + + +Este é o interface do Sinalizador, que podes usar para escolher os poderes concedidos pelo teu Sinalizador. + + + + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. +{*B*}Prime{*CONTROLLER_VK_B*} se já sabes como usar o interface do Sinalizador. + + + + +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. + + + + +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. + + + + +Este é o interface de inventário do cavalo. + + + + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. +{*B*}Prime{*CONTROLLER_VK_B*} se já sabes como usar o inventário do cavalo. + + + + +O inventário do cavalo permite-te transferir ou equipar objetos para o teu cavalo, Burro ou Mula. + + + + Cintilar + + + Rasto + + + Duração do Voo: + + + 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. + + + Encontraste uma Mula. + + + + {*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. + + + + +Os Cavalos e Burros são encontrados, principalmente, em planícies abertas. As Mulas podem ser criadas a partir de um Burro e um Cavalo, mas são estéreis. + + + + +Também podes transferir objetos entre o teu próprio inventário e os alforges agarrados ao Burros e às Mulas, com este menu. + + + + Encontraste um Cavalo. + + + Encontraste um Burro. + + + + {*B*}Prime{*CONTROLLER_VK_A*} para saberes mais sobre Sinalizadores. + {*B*}Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre Sinalizadores. + + + + +As Estrelas de Fogo de Artifício podem ser criadas quando colocas Pólvora e Tinta na grelha de criação. + + + + +A Tinta vai definir a cor da explosão da Estrela de Fogo de Artifício. + + + + +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. + + + + +Opcionalmente, podes colocar várias Estrelas de Fogo de Artifício na grelha de criação para as adicionares ao Fogo de Artifício. + + + + +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. + + + + +Depois podes pegar no Fogo de Artifício criado no campo de saída, quando quiseres criá-lo. + + + + +Podes adicionar um rasto ou um efeito de cintilar com Diamantes ou Pó de Glowstone. + + + + +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. + + + + 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. + + + +Tenta criar um Fogo de Artifício na Mesa de Criação utilizando uma variedade de ingredientes dos baús. + + + + +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. + + + + +Contidos em vários baús, deste local, há vários objetos usados na criação de FOGO DE ARTIFÍCIO! + + + + {*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. + + + + +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. + + + + Esta sala contém Funis + + + + {*B*}Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre Funis. + {*B*}Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre Funis. + + + + +Os Funis são usados para inserir ou remover objetos de contentores e para apanhar automaticamente objetos que são atirados para dentro deles. + + + + +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. + + + + +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. + + + + +Tenta usar o Sinalizador para configurares os poderes que ele concede. Podes usar os Lingotes de Ferro disponibilizados para o pagamento necessário. + + + + +Eles podem afetar Postos de Poções, Baús, Distribuidores, Largadores, Vagonetas com Baús, Vagonetas com Funis, além de outros Funis. + + + + +Existem vários esquemas úteis de Funis nesta sala, que podes observar e experimentar. + + + + +Este é o interface do Fogo de Artifício, que podes usar para criar Fogos 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 utilizar o interface do Fogo de Artifício. + + + + +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. + + + + +No entanto, se um Funil for operado por Redstone, ficará inativo e deixará de sugar e de inserir itens. + + + + +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. + + + + Estes inimigos podem ser encontrados em pântanos e atacam-te com poções. Quando mortos, largam Poções. + + + O número máximo de Pinturas/Molduras de Objetos num mundo foi atingido. + + + Não podes produzir inimigos no modo Calmo. + + + Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos de criação foi alcançado. + + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lulas num mundo. + + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de inimigos num mundo. + + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de aldeões num mundo. + + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Lobos de criação. + + + O número máximo de Cabeças de Habitantes num mundo foi alcançado. + + + Inverter Olhar + + + Esquerdino + + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Galinhas de criação. + + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Vacogumelos de criação. + + + Foi alcançado o número máximo de Barcos num mundo. + + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Galinhas num mundo. + + + {*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*} + + + {*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*} + + + Repor Submundo + + + %s entrou em O Fim + + + %s abandonou O Fim + + + {*C3*}Sei a que jogador te referes.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. 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*} + + + Queres mesmo repor o Submundo desta gravação no seu estado predefinido? Vais perder tudo o que construíste no Submundo! + + + 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. + + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lobos num mundo. + + + Repor Submundo + + + Não Repor Submundo + + + De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos. + + + Morreste! + + + Opções de Mundo + + + Pode Construir e Escavar + + + Pode Usar Portas e Interruptores + + + Gerar Estruturas + + + Mundo Superplano + + + Baú de Bónus + + + Pode Abrir Contentores + + + Expulsar Jogador + + + Pode Voar + + + Desativar Exaustão + + + Pode Atacar Jogadores + + + Pode Atacar Animais + + + Moderador + + + Privilégios de Anfitrião + + + Instruções de Jogo + + + Controlos + + + Definições + + + Regenerar + + + Ofertas de Conteúdo Transferível + + + Alterar Skin + + + Ficha técnica + + + Explosões de TNT + + + Jogador vs. Jogador + + + Confiar nos Jogadores + + + Reinstalar Conteúdo + + + Definições de Depuração + + + Fogos Propagados + + + Ender Dragon + + + {*PLAYER*} foi morto pelo bafo do Ender Dragon + + + {*PLAYER*} foi assassinado por {*SOURCE*} + + + {*PLAYER*} foi assassinado por {*SOURCE*} + + + {*PLAYER*} morreu + + + {*PLAYER*} explodiu + + + {*PLAYER*} foi morto por magia + + + {*PLAYER*} foi atingido por {*SOURCE*} + + + Rochas Enevoadas + + + Mostrar HUD + + + Mostrar Mão + + + {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + + + {*PLAYER*} foi agredido por {*SOURCE*} + + + {*PLAYER*} foi morto por {*SOURCE*} utilizando magia + + + {*PLAYER*} caiu do mundo + + + Packs de Textura + + + Packs de Mistura + + + {*PLAYER*} foi consumido pelas chamas + + + Temas + + + Imagens de Jogador + + + Itens de Avatar + + + {*PLAYER*} morreu carbonizado + + + {*PLAYER*} morreu à fome + + + {*PLAYER*} foi picado até à morte + + + {*PLAYER*} embateu no chão com muita força + + + {*PLAYER*} tentou nadar na lava + + + {*PLAYER*} sufocou numa parede + + + {*PLAYER*} afogou-se + + + Mensagens de Morte + + + Já não és um moderador + + + Já podes voar + + + Já não podes voar + + + Já não podes atacar animais + + + Já podes atacar animais + + + Já és um moderador + + + Já não vais ficar exausto + + + Já és invulnerável + + + Já não és invulnerável + + + %d MSP + + + Agora vais ficar exausto + + + Já estás invisível + + + Já não estás invisível + + + Já podes atacar jogadores + + + Já podes escavar e usar objetos + + + Já não podes colocar blocos + + + Já podes colocar blocos + + + Personagem Animada + + + Anim. Skin Personalizada + + + Já não podes escavar ou usar objetos + + + Agora podes usar portas e interruptores + + + Já não podes atacar habitantes + + + Já podes atacar habitantes + + + Já não podes atacar jogadores + + + Já não podes usar portas e interruptores + + + Agora podes usar contentores (tais como baús) + + + Já não podes usar contentores (tais como baús) + + + Invisível + + + Sinalizadores + + + +{*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*} + + + + 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*} + + + + {*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*} + + + + Largadores + + + SEM USO + + + Saúde Instantânea + + + Danos Instantâneos + + + Impulso de Salto + + + Cansaço por Escavação + + + Força + + + Fraqueza + + + Náusea + + + SEM USO + + + SEM USO + + + SEM USO + + + Regeneração + + + Resistência + + + A procurar Semente para o Gerador de Mundos + + + 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. + + + Um tipo de carril que pode ativar ou desativar Vagonetas com Funis e ativar Vagonetas com TNT. + + + Usado para segurar e largar objetos, ou empurrar objetos para outro contentor, quando recebe uma carga de Redstone. + + + Blocos coloridos criados ao tingir barro Endurecido. + + + 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. + + + Usado como uma fonte de energia de Redstone. Pode ser transformado novamente em Redstone. + + + Usado para apanhar objetos ou para transferir objetos para dentro e para fora de contentores. + + + Pode ser dado a comer a Cavalos, Burros ou Mulas para curar até 10 Corações. Acelera o crescimento das crias. + + + Morcego + + + Estas criaturas voadoras são encontradas em cavernas ou outros espaços fechados de grande dimensão. + + + Bruxa + + + Criado ao derreter Barro numa fornalha. + + + Criado a partir de vidro e uma tinta. + + + Criado a partir de Vidro Pintado + + + Fornece uma carga de Redstone. A carga será mais forte se tiver mais objetos em cima da placa. + + + É um bloco que envia um sinal de Redstone consoante a luz do sol (ou falta de luz do sol). + + + É 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. + + + Um tipo de Armadura especial que pode ser equipada num cavalo. Fornece 5 de Armadura. + + + Usada para determinar a cor, efeito e forma de um fogo de artifício. + + + Usado em circuitos de Redstone para manter, comparar ou subtrair força do sinal, ou para medir o estado de determinados blocos. + + + É um tipo de Vagoneta que atua como um bloco de TNT móvel. + + + Um tipo de Armadura especial que pode ser equipada num cavalo. Fornece 7 de Armadura. + + + Usado para executar comandos. + + + Projeta um feixe de luz para o céu e pode fornecer Efeitos de Estado aos jogadores nas proximidades. + + + 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. + + + Um tipo de Armadura especial que pode ser equipada num cavalo. Fornece 11 de Armadura. + + + Usada para o jogador segurar habitantes ou para agarrar os habitantes a postes de Cercas + + + Usado para dar nomes aos habitantes no mundo. + + + Rapidez + + + Jogo Completo + + + Retomar Jogo + + + Gravar Jogo + + + Jogar + + + Tabelas de Liderança + + + Ajuda e Opções + + + Dificuldade: + + + JvJ: + + + Confiar Jogadores: + + + TNT: + + + Modo Jogo: + + + Estruturas: + + + Tipo de Nível: + + + Não foram encontrados jogos + + + Apenas por Convite + + + Mais Opções + + + Carregar + + + Opções de Anfitrião + + + Jogadores/Convidar + + + Jogo Online + + + Novo Mundo + + + Jogadores + + + Juntar ao Jogo + + + Iniciar Jogo + + + Nome do Mundo + + + Semente para o Gerador de Mundos + + + Deixar livre para uma semente aleatória + + + Fogos Propagados: + + + Editar mensagem do sinal: + + + Preenche os detalhes da tua captura de ecrã + + + Legenda + + + Dicas Durante o Jogo + + + Ecrã Dividido Vertical 2 Jog. + + + Concluído + + + Captura de ecrã do jogo + + + Sem Efeitos + + + 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. {*T3*}INSTRUÇÕES DE JOGO: FORNALHA {*ETW*}{*B*}{*B*} @@ -283,6 +3663,23 @@ Os ingredientes para as poções são:{*B*}{*B*} * {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} Experimenta várias combinações de ingredientes para descobrires as diferentes poções que podes preparar. + + + {*T3*}INSTRUÇÕES DE JOGO: BAÚ GRANDE{*ETW*}{*B*}{*B*} +Ao colocares dois baús um ao lado do outro, estes combinam-se e formam um Baú Grande, que pode armazenar ainda mais objetos.{*B*}{*B*} +É utilizado da mesma forma que um baú normal. + + + {*T3*}INSTRUÇÕES DE JOGO: CRIAÇÃO{*ETW*}{*B*}{*B*} +Na interface de Criação, podes combinar objetos do inventário para criar novos tipos de objetos. Usa{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação.{*B*}{*B*} +Desloca-te pelos separadores no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de objeto que pretendes criar, depois usa{*CONTROLLER_MENU_NAVIGATE*} para selecionar o objeto a criar.{*B*}{*B*} +A área de criação mostra os objetos necessários para criar o novo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e colocá-lo no teu inventário. + + + {*T3*}INSTRUÇÕES DE JOGO: MESA DE CRIAÇÃO{*ETW*}{*B*}{*B*} +Podes criar objetos maiores utilizando uma Mesa de Criação.{*B*}{*B*} +Coloca a mesa no mundo e prime{*CONTROLLER_ACTION_USE*} para a usares.{*B*}{*B*} +A criação na mesa funciona da mesma forma que a criação básica, mas tens uma área de criação maior e uma seleção de objetos mais variada. {*T3*}INSTRUÇÕES DE JOGO: FEITIÇOS{*ETW*}{*B*}{*B*} @@ -293,25 +3690,6 @@ O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado. 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*} - - - {*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: EXCLUIR NÍVEIS{*ETW*}{*B*}{*B*} @@ -340,6 +3718,27 @@ Quando ativada, o TNT explode quando é detonado. Esta opção pode ser alterada {*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*} @@ -396,67 +3795,98 @@ Esta opção afeta apenas o modo Sobrevivência. Quando ativada, as atividades f {*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. Página Seguinte + + {*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. + + + O Minecon 2013 decorreu em Orlando, na Florida, nos EUA! + + + .party() foi fantástica! + + + Assume sempre que os rumores são falsos e não verdadeiros! + Página Anterior - - Princípios Básicos - - - HUD - - - Inventário - - - Baús - - - Criar - - - Fornalha - - - Distribuidor - - - Animais de Quinta - - - Animais de Criação - - - Preparação de Poções - - - Feitiço - - - Portal do Submundo - - - Multijogador - - - A Partilhar Capturas de Ecrã - - - Excluir Níveis - - - Modo Criativo - - - Opções de Anfitrião e Jogador - Trocas @@ -466,10 +3896,19 @@ Esta opção permite ao jogador mover jogadores, ou mover-se a si próprio, para O Fim + + Excluir Níveis + + + Modo Criativo + + + Opções de Anfitrião e Jogador + {*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*} +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*} @@ -478,67 +3917,14 @@ Enquanto o fizeres, o Ender Dragon irá atacar-te voando na tua direção e cusp 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. - - - Sprint - - - Novidades - - - {*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*} {*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*} +{*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*} @@ -547,71 +3933,414 @@ Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam ape 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. + + Sprint + + + Novidades + + + {*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*} + + + A Partilhar Capturas de Ecrã + + + Baús + + + Criar + + + Fornalha + + + Princípios Básicos + + + HUD + + + Inventário + + + Distribuidor + + + Feitiço + + + Portal do Submundo + + + Multijogador + + + Animais de Quinta + + + Animais de Criação + + + Preparação de Poções + + + deadmau5 gosta de Minecraft! + + + Os pastores não te irão atacar, se não os atacares. + + + Se dormires numa cama, podes alterar o ponto de regeneração do jogo e avançar até à madrugada. + + + Atira essas bolas de fogo de volta para o Ghast! + + + Faz algumas tochas para iluminares zonas durante a noite. Os monstros não se aproximarão das zonas próximas das tochas. + + + Chega aos destinos mais rapidamente com uma vagoneta sobre carris! + + + Planta alguns rebentos para que cresçam até se tornarem árvores. + + + Constrói um portal para poderes viajar até outra dimensão - o Submundo. + + + Não é boa ideia escavares diretamente para cima ou para baixo. + + + A Farinha de Ossos (obtida a partir de um osso de Esqueleto) pode ser usada como fertilizante e fazer as coisas crescerem instantaneamente! + + + Os Creepers explodem quando se aproximam de ti! + + + Prime{*CONTROLLER_VK_B*} para largares o objeto que tens na mão! + + + Usa a ferramenta certa para a tarefa! + + + Se não conseguires encontrar carvão para as tochas, podes produzir carvão vegetal a partir de árvores numa fornalha. + + + Se comeres as costeletas cozinhadas, irás ganhar mais saúde do que se as comeres cruas. + + + Se a dificuldade do jogo for Calmo, a tua saúde irá regenerar automaticamente e não surgirão monstros à noite! + + + Dá um osso a um lobo para o domares. Depois, poderás ordenar-lhe para se sentar ou seguir-te. + + + No Inventário podes largar objetos movendo o cursor para fora do menu e premindo{*CONTROLLER_VK_A*} + + + Novo Conteúdo Transferível disponível! Acede-lhe a partir do botão Loja Minecraft no Menu Principal. + + + 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. + + + Altera as definições de gama para veres o jogo com maior ou menor luminosidade. + + + Se dormires numa cama à noite acelerarás o jogo até de madrugada, mas é preciso que todos no jogo multijogador durmam ao mesmo tempo. + + + Utiliza uma enxada para preparar áreas de terreno para o cultivo. + + + As aranhas não te atacam durante o dia, a não ser que as ataques. + + + Utiliza uma pá para escavares terra ou areia mais rápido do que com as mãos! + + + Para recuperares saúde, obtém costeletas a partir dos porcos, cozinha-as e come-as. + + + Recolhe cabedal a partir das vacas e usa-o para construir armaduras. + + + Se tiveres um balde vazio, poderás enchê-lo com leite de vaca, água ou lava! + + + A obsidiana forma-se quando a água atinge um bloco de lava de origem. + + + Cercas empilháveis já disponíveis no jogo! + + + Alguns animais seguir-te-ão se tiveres trigo na mão. + + + Se um animal não se puder mover mais de 20 blocos em qualquer direção, ele não se irá desmaterializar. + + + Podes ver o estado de saúde dos lobos domados pela posição da sua cauda. Dá-lhes carne para os curares. + + + Cozinha catos numa fornalha para obteres tinta verde. + + + Lê a secção Novidades, nos menus de Instruções de Jogo, para veres as últimas informações sobre atualizações do jogo. + + + Música de C418! + + + Quem é o Notch? + + + A Mojang tem mais prémios do que colaboradores! + + + Alguns famosos jogam Minecraft! + + + O Notch tem mais de um milhão de seguidores no Twitter! + + + Nem todos os suecos são loiros. Alguns, como o Jens da Mojang, até são ruivos! + + + Este jogo será atualizado no futuro! + + + Cria um baú grande colocando dois baús lado a lado. + + + Tem cuidado ao construíres estruturas de lã a céu aberto, uma vez que os raios, durante as trovoadas, podem incendiar a lã. + + + Um único balde de lava pode ser utilizado na fornalha para fundir 100 blocos. + + + O instrumento tocado pelo bloco de notas depende do material sobre o qual se encontra. + + + A lava pode demorar vários minutos a desaparecer COMPLETAMENTE, quando o bloco de origem é removido. + + + A pedra arredondada resiste às bolas de fogo do Ghast, sendo muito útil para proteger portais. + + + Os blocos utilizados como fontes de luz derretem a neve e o gelo. Isto inclui as tochas, glowstone e Jack-O-Lanterns. + + + Os Mortos-vivos e Esqueletos conseguem sobreviver à luz do dia, se estiverem dentro de água. + + + As galinhas põem um ovo a cada 5 ou 10 minutos. + + + A obsidiana só pode ser extraída com uma picareta de diamante. + + + Os Creepers são a fonte de pólvora mais fácil de obter. + + + 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. + + + Os lobos não conseguem entrar no Submundo. + + + Os lobos não atacam Creepers. + Necessária para escavar blocos de pedra e minério. - - Utilizado para cortar blocos de madeira mais rápido do que com a mão. + + Utilizado na receita do bolo e como ingrediente para preparar poções. - - Utilizada para lavrar blocos de terra e erva, para preparar colheitas. + + Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. - - As portas de madeira são ativadas através do uso, dando um golpe ou com Redstone. + + 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. - - As portas de ferro só podem ser abertas com Redstone, botões ou interruptores. + + Restitui 2{*ICON_SHANK_01*} e pode fazer uma maçã dourada. - - SEM USO + + Restitui 2{*ICON_SHANK_01*} e regenera a saúde durante 4 segundos. Faz-se de uma maçã e pepitas de ouro. - - SEM USO + + Restitui 2{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. - - SEM USO + + Utilizado em circuitos de Redstone como repetidor, retardador e/ou díodo. - - SEM USO + + Utilizado para conduzir vagonetas. - - Dá ao utilizador 1 de Armadura quando em uso. + + Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param em cima dele. - - Dá ao utilizador 3 de Armadura quando em uso. + + Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma Vagoneta. - - Dá ao utilizador 2 de Armadura quando em uso. + + Utilizado para enviar uma descarga elétrica ao ser pressionado. Permanece ativado durante cerca de um segundo, antes de se desligar. - - Dá ao utilizador 1 de Armadura quando em uso. + + Utilizado para segurar e disparar objetos em ordem aleatória, quando recebe uma descarga de Redstone. - - Dá ao utilizador 2 de Armadura quando em uso. + + Reproduz uma nota quando ativado. Toca-lhe para alterar a altura da nota. Se o colocares sobre blocos diferentes, mudará o tipo de instrumento. - - Dá ao utilizador 5 de Armadura quando em uso. + + Restitui 2,5{*ICON_SHANK_01*}. Cria-se cozinhando peixe cru numa fornalha. - - Dá ao utilizador 4 de Armadura quando em uso. + + Restitui 1{*ICON_SHANK_01*}. - - Dá ao utilizador 1 de Armadura quando em uso. + + Restitui 1{*ICON_SHANK_01*}. - - Dá ao utilizador 2 de Armadura quando em uso. + + Restitui 3{*ICON_SHANK_01*}. - - Dá ao utilizador 6 de Armadura quando em uso. + + Utilizadas como munições para os arcos. - - Dá ao utilizador 5 de Armadura quando em uso. + + Restitui 2,5{*ICON_SHANK_01*}. - - Dá ao utilizador 2 de Armadura quando em uso. + + Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. - - Dá ao utilizador 2 de Armadura quando em uso. + + Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Se comeres isto podes ficar envenenado. + + + Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. + + + Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando uma costeleta de porco crua numa fornalha. + + + Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. Pode ser dado a comer a um Ocelote para o domesticar + + + Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando galinha crua numa fornalha. + + + Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. + + + Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. + + + Utilizada para te transportar a ti, um animal ou um monstro pelos carris. + + + Utilizada como tinta para criar lã azul clara. + + + Utilizada como tinta para criar lã ciano. + + + Utilizada como tinta para criar lã roxa. + + + Utilizada como tinta para criar lã verde-lima. + + + Utilizada como tinta para criar lã cinzenta. + + + 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.) + + + Utilizada como tinta para criar lã magenta. + + + Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + + + Utilizado para criar livros e mapas. + + + Pode usar-se para criar estantes de livros ou, quando enfeitiçado, para fazer Livros Enfeitiçados. + + + Utilizada como tinta para criar lã azul. + + + Reproduz Discos de Música. + + + Utiliza-os para criar ferramentas, armas ou armaduras muito fortes. + + + Utilizada como tinta para criar lã cor-de-laranja. + + + Recolhida a partir de ovelhas, pode ser colorida com tintas. + + + 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. + + + Utilizada como tinta para criar lã preta. + + + Utilizada para transportar bens pelos carris. + + + Desloca-se sobre carris e pode rebocar outras vagonetas, quando lhe colocas carvão. + + + Utilizado para viajar pela água mais rapidamente do que a nadar. + + + Utilizada como tinta para criar lã verde. + + + Utilizada como tinta para criar lã vermelha. + + + Utilizada para o crescimento instantâneo de plantações, árvores, ervas altas, cogumelos gigantes e flores e pode ser usada em receitas de tinta. + + + Utilizada como tinta para criar lã cor-de-rosa. + + + Utilizada como tinta para criar lã castanha, como ingrediente para bolachas ou para fazer crescer Frutos de Cacau. + + + Utilizada como tinta para criar lã prateada. + + + Utilizada como tinta para criar lã amarela. + + + Utilizado para ataques à distância com setas. Dá ao utilizador 5 de Armadura quando em uso. @@ -622,18 +4351,18 @@ Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam ape Dá ao utilizador 1 de Armadura quando em uso. + + Dá ao utilizador 5 de Armadura quando em uso. + + + Dá ao utilizador 2 de Armadura quando em uso. + + + Dá ao utilizador 2 de Armadura quando em uso. + Dá ao utilizador 3 de Armadura quando em uso. - - Dá ao utilizador 8 de Armadura quando em uso. - - - Dá ao utilizador 6 de Armadura quando em uso. - - - Dá ao utilizador 3 de Armadura quando em uso. - Um lingote brilhante que pode ser usado para criar ferramentas feitas com este material. É criado ao derreteres minério numa fornalha. @@ -643,60 +4372,60 @@ Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam ape 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. + + Dá ao utilizador 8 de Armadura quando em uso. + + + Dá ao utilizador 6 de Armadura quando em uso. + + + Dá ao utilizador 3 de Armadura quando em uso. + + + Dá ao utilizador 6 de Armadura quando em uso. + + + As portas de ferro só podem ser abertas com Redstone, botões ou interruptores. + + + Dá ao utilizador 1 de Armadura quando em uso. + + + Dá ao utilizador 3 de Armadura quando em uso. + + + Utilizado para cortar blocos de madeira mais rápido do que com a mão. + + + Utilizada para lavrar blocos de terra e erva, para preparar colheitas. + + + As portas de madeira são ativadas através do uso, dando um golpe ou com Redstone. + + + Dá ao utilizador 2 de Armadura quando em uso. + + + Dá ao utilizador 4 de Armadura quando em uso. + + + Dá ao utilizador 1 de Armadura quando em uso. + + + Dá ao utilizador 2 de Armadura quando em uso. + + + Dá ao utilizador 1 de Armadura quando em uso. + + + Dá ao utilizador 2 de Armadura quando em uso. + + + Dá ao utilizador 5 de Armadura quando em uso. + Utilizado como escadas compactas. - - Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. - - - Utilizada para fazer escadas longas. Duas placas colocadas em cima uma da outra irão criar um bloco de tamanho normal com duas placas. - - - Utilizadas para criar luz. As tochas também derretem a neve e o gelo. - - - Utilizado como material de construção e pode servir para criar muitas coisas. Pode ser criado a partir de qualquer tipo de madeira. - - - Utilizado como material de construção. Não é influenciado pela gravidade, como a Areia normal. - - - Utilizado como material de construção. - - - Utilizado para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. - - - 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. - - - Permite-te criar uma seleção de objetos mais ampla do que na criação normal. - - - Permite-te fundir minério, criar carvão vegetal e vidro e também cozinhar peixe e costeletas de porco. - - - Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. - - - Utilizada como barreira que não se pode saltar. Conta como 1,5 blocos de altura para jogadores, animais e monstros, mas 1 bloco de altura para outros blocos. - - - Utilizado para subir na vertical. - - - 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. - - - Apresenta o texto introduzido por ti ou por outros jogadores. - - - Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. - - - Utilizado para causar explosões. É ativado depois da colocação com um objeto de Sílex e Aço, ou com uma descarga elétrica. - Utilizada para guardar guisado de cogumelos. Ficas com a tigela, depois de comeres o guisado. @@ -706,18 +4435,18 @@ Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam ape Utilizado para guardar e transportar água. + + Apresenta o texto introduzido por ti ou por outros jogadores. + + + Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + + + Utilizado para causar explosões. É ativado depois da colocação com um objeto de Sílex e Aço, ou com uma descarga elétrica. + Utilizado para guardar e transportar lava. - - Utilizado para guardar e transportar leite. - - - Utilizado para criar fogo, detonar TNT e abrir um portal, depois da sua construção. - - - Utilizada para apanhar peixe. - Mostra as posições do Sol e da Lua. @@ -727,1388 +4456,509 @@ Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam ape Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. - - Utilizado para ataques à distância com setas. + + Utilizado para guardar e transportar leite. - - Utilizadas como munições para os arcos. + + Utilizado para criar fogo, detonar TNT e abrir um portal, depois da sua construção. - - Restitui 2,5{*ICON_SHANK_01*}. + + Utilizada para apanhar peixe. - - Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. + + 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. - - Restitui 1{*ICON_SHANK_01*}. + + Utilizado como material de construção e pode servir para criar muitas coisas. Pode ser criado a partir de qualquer tipo de madeira. - - Restitui 1{*ICON_SHANK_01*}. + + Utilizado como material de construção. Não é influenciado pela gravidade, como a Areia normal. - - Restitui 3{*ICON_SHANK_01*}. + + Utilizado como material de construção. - - Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Se comeres isto podes ficar envenenado. - - - Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando galinha crua numa fornalha. - - - Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. - - - Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. - - - Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. - - - Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando uma costeleta de porco crua numa fornalha. - - - Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. Pode ser dado a comer a um Ocelote para o domesticar - - - Restitui 2,5{*ICON_SHANK_01*}. Cria-se cozinhando peixe cru numa fornalha. - - - Restitui 2{*ICON_SHANK_01*} e pode fazer uma maçã dourada. - - - Restitui 2{*ICON_SHANK_01*} e regenera a saúde durante 4 segundos. Faz-se de uma maçã e pepitas de ouro. - - - Restitui 2{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. - - - Utilizado na receita do bolo e como ingrediente para preparar poções. - - - Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. - - - Envia constantemente uma descarga elétrica ou pode ser utilizada como recetor/transmissor quando ligada à lateral de um bloco. Pode também ser utilizada para iluminação reduzida. - - - Utilizado em circuitos de Redstone como repetidor, retardador e/ou díodo. - - - Utilizado para enviar uma descarga elétrica ao ser pressionado. Permanece ativado durante cerca de um segundo, antes de se desligar. - - - Utilizado para segurar e disparar objetos em ordem aleatória, quando recebe uma descarga de Redstone. - - - Reproduz uma nota quando ativado. Toca-lhe para alterar a altura da nota. Se o colocares sobre blocos diferentes, mudará o tipo de instrumento. - - - Utilizado para conduzir vagonetas. - - - Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param em cima dele. - - - 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. - - - Utilizada para transportar bens pelos carris. - - - Desloca-se sobre carris e pode rebocar outras vagonetas, quando lhe colocas carvão. - - - Utilizado para viajar pela água mais rapidamente do que a nadar. - - - Recolhida a partir de ovelhas, pode ser colorida com tintas. - - - 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. - - - Utilizada como tinta para criar lã preta. - - - Utilizada como tinta para criar lã verde. - - - Utilizada como tinta para criar lã castanha, como ingrediente para bolachas ou para fazer crescer Frutos de Cacau. - - - Utilizada como tinta para criar lã prateada. - - - Utilizada como tinta para criar lã amarela. - - - Utilizada como tinta para criar lã vermelha. - - - Utilizada para o crescimento instantâneo de plantações, árvores, ervas altas, cogumelos gigantes e flores e pode ser usada em receitas de tinta. - - - Utilizada como tinta para criar lã cor-de-rosa. - - - Utilizada como tinta para criar lã cor-de-laranja. - - - Utilizada como tinta para criar lã verde-lima. - - - Utilizada como tinta para criar lã cinzenta. - - - 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.) - - - Utilizada como tinta para criar lã azul clara. - - - Utilizada como tinta para criar lã ciano. - - - Utilizada como tinta para criar lã roxa. - - - Utilizada como tinta para criar lã magenta. - - - Utilizada como tinta para criar lã azul. - - - Reproduz Discos de Música. - - - Utiliza-os para criar ferramentas, armas ou armaduras muito fortes. - - - Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. - - - Utilizado para criar livros e mapas. - - - Pode usar-se para criar estantes de livros ou, quando enfeitiçado, para fazer Livros Enfeitiçados. - - - Permite a criação de feitiços mais poderosos, quando colocada em redor da Mesa de Feitiços. - - - 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 para recolher carvão. - - - Pode ser extraído com uma picareta de pedra ou superior para recolher lápis-lazúli. - - - Pode ser extraído com uma picareta de ferro ou superior para recolher diamantes. - - - Pode ser extraído com uma picareta de ferro ou superior para recolher pó de Redstone. - - - Pode ser extraído com uma picareta para recolher pedra arredondada. - - - Recolhida com uma pá. Pode ser usada na construção. - - - Pode ser plantada e irá transformar-se numa árvore. - - - Não pode ser partida. - - - Incendeia tudo aquilo em que toca. Pode ser recolhida num balde. - - - 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. - - - Recolhe-se com uma pá. Por vezes produz sílex quando é escavada. É afetada pela gravidade, se não tiver um bloco por baixo. - - - Cortada com um machado, pode ser usada para criar tábuas ou como combustível. - - - Criado numa fornalha derretendo areia. Pode ser usado na construção, mas irá partir, se tentares escavá-lo. - - - Retirado da pedra com uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. - - - Cozido a partir de barro numa fornalha. - - - Pode ser cozido sob a forma de tijolos numa fornalha. - - - Quando partidos, produzem bolas de barro que podem ser cozidas para criar tijolos, numa fornalha. - - - Uma forma compacta de armazenar bolas de neve. - - - Pode ser escavada com uma pá para criar bolas de neve. - - - Por vezes produz sementes de trigo, quando partido. - - - Pode ser usada para criar tinta. - - - Produz guisado, com uma tigela. - - - Só pode ser extraída com uma picareta de diamante. É produzida através de uma combinação de água e lava e é utilizada para construir portais. - - - Faz aparecer monstros no mundo. - - - É colocado no chão para transportar uma carga elétrica. Quando utilizado como ingrediente duma poção, aumenta a duração do efeito. - - - 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. - - - 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. - - - Abranda o movimento de tudo aquilo que lhe passar por cima. - - - 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. - - - 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! - - - Recolhido nas plantações, pode ser usado 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 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 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - Podem ser plantadas para produzir abóboras. - - - 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. - - - 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. - - - Crescem ao longo do tempo depois de plantadas. Podem ser recolhidas com tesouras. Podem ser escaladas como escadas. - - - 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. - - - 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. - - - Podem ter vários efeitos, consoante o uso. - - - Pode ser enchida de água e usada como ingrediente inicial, no Posto de Poções. - - - Um alimento venenoso e ingrediente para poções. É produzido quando uma Aranha ou Aranha das Cavernas é morta por um jogador. - - - Utilizado na preparação de poções, principalmente para criar poções com efeito negativo. - - - Utilizado na preparação de poções ou criado juntamente com outros objetos para criar Olho de Ender ou Creme de Magma. - - - Usado na preparação de poções. - - - Utilizado para fazer Poções e Poções Explosivas. - - - Enche-se com água utilizando um balde ou com a chuva e pode ser usado para encher Garrafas de Vidro com água. - - - 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. - - - 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. - - - Encontra-se nas Fortalezas do Submundo e produz Verrugas do Submundo quando se parte. - - - Permite aos jogadores enfeitiçarem Espadas, Picaretas, Machados, Pás, Arcos e Armaduras, utilizando os Pontos de Experiência do jogador. - - - Pode ser ativado utilizando doze Olhos de Ender e permite ao jogador viajar até à dimensão de O Fim. - - - Usadas para formar um Portal de O Fim. - - - 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. - - - Útil para incendiar coisas, ou para iniciar incêndios indiscriminadamente quando disparadas de um Distribuidor. - - - 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. - - Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho 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. - - Criado através da fundição de Rocha do Submundo numa fornalha. Pode ser transformado em blocos de Tijolo do Submundo. + + Utilizadas para criar luz. As tochas também derretem a neve e o gelo. - - Quando alimentados emitem luz. + + Utilizado para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. - - Pode ser colhido para recolher Grãos de Cacau. + + Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. - - As Cabeças de Habitantes podem ser colocadas como decoração ou usadas como máscara, no campo do capacete. + + 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. - - Lula + + Utilizado para subir na vertical. - - Solta sacos de tinta quando é morta. + + 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. - - Vaca + + Permite-te criar uma seleção de objetos mais ampla do que na criação normal. - - 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 tingida 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, mas ataca em grupos, se atacares um deles. - - - Ghast - - - Dispara bolas flamejantes que explodem por 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 - - - Faz guisado de cogumelos, quando usada com uma tigela. 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. Atiram bolas de neve aos inimigos dos seus criadores. - - - Ender Dragon - - - 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. - - - 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 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. - - - 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 - - - Diretor de Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Diretor, XBLA Publishing - - - Business Development - - - Diretor de Portfolio - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Espada de Madeira - - - Espada de Pedra - - - Espada de Ferro - - - Espada de Diamante - - - Espada de Ouro - - - Pá de Madeira - - - Pá de Pedra - - - Pá de Ferro - - - Pá de Diamante - - - Pá de Ouro - - - Picareta de Madeira - - - Picareta de Pedra - - - Picareta de Ferro - - - Picareta de Diamante - - - Picareta de Ouro - - - Machado de Madeira - - - Machado de Pedra + + Permite-te fundir minério, criar carvão vegetal e vidro e também cozinhar peixe e costeletas de porco. Machado de Ferro - - Machado de Diamante + + Candeeiro de Redstone - - Machado de Ouro + + Escadas da Selva - - Enxada de Madeira + + Escadas de Bétula - - Enxada de Pedra + + Controlos Atuais - - Enxada de Ferro - - - Enxada de Diamante - - - Enxada de Ouro - - - Porta de Madeira - - - Porta de Ferro - - - Capacete de Corrente - - - Colete de Corrente - - - Calças de Corrente - - - Botas de Corrente - - - Boné de Cabedal - - - Capacete de Ferro - - - Capacete de Diamante - - - Capacete de Ouro - - - Túnica de Cabedal - - - Colete de Ferro - - - Colete de Diamante - - - Colete de Ouro - - - Calças de Cabedal - - - Leggings de Ferro - - - Leggings de Diamante - - - Leggings de Ouro - - - Botas de Cabedal - - - Botas de Ferro - - - Botas de Diamante - - - Botas de Ouro - - - Lingote de Ferro - - - Lingote de Ouro - - - Balde - - - Balde de Água - - - Balde de Lava - - - Sílex e Aço - - - Maçã - - - Arco - - - Seta - - - Carvão - - - Carvão Vegetal - - - Diamante - - - Pau - - - Tigela - - - Guisado de Cogumelos - - - Fio - - - Pena - - - Pólvora - - - Sementes de Trigo - - - Trigo - - - Pão - - - Sílex - - - Costeleta de Porco Crua - - - Costeleta de Porco Cozinhada - - - Pintura - - - Maçã de Ouro - - - Sinal - - - Vagoneta - - - Sela - - - Redstone - - - Bola de Neve - - - Barco - - - Cabedal - - - Balde de Leite - - - Tijolo - - - Barro - - - Canas de Açúcar - - - Papel - - - Livro - - - Slimeball - - - Vagoneta com Baú - - - Vagoneta com Fornalha - - - Ovo - - - Bússola - - - Cana de Pesca - - - Relógio - - - Pó de Glowstone - - - Peixe Cru - - - Peixe Cozinhado - - - Pó de Tinta - - - Saco de Tinta - - - Vermelho Rosa - - - Verde Cato - - - Grãos de Cacau - - - Lápis-lazúli - - - Tinta Roxa - - - Tinta Ciano - - - Tinta Cinzenta Clara - - - Tinta Cinzenta - - - Tinta Cor-de-rosa - - - Tinta Verde-lima - - - Amarelo Dente-de-leão - - - Tinta Azul Clara - - - Tinta Magenta - - - Tinta Cor-de-Laranja - - - Farinha de Ossos - - - Osso - - - Açúcar - - - Bolo - - - Cama - - - Repetidor de Redstone - - - Bolacha - - - Mapa - - - Disco de Música - "13" - - - Disco de Música - "cat" - - - Disco de Música - "blocks" - - - Disco de Música - "chirp" - - - Disco de Música - "far" - - - Disco de Música - "mall" - - - Disco de Música - "mellohi" - - - Disco de Música - "stal" - - - Disco de Música - "strad" - - - Disco de Música - "ward" - - - Disco de Música - "11" - - - Disco de Música - "where are we now" - - - Tesoura - - - Sementes de Abóbora - - - Sementes de Melão - - - Galinha Crua - - - Galinha Cozinhada - - - Bife Cru - - - Bife - - - Carne Podre - - - Pérola de Ender - - - Fatia de Melão - - - Varinha de Blaze - - - Lágrima de Ghast - - - Pepita de Ouro - - - Verruga do Submundo - - - Poção{*splash*}{*prefix*}{*postfix*} - - - Garrafa de Vidro - - - Garrafa de Água - - - Olho de Aranha - - - Olho Aranha Ferm. - - - Pó de Blaze - - - Creme de Magma - - - Posto de Poções - - - Caldeirão - - - Olho de Ender - - - Melão Brilhante - - - Garrafa Mágica - - - Carga de Fogo - - - Carga Fogo Carv. Veg. - - - Carga Fogo (Carvão) - - - Moldura de Item - - - Gerar {*CREATURE*} - - - Tijolo de Submundo - - + Caveira - - Caveira de Esqueleto + + Cacau - - Caveira de Esqueleto Atrofiado + + Escadas de Abeto - - Cabeça de Morto-vivo + + Ovo de Dragão - - Cabeça + + Pedra do Fim - - Cabeça de %s + + Estrutura de Portal do Fim - - Cabeça de Creeper + + Escadas de Grés - - Pedra + + Feto - - Bloco de Erva + + Arbusto - - Terra + + Esquema - - Pedra Arredondada + + Criar - - Tábuas de Carvalho + + Usar - - Tábuas de Abeto + + Ação - - Tábuas de Bétula + + Rastejar/Voar Para Baixo - - Tábuas da Selva + + Rastejar - - Rebento + + Largar - - Carvalho Jovem + + Mudar o Objeto Agarrado - - Abeto Jovem + + Pausa - - Bétula Jovem + + Olhar - - Rebentos de Árvores da Selva + + Mover/Sprint - - Rocha + + Inventário - - Água + + Saltar/Voar Para Cima - - Lava + + Saltar - - Areia + + Portal do Fim - - Arenito + + Caule de Abóbora - - Gravilha + + Melão - - Minério de Ouro + + Painel de Vidro - - Minério de Ferro + + Portão de Vedação - - Minério de Carvão + + Trepadeiras - - Madeira + + Caule de Melão - - Madeira de Carvalho + + Barras de Ferro - - Madeira de Abeto + + Tijolos de Pedra Rachada - - Madeira de Bétula + + Tijolos de Pedra com Musgo - - Madeira da Selva + + Tijolos de Pedra + + + Cogumelo + + + Cogumelo + + + Tijolos de Pedra Burilados + + + Escadas de Tijolo + + + Verruga do Submundo + + + Escadas (Tijolo Submundo) + + + Cerca (Tijolos Submundo) + + + Caldeirão + + + Posto de Poções + + + Mesa de Feitiços + + + Tijolo de Submundo + + + Pedra Arredondada com Peixe Prateado + + + Pedra com Peixe Prateado + + + Escadas (Tijolo de Pedra) + + + Folha de Nenúfar + + + Micélio + + + Tijolo de Pedra com Peixe Prateado + + + Alterar Modo de Câmara + + + 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. + + + À 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. + + + À medida que recolhes e crias mais objetos, o teu inventário fica mais cheio.{*B*} + Prime{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + + + A madeira que recolhes pode ser transformada em tábuas. Abre a interface de criação para as criares.{*PlanksIcon*} + + + 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*} + + + 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. + + + Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação. + + + 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. + + + Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares. + + + Usa{*CONTROLLER_ACTION_LOOK*} para olhares para cima, para baixo e em redor. + + + 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. + + + 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... + + + Prime{*CONTROLLER_ACTION_JUMP*} para saltar. + + + 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*} + + + + 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. + + + + Abre o contentor + + + 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*} + + + 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*} + + + + 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. + + + + + Nas redondezas, existe um abrigo de Mineiros abandonado, que podes completar para garantir a tua segurança durante a noite. + + + + 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*} + + + 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. + + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para alterares o objeto que estás a segurar. + + + 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*} + + + 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*} + + + Aponta a mira para a mesa de criação e prime{*CONTROLLER_ACTION_USE*} para a abrires. + + + 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. + + + Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. +À noite, os monstros andam à solta; constrói um abrigo antes que isso aconteça. + + + + + + + + + + + + + + + + + + + + + + + + Esquema 1 + + + Movimento (Em Voo) + + + Jogadores/Convidar + + + + + + Esquema 3 + + + Esquema 2 + + + + + + + + + + + + + + + {*B*}Prime{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Prime{*CONTROLLER_VK_B*} se achas que estás preparado para jogar sozinho. + + + {*B*}Prime{*CONTROLLER_VK_A*} para continuar. + + + + + + + + + + + + + + + + + + + + + + + + + + + Bloco de Peixe Prateado + + + Placa de Pedra + + + Uma forma compacta de armazenar Ferro. + + + Bloco de Ferro + + + Placa de Madeira de Carvalho + + + Placa de Arenito + + + Placa de Pedra + + + Uma forma compacta de armazenar Ouro. + + + Flor + + + Lã Branca + + + Lã Cor-de-laranja + + + Bloco de Ouro + + + Cogumelo + + + Rosa + + + Placa (Pedra Arredondada) + + + Estante de Livros + + + TNT + + + Tijolos + + + Tocha + + + Obsidiana + + + Pedra com Musgo + + + Placa (Tijolo do Submundo) + + + Placa de Carvalho + + + Placa de Tijolos Pedra + + + Placa de Tijolo + + + Placa de Madeira da Selva + + + Placa de Madeira de Bétula + + + Placa de Madeira de Abeto + + + Lã Magenta + + + Folhas de Bétula + + + Folhas de Abeto + + + Folhas de Carvalho + + + Vidro + + + Esponja + + + Folhas da Selva + + + Folhas Carvalho @@ -2119,711 +4969,676 @@ Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam ape Bétula - - Folhas + + Madeira de Abeto - - Folhas de Carvalho + + Madeira de Bétula - - Folhas de Abeto - - - Folhas de Bétula - - - Folhas da Selva - - - Esponja - - - Vidro + + Madeira da Selva - - Lã Preta - - - Lã Vermelha - - - Lã Verde - - - Lã Castanha - - - Lã Azul - - - Lã Roxa - - - Lã Ciano - - - Lã Cinzenta Clara + + Lã Cor-de-rosa Lã Cinzenta - - Lã Cor-de-rosa - - - Lã Verde-lima - - - Lã Amarela + + Lã Cinzenta Clara Lã Azul Clara - - Lã Magenta + + Lã Amarela - - Lã Cor-de-laranja + + Lã Verde-lima - - Lã Branca + + Lã Ciano - - Flor + + Lã Verde - - Rosa + + Lã Vermelha - - Cogumelo + + Lã Preta - - Bloco de Ouro + + Lã Roxa - - Uma forma compacta de armazenar Ouro. + + Lã Azul - - Bloco de Ferro - - - Uma forma compacta de armazenar Ferro. - - - Placa de Pedra - - - Placa de Pedra - - - Placa de Arenito - - - Placa de Madeira de Carvalho - - - Placa (Pedra Arredondada) - - - Placa de Tijolo - - - Placa de Tijolos Pedra - - - Placa de Carvalho - - - Placa de Madeira de Abeto - - - Placa de Madeira de Bétula - - - Placa de Madeira da Selva - - - Placa (Tijolo do Submundo) - - - Tijolos - - - TNT - - - Estante de Livros - - - Pedra com Musgo - - - Obsidiana - - - Tocha + + Lã Castanha Tocha (Carvão) - - Tocha (Carvão Vegetal) - - - Fogo - - - Gerador de Monstros - - - Escadas de Carvalho - - - Baú - - - Pó de Redstone - - - Minério de Diamante - - - Bloco de Diamante - - - Uma forma compacta de armazenar Diamantes. - - - Mesa de Criação - - - Plantações - - - Terreno de Cultivo - - - Fornalha - - - Sinal - - - Porta de Madeira - - - Escadote - - - Carril - - - Carril Eletrificado - - - Carril Detetor - - - Escadas de Pedra - - - Alavanca - - - Placa de Pressão - - - Porta de Ferro - - - Minério de Redstone - - - Tocha Redstone - - - Botão - - - Neve - - - Gelo - - - Cato - - - Barro - - - Cana de Açúcar - - - Jukebox - - - Cerca - - - Abóbora - - - Jack-O-Lantern - - - Bloco do Submundo + + Glowstone Areia Movediça - - Glowstone - - - Portal - - - Minério de Lápis-lazúli + + Bloco do Submundo Bloco de Lápis-lazúli + + Minério de Lápis-lazúli + + + Portal + + + Jack-O-Lantern + + + Cana de Açúcar + + + Barro + + + Cato + + + Abóbora + + + Cerca + + + Jukebox + Uma forma compacta de armazenar Lápis-Lazúli. - - Distribuidor - - - Bloco de Notas - - - Bolo - - - Cama - - - Teia - - - Erva Alta - - - Arbusto Morto - - - Díodo - - - Baú Fechado - Alçapão - - Lã (qualquer cor) + + Baú Fechado - - Pistão + + Díodo Pistão Pegajoso - - Bloco de Peixe Prateado + + Pistão - - Tijolos de Pedra + + Lã (qualquer cor) - - Tijolos de Pedra com Musgo + + Arbusto Morto - - Tijolos de Pedra Rachada + + Bolo - - Tijolos de Pedra Burilados + + Bloco de Notas - - Cogumelo + + Distribuidor - - Cogumelo + + Erva Alta - - Barras de Ferro + + Teia - - Painel de Vidro + + Cama - - Melão + + Gelo - - Caule de Abóbora + + Mesa de Criação - - Caule de Melão + + Uma forma compacta de armazenar Diamantes. - - Trepadeiras + + Bloco de Diamante - - Portão de Vedação + + Fornalha - - Escadas de Tijolo + + Terreno de Cultivo - - Escadas (Tijolo de Pedra) + + Plantações - - Pedra com Peixe Prateado + + Minério de Diamante - - Pedra Arredondada com Peixe Prateado + + Gerador de Monstros - - Tijolo de Pedra com Peixe Prateado + + Fogo - - Micélio + + Tocha (Carvão Vegetal) - - Folha de Nenúfar + + Pó de Redstone - - Tijolo de Submundo + + Baú - - Cerca (Tijolos Submundo) + + Escadas de Carvalho - - Escadas (Tijolo Submundo) + + Sinal - - Verruga do Submundo + + Minério de Redstone - - Mesa de Feitiços + + Porta de Ferro - - Posto de Poções + + Placa de Pressão - - Caldeirão + + Neve - - Portal do Fim + + Botão - - Estrutura de Portal do Fim + + Tocha Redstone - - Pedra do Fim + + Alavanca - - Ovo de Dragão + + Carril - - Arbusto + + Escadote - - Feto + + Porta de Madeira - - Escadas de Grés + + Escadas de Pedra - - Escadas de Abeto + + Carril Detetor - - Escadas de Bétula - - - Escadas da Selva - - - Candeeiro de Redstone - - - Cacau - - - Caveira - - - Controlos Atuais - - - Esquema - - - Mover/Sprint - - - Olhar - - - Pausa - - - Saltar - - - Saltar/Voar Para Cima - - - Inventário - - - Mudar o Objeto Agarrado - - - Ação - - - Usar - - - Criar - - - Largar - - - Rastejar - - - Rastejar/Voar Para Baixo - - - Alterar Modo de Câmara - - - Jogadores/Convidar - - - Movimento (Em Voo) - - - Esquema 1 - - - Esquema 2 - - - Esquema 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;]]> - - - <![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*}Prime{*CONTROLLER_VK_A*} para continuar. - - - {*B*}Prime{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} - Prime{*CONTROLLER_VK_B*} se achas que estás preparado para jogar sozinho. - - - Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. -À noite, os monstros andam à solta; constrói um abrigo antes que isso aconteça. - - - Usa{*CONTROLLER_ACTION_LOOK*} para olhares para cima, para baixo e em redor. - - - Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares. - - - Para fazeres um sprint, prime rapidamente {*CONTROLLER_ACTION_MOVE*} para a frente duas vezes. Mantém {*CONTROLLER_ACTION_MOVE*} premido para a frente para a personagem continuar o sprint, até se esgotar o tempo ou a comida. - - - Prime{*CONTROLLER_ACTION_JUMP*} para saltar. - - - Mantém premido{*CONTROLLER_ACTION_ACTION*} para escavar e cortar, utilizando as mãos ou os objetos que estiveres a segurar. Podes ter de criar uma ferramenta para escavares alguns blocos... - - - Mantém premido{*CONTROLLER_ACTION_ACTION*} para cortares 4 blocos de madeira (troncos de árvore).{*B*}Quando um bloco parte, podes apanhá-lo aproximando-te do objeto flutuante que surge, o que faz com que este apareça no teu inventário. - - - Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação. - - - À medida que recolhes e crias mais objetos, o teu inventário fica mais cheio.{*B*} - Prime{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. - - - À medida que te movimentas, escavas e atacas, vais gastando a barra de comida {*ICON_SHANK_01*}. Se fizeres sprint ou saltos em sprint, gastas muito mais comida do que ao caminhar ou saltar normalmente. - - - Se perderes saúde, mas tiveres uma barra de comida com 9 ou mais{*ICON_SHANK_01*}, a tua saúde é restaurada automaticamente. Come para restaurares a barra de comida. - - - Com um alimento na mão, prime{*CONTROLLER_ACTION_USE*} para comeres e restaurares a barra de comida. Não podes comer se a barra de comida estiver cheia. - - - A tua barra de comida está em baixo e perdeste alguma saúde. Come o bife que se encontra no teu inventário para restaurares a barra de comida e começares a curar-te.{*ICON*}364{*/ICON*} - - - A madeira que recolhes pode ser transformada em tábuas. Abre a interface de criação para as criares.{*PlanksIcon*} - - - Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Produz uma mesa de criação.{*CraftingTableIcon*} - - - Para recolheres blocos mais rapidamente, podes construir ferramentas específicas para essa tarefa. Algumas ferramentas têm uma pega feita de paus. Cria agora alguns paus.{*SticksIcon*} - - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para alterares o objeto que estás a segurar. - - - 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. - - - Com a mesa de criação selecionada, aponta a mira para o local onde a queres colocar e usa{*CONTROLLER_ACTION_USE*} para colocares uma mesa de criação. - - - Aponta a mira para a mesa de criação e prime{*CONTROLLER_ACTION_USE*} para a abrires. - - - As pás ajudam a escavar mais rapidamente os blocos moles, como terra e neve. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e duram mais tempo. Cria uma pá de madeira.{*WoodenShovelIcon*} - - - 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*} - - - 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*} - - - Abre o contentor - - - - 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. - - - - - Nas redondezas, existe um abrigo de Mineiros abandonado, que podes completar para garantir a tua segurança durante a noite. - - - - - Terás de recolher os recursos necessários para completar o abrigo. Podes construir as paredes e o teto com qualquer tipo de bloco, mas também terás de criar uma porta, algumas janelas e iluminação. - - - - Utiliza a tua picareta para escavares alguns blocos de pedra. Os blocos de pedra produzem pedras arredondadas quando escavados. Se conseguires recolher 8 blocos de pedra arredondada, poderás construir uma fornalha. Pode ser necessário escavar alguma terra para chegares à pedra, por isso usa a tua pá nesta tarefa.{*StoneIcon*} + + Carril Eletrificado Recolheste pedras arredondadas suficientes para construir uma fornalha. Utiliza a tua mesa de criação para criares uma. - - Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. + + Cana de Pesca - - Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + + Relógio - - Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + + Pó de Glowstone - - 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*} + + Vagoneta com Fornalha - - Usa{*CONTROLLER_ACTION_USE*} para colocar a porta. Podes usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + + Ovo - - À 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*} + + Bússola - + + Peixe Cru + + + Vermelho Rosa + + + Verde Cato + + + Grãos de Cacau + + + Peixe Cozinhado + + + Pó de Tinta + + + Saco de Tinta + + + Vagoneta com Baú + + + Bola de Neve + + + Barco + + + Cabedal + + + Vagoneta + + + Sela + + + Redstone + + + Balde de Leite + + + Papel + + + Livro + + + Slimeball + + + Tijolo + + + Barro + + + Canas de Açúcar + + + Lápis-lazúli + + + Mapa + + + Disco de Música - "13" + + + Disco de Música - "cat" + + + Cama + + + Repetidor de Redstone + + + Bolacha + + + Disco de Música - "blocks" + + + Disco de Música - "mellohi" + + + Disco de Música - "stal" + + + Disco de Música - "strad" + + + Disco de Música - "chirp" + + + Disco de Música - "far" + + + Disco de Música - "mall" + + + Bolo + + + Tinta Cinzenta + + + Tinta Cor-de-rosa + + + Tinta Verde-lima + + + Tinta Roxa + + + Tinta Ciano + + + Tinta Cinzenta Clara + + + Amarelo Dente-de-leão + + + Farinha de Ossos + + + Osso + + + Açúcar + + + Tinta Azul Clara + + + Tinta Magenta + + + Tinta Cor-de-Laranja + + + Sinal + + + Túnica de Cabedal + + + Colete de Ferro + + + Colete de Diamante + + + Capacete de Ferro + + + Capacete de Diamante + + + Capacete de Ouro + + + Colete de Ouro + + + Leggings de Ouro + + + Botas de Cabedal + + + Botas de Ferro + + + Calças de Cabedal + + + Leggings de Ferro + + + Leggings de Diamante + + + Boné de Cabedal + + + Enxada de Pedra + + + Enxada de Ferro + + + Enxada de Diamante + + + Machado de Diamante + + + Machado de Ouro + + + Enxada de Madeira + + + Enxada de Ouro + + + Colete de Corrente + + + Calças de Corrente + + + Botas de Corrente + + + Porta de Madeira + + + Porta de Ferro + + + Capacete de Corrente + + + Botas de Diamante + + + Pena + + + Pólvora + + + Sementes de Trigo + + + Tigela + + + Guisado de Cogumelos + + + Fio + + + Trigo + + + Costeleta de Porco Cozinhada + + + Pintura + + + Maçã de Ouro + + + Pão + + + Sílex + + + Costeleta de Porco Crua + + + Pau + + + Balde + + + Balde de Água + + + Balde de Lava + + + Botas de Ouro + + + Lingote de Ferro + + + Lingote de Ouro + + + Sílex e Aço + + + Carvão + + + Carvão Vegetal + + + Diamante + + + Maçã + + + Arco + + + Seta + + + Disco de Música - "ward" + + + 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*} + + + 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*} + + + 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. + + + 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. + + + 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*} + + + 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*} + + + 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*} + + + 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. + + - Concluíste a primeira parte do tutorial. - - - - {*B*} -Prime{*CONTROLLER_VK_A*} para continuares o tutorial.{*B*} -Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. - - - - Este é o teu inventário. Mostra os objetos disponíveis que tens na mão e todos os objetos que estás a transportar. A tua armadura também é mostrada aqui. + 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. + + + + 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. + + + + Está agora em exibição a lista de ingredientes necessários para criar o objeto selecionado. + + + 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. + + + 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. + + + Alguns objetos não podem ser criados utilizando a mesa de criação, mas com uma fornalha. Cria agora uma fornalha.{*FurnaceIcon*} + + + Gravilha + + + Minério de Ouro + + + Minério de Ferro + + + Lava + + + Areia + + + Arenito + + + Minério de Carvão + + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar a fornalha. + + + 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. + + + 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. + + + Madeira + + + Madeira de Carvalho + + + 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. + + + {*B*} + Prime{*CONTROLLER_VK_X*} para apresentar novamente o inventário. {*B*} Prime{*CONTROLLER_VK_A*} para continuar.{*B*} Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário. - + - Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para 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. + 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 continuares o tutorial.{*B*} +Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. + + + + Se deslocares o ponteiro para fora dos limites do interface, com um objeto selecionado, podes largar o objeto. @@ -2832,51 +5647,37 @@ Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para os colocares todos ou{*CONTROLLER_VK_X*} para colocares apenas um. - + - Se deslocares o ponteiro para fora dos limites do interface, com um objeto selecionado, podes largar o objeto. + 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. - - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_BACK*}. - - - Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. - - - Este é o inventário do modo criativo. Mostra os objetos disponíveis para usares com as mãos e todos os outros objetos que podes escolher. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. - - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. - Na lista de objetos, usa{*CONTROLLER_VK_A*} para recolheres um objeto sob o ponteiro e usa{*CONTROLLER_VK_Y*} para recolheres todas as unidades desse objeto. + + + Concluíste a primeira parte do tutorial. - - - 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. - + + Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? - - - 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*}. - + + Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? - - - 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. - + + Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. - - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_BACK*}. + + À 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*} - - - Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. + + Usa{*CONTROLLER_ACTION_USE*} para colocar a porta. Podes usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no 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*} + + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2884,2144 +5685,259 @@ Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. Este é o interface de criação. Permite-te combinar os objetos que recolheste para criares novos objetos. - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes criar. + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. + - - {*B*} - Prime{*CONTROLLER_VK_X*} para apresentar a descrição do objeto. + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + {*B*} Prime{*CONTROLLER_VK_X*} para apresentar os ingredientes necessários para criar o objeto atual. - + {*B*} - Prime{*CONTROLLER_VK_X*} para apresentar novamente o inventário. + Prime{*CONTROLLER_VK_X*} para apresentar a descrição do objeto. - - - Desloca-te pelos separadores de Tipo de Grupo no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que pretendes criar e depois usa{*CONTROLLER_MENU_NAVIGATE*} para selecionares o objeto a criar. - - - - - A área de criação mostra os objetos de que necessitas para criares o novo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e colocá-lo no teu inventário. - - - - Podes criar uma seleção maior de objetos utilizando uma mesa de criação. A criação na mesa funciona da mesma forma que a criação básica, mas tens à tua disposição uma área maior e mais combinações de ingredientes. - - - A 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. - - - 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. - - - Está agora em exibição a lista de ingredientes necessários para criar o objeto selecionado. - - - 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*} - - - Agora que construíste uma mesa de criação, tens de colocá-la no mundo para te permitir criar uma seleção mais ampla de objetos.{*B*} -Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. - - - Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de objetos que pretendes criar. Seleciona o grupo de ferramentas.{*ToolsIcon*} - - - Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de objetos que pretendes criar. Seleciona o grupo de estruturas.{*StructuresIcon*} - - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mudares para o objeto que desejas criar. Alguns objetos têm várias versões, consoante os materiais utilizados. Seleciona a pá de madeira.{*WoodenShovelIcon*} - - - Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Usa{*CONTROLLER_MENU_NAVIGATE*} para mudares para o objeto que queres criar. Seleciona a mesa de criação.{*CraftingTableIcon*} - - - Com as 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. - - - Alguns objetos não podem ser criados utilizando a mesa de criação, mas com uma fornalha. Cria agora uma fornalha.{*FurnaceIcon*} - - - Coloca a fornalha que criaste no mundo. Deves colocá-la dentro do abrigo.{*B*} -Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. - - - Esta é a interface da fornalha. A fornalha permite-te alterar os objetos através do fogo. Por exemplo, podes transformar minério de ferro em lingotes de ferro. - - + {*B*} Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes utilizar a fornalha. + Prime{*CONTROLLER_VK_B*} se já sabes criar. - - 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. - - - Muitos objetos de madeira podem ser usados como combustíveis, mas nem todos queimam durante o mesmo tempo. Podes também descobrir outros objetos no mundo que podem ser usados como combustível. - - - Depois de 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. - - - 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. - - - O carvão vegetal pode ser usado como combustível ou para criar tochas, juntamente com um pau. - - - Para fazeres vidro, coloca areia no espaço dos ingredientes. Cria blocos de vidro para usares como janelas para o teu abrigo. - - - Esta é a interface de preparação de poções. Podes utilizá-la para criar poções com diferentes efeitos. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes como usar o posto de poções. - - - Podes preparar poções colocando um ingrediente no 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. - - - Todas as poções começam com uma Garrafa de Água. A maioria das poções são criadas utilizando uma Verruga do Submundo para criar uma Poção Estranha e necessitam de pelo menos mais um ingrediente para criar a poção final. - - - Depois de criares uma poção, podes modificar os seus efeitos. Se adicionares Pó de Redstone, aumentas a duração do efeito, e se adicionares Pó de Glowstone, o efeito será mais poderoso. - - - Se adicionares Olho de Aranha Fermentado, 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. - - - Cria uma Poção de Resistência ao Fogo juntando uma Verruga de Submundo a uma Garrafa de Água e adicionando Creme de Magma. - - - Prime{*CONTROLLER_VK_B*} agora para saíres da interface de preparação de poções. - - - Nesta área existe um Posto de Poções, um Caldeirão e um baú cheio de ingredientes para criar poções. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre poções e a sua preparação.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre poções e a sua preparação. - - - O primeiro passo para preparar uma poção é criar uma Garrafa de Água. Retira uma Garrafa de Vidro do baú. - - - Podes encher uma garrafa de vidro num Caldeirão com água ou a partir de um bloco de água. Enche a garrafa de vidro apontando para a fonte de água e premindo{*CONTROLLER_ACTION_USE*}. - - - Se esvaziares o caldeirão, podes voltar a enchê-lo com um Balde de Água. - - - Utiliza o Posto de Poções para criar uma Poção de Resistência ao Fogo. Precisas de uma Garrafa de Água, uma Verruga do Submundo e Creme de Magma. - - + - Com uma poção na mão, 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. - - - - Utiliza a Poção de Resistência ao Fogo em ti mesmo. - - - Agora que és resistente ao fogo e à lava, poderás ir a sítios onde nunca foste. - - - Esta é a interface dos feitiços que podes usar para enfeitiçar armas, armaduras e algumas ferramentas. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre a interface de feitiços.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a interface de feitiços. - - - Para enfeitiçares um objeto, 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. - - - 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. - - - 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. - - - Seleciona um feitiço e prime{*CONTROLLER_VK_A*} para enfeitiçar o objeto. Isto irá diminuir o teu nível de experiência, consoante o custo do feitiço. - - - Apesar 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. - - - Nesta área existe uma Mesa de Feitiços e outros objetos que te ajudarão a aprender tudo sobre feitiços. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre feitiços.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre feitiços. - - - - Utilizar uma Mesa de Feitiços permite-te adicionar efeitos especiais, tais como aumentar o número de objetos produzidos ao escavar um bloco ou melhorar a resistência a armas, armaduras e algumas ferramentas. - - - Colocar estantes em redor da Mesa de Feitiços aumenta o seu poder e permite o acesso a feitiços de nível mais alto. - - - Enfeitiçar objetos tem um custo em Níveis de 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. - - - 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. - - - 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. - - - Estás a conduzir uma vagoneta. Para saíres da vagoneta, coloca o ponteiro sobre a vagoneta e prime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - - {*B*} - Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre vagonetas.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre vagonetas. - - - As vagonetas andam sobre carris. Podes criar uma vagoneta motorizada com uma fornalha e uma vagoneta com baú dentro dela. - {*RailIcon*} - - - 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*} - - - Estás a navegar num barco. Para saíres do barco, coloca o ponteiro sobre o mesmo e prime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre barcos.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre barcos. - - - O barco permite-te viajar mais rapidamente sobre a água. Podes conduzi-lo utilizando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - Estás a usar uma cana de pesca. Prime{*CONTROLLER_ACTION_USE*} para a usares.{*FishingRodIcon*} - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre pesca.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre pesca. - - - Prime{*CONTROLLER_ACTION_USE*} para lançares a linha e começares a pescar. Prime{*CONTROLLER_ACTION_USE*} novamente para enrolares a linha de pesca. - {*FishingRodIcon*} - - - Para apanhares peixe, espera até que o flutuador mergulhe na água e só depois deves enrolar a linha. O peixe pode ser comido cru ou cozinhado na fornalha, para restituir saúde. - {*FishIcon*} - - - Tal como acontece com outras ferramentas, a cana de pesca tem um número limitado de utilizações. Mas as utilizações não se limitam à pesca. Faz experiências para veres que outras coisas podes apanhar ou ativar... - {*FishingRodIcon*} - - - Isto é uma cama. De noite, prime{*CONTROLLER_ACTION_USE*} enquanto apontas para a cama, para dormires e acordares de manhã.{*ICON*}355{*/ICON*} - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre camas.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre camas. - - - A cama deve ser colocada num local seguro e bem iluminado, para que os monstros não te acordem a meio da noite. Depois de usares uma cama, se morreres serás ressuscitado nessa cama. - {*ICON*}355{*/ICON*} - - - Se existirem outros jogadores no teu jogo, todos têm de estar na cama ao mesmo tempo, para poderem dormir. - {*ICON*}355{*/ICON*} - - - Nesta área existem alguns circuitos simples de Redstone e Pistões, além de um baú com mais objetos para aumentar estes circuitos. - - - {*B*} - Prime {*CONTROLLER_VK_A*} para saberes mais sobre os circuitos de Redstone e pistões.{*B*} - Prime {*CONTROLLER_VK_B*} se já sabes tudo sobre os circuitos de Redstone e pistões. - - - As Alavancas, Botões, Placas de Pressão e Tochas de Redstone podem fornecer energia aos circuitos, acoplando-os diretamente ao objeto que queres ativar ou ligando-os com pó de Redstone. - - - A posição e direção em que colocas uma fonte de energia pode alterar a forma como afeta os blocos circundantes. Por exemplo, uma tocha de Redstone ao lado de um bloco pode ser apagada, se o bloco for alimentado por outra fonte. - - - - O pó de Redstone é recolhido através da extração de 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*} - - - - - Os repetidores de Redstone podem ser usados para aumentar o alcance da energia ou colocar um retardador no circuito. - {*ICON*}356{*/ICON*} - - - - - Quando é ativado, o Pistão estica e empurra até 12 blocos. Quando recolhem, os Pistões Pegajosos conseguem puxar um bloco de quase todos os tipos. - {*ICON*}33{*/ICON*} - - - - No baú, nesta área, existem alguns componentes para criar circuitos com pistões. Experimenta usar ou completar os circuitos nesta área ou cria o teu próprio circuito. Existem mais exemplos fora da área do tutorial. - - - Nesta área existe um Portal para o Submundo! - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saber mais sobre Portais e sobre o Submundo.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre Portais e o Submundo. - - - Os Portais são criados colocando blocos de Obsidiana numa estrutura com quatro blocos de largura e cinco blocos de altura. Não são necessários blocos de canto. - - - Para ativar um Portal do Submundo, incendeia os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a sua estrutura se partir, se ocorrer uma explosão nas proximidades ou se escorrer líquido sobre os blocos. - - - Para utilizar um Portal do Submundo, fica dentro dele. O ecrã fica roxo e ouves um som. Alguns segundos depois, serás transportado para outra dimensão. - - - O Submundo pode ser um local perigoso, cheio de lava, mas também pode ser útil para recolher Blocos do Submundo, que ardem para sempre depois de acesos, e Glowstone, que produz luz. - - - O Submundo pode ser usado para viajar rapidamente no Mundo Superior - um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior. - - - Agora estás em Modo Criativo. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre o modo Criativo.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre o modo Criativo. - - - No modo Criativo, tens um número infinito de objetos e blocos disponíveis, podes destruir blocos com um clique sem serem necessárias ferramentas, és invulnerável e podes voar. - - - Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. - - - Atravessa este buraco para continuares. - - - Concluíste o tutorial do modo Criativo. - - - Nesta área, foi criada uma quinta. As quintas permitem-te criar uma fonte renovável de alimentos e outros objetos. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre quintas.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre quintas. - - - O Trigo, as Abóboras e 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. - - - Antes de plantares sementes, tens de transformar os blocos de terra em Terra Cultivável, utilizando uma Enxada. Uma fonte de água nas proximidades irá manter a Terra Cultivável hidratada e irá fazer com que as sementes cresçam mais depressa, tal como manter a área iluminada. - - - O Trigo passa por várias fases de crescimento e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} - - - Para que as Abóboras e os Melões cresçam, é necessário colocar um bloco junto ao local onde plantaste a semente, depois de ter crescido o caule. - - - A Cana de Açúcar tem de ser plantada em blocos de Erva, Terra ou Areia ao lado de um bloco de água. Cortar um bloco de Cana de Açúcar também fará cair todos os blocos por cima dele.{*ICON*}83{*/ICON*} - - - Os 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*} - - - Os Cogumelos têm de ser plantados numa área com pouca luz e irão espalhar-se pelos blocos pouco iluminados em redor.{*ICON*}39{*/ICON*} - - - Podes usar Pó de Ossos para fazer crescer totalmente as plantações ou transformar Cogumelos em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} - - - Concluíste o tutorial sobre quintas. - - - Nesta área, os animais foram colocados dentro de uma cerca. Podes criar animais para produzir crias dos mesmos. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre a criação de animais.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a criação de animais. - - - - Para que os animais procriem, terás de lhes dar os alimentos certos para que entrem em "Modo Amor". - - - 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. - - - 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. - - - Os animais só podem voltar a entrar no Modo Amor ao fim de cerca de cinco minutos. - - - Alguns animais irão seguir-te se tiveres a sua comida na mão. Isto facilita a tarefa de reunir os animais para que procriem.{*ICON*}296{*/ICON*} - - - - 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. - - - - Concluíste o tutorial sobre criação de animais. - - - Nesta zona há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes o que precisas sobre Golems. - - - Os Golems são criados colocando uma abóbora no topo de uma pilha de blocos. - - - Os Golems de Neve são criados com dois Blocos de Neve, um por cima do outro, com uma abóbora em cima. Os Golems de Neve atiram bolas de neve aos inimigos. - - - Os Golems de Ferro são criados com quatro Blocos de Ferro no padrão apresentado, com uma abóbora no topo do bloco central. Os Golems de Ferro atacam os inimigos. - - - Os Golems de Ferro também aparecem naturalmente para proteger as aldeias e, caso ataques quaisquer aldeões, eles atacam-te. - - - Não podes sair desta área até teres completado o tutorial. - - - Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma pá para escavar materiais moles como terra e areia. - - - Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar um machado para cortar troncos de árvore. - - - Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma picareta para extrair pedra e minério. Podes ter de construir uma picareta com materiais melhores, para obter recursos de certos blocos. - - - Algumas ferramentas são melhores para atacar inimigos. Experimenta usar uma espada para atacares. - - - Sugestão: Mantém premido {*CONTROLLER_ACTION_ACTION*}para escavar e cortar usando a mão ou o objeto que estiveres a segurar. Pode ser necessário criar uma ferramenta para escavares alguns blocos... - - - A ferramenta que estás a usar ficou danificada. Sempre que 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. - - - Mantém premido{*CONTROLLER_ACTION_JUMP*} para nadares para cima. - - - Nesta área, existe uma vagoneta sobre carris. Para entrares na vagoneta, aponta o ponteiro para a mesma e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} no botão para fazeres a vagoneta andar. - - - No baú, junto ao rio, encontra-se um barco. Para usares o barco, aponta o ponteiro para a água e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} enquanto apontas para o barco para entrares. - - - No baú, junto ao lago, encontra-se uma cana de pesca. Retira-a do baú e seleciona-a como objeto atual na tua mão, para a usares. - - - Este mecanismo de pistão mais avançado cria uma ponte que se repara automaticamente! Prime o botão para ativar e descobre como interagem os componentes. - - - Se deslocares o ponteiro para fora dos limites da interface, quando estiveres a transportar um objeto, poderás largá-lo. - - - Não tens todos os ingredientes necessários para criar este objeto. A caixa no canto inferior esquerdo mostra os ingredientes de que precisas. - - - Parabéns, concluíste o tutorial. Agora, o tempo de jogo passa normalmente e não tens muito tempo até que anoiteça e os monstros saiam para a rua! Termina o teu abrigo! - - - {*EXIT_PICTURE*} Quando estiveres preparado para explorar mais, existe uma escadaria nesta área, junto ao abrigo dos Mineiros, que conduz a um pequeno castelo. + 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. - - Lembrete: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Foram adicionadas novas funcionalidades na última versão do jogo, incluindo novas áreas no mundo do tutorial. - - - {*B*}Prime {*CONTROLLER_VK_A*} para jogares o tutorial normalmente.{*B*} - Prime {*CONTROLLER_VK_B*} para ignorar o tutorial principal. - - - Nesta área, tens a possibilidade de aprender mais sobre pesca, barcos, pistões e Redstone. - - - Fora desta área, irás encontrar exemplos de edifícios, quintas, vagonetas e carris, feitiços, poções, trocas, ferreiros e muito mais! - - - O nível da tua barra de comida está demasiado baixo para restaurar a tua saúde. - - + {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre a barra de comida e a alimentação.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a barra de comida e a alimentação. + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. - - Selecionar + + 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. - - Usar + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. - - Anterior + + + 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*}. + - - Sair + + + 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. + - - Cancelar + + 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. + - - Cancelar Juntar + + Água - - Atualizar Lista de Jogos Online + + Garrafa de Vidro - - Jogos Party + + Garrafa de Água - - Todos os Jogos + + Olho de Aranha - - Alterar Grupo + + Pepita de Ouro - - Mostrar Inventário + + Verruga do Submundo - - Mostrar Descrição + + Poção{*splash*}{*prefix*}{*postfix*} - - Mostrar Ingredientes + + Olho Aranha Ferm. - - Criação + + Caldeirão - - Criar + + Olho de Ender - - Retirar/Colocar + + Melão Brilhante - - Retirar + + Pó de Blaze - - Retirar tudo + + Creme de Magma - - Retirar metade - - - Colocar - - - Colocar tudo - - - Colocar um - - - Largar - - - Largar tudo - - - Largar um - - - Trocar - - - Mover rápido - - - Limpar Seleção Rápida - - - O que é isto? - - - Partilhar no Facebook - - - Alterar Filtro - - - Enviar Pedido de Amizade - - - Página Abaixo - - - Página Acima - - - Seguinte - - - Anterior - - - Expulsar Jogador - - - Tingir - - - Escavar - - - Alimentar - - - Domar - - - Curar - - - Senta - - - Segue-me - - - Ejetar - - - Esvaziar - - - Selar - - - Colocar - - - Atingir - - - Ordenhar - - - Recolher - - - Comer - - - Dormir - - - Acordar - - - Tocar - - - Montar - - - Velejar - - - Crescer - - - Nadar para Cima - - - Abrir - - - Alterar Tom - - - Detonar - - - Ler - - - Pendurar - - - Atirar - - - Plantar - - - Lavrar - - - Colher - - - Continuar - - - Desbloquear Jogo Completo - - - Apagar Gravação - - - Apagar - - - Opções - - - Convidar Amigos - - - Aceitar - - - Tosquiar - - - Excluir Nível - - - Selecionar Skin - - - Acender - - - Navegar - - - Instalar Versão Completa - - - Instalar Versão de Avaliação - - - Instalar - - - Reinstalar - - - Op. Gravação - - - Executar Comando - - - Criativo - - - Mover Ingrediente - - - Mover Combustível - - - Mover Ferramenta - - - Mover Armadura - - - Mover Arma - - - Equipar - - - Puxar - - - Soltar - - - Privilégios - - - Bloquear - - - Página Acima - - - Página Abaixo - - - Modo Amor - - - Beber - - - Rodar - - - Esconder - - - Limpar Todos os Espaços - - - OK - - - Cancelar - - - Loja Minecraft - - - Tens a certeza de que queres sair do jogo atual e entrar num novo jogo? Os progressos não gravados serão perdidos. - - - Sair do Jogo - - - Gravar Jogo - - - Sair sem gravar - - - Tens a certeza de que queres substituir qualquer gravação anterior deste mundo pela versão atual deste mundo? - - - Tens a certeza de que queres sair sem gravar? Irás perder todo o progresso neste mundo! - - - Iniciar Jogo - - - Gravação Danificada - - - Esta gravação está corrompida ou danificada. Queres apagá-la? - - - 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. - - - Sair e gravar - - - Sair sem gravar - - - Tens a certeza de que queres sair para o menu principal? O progresso não gravado será perdido. - - - Tens a certeza de que queres sair para o menu principal? Perderás o teu progresso! - - - Criar Mundo Novo - - - Jogar Tutorial - - - Tutorial - - - Nomeia o Teu Mundo - - - Introduz um nome para o teu mundo - - - Deposita a semente para a criação do teu mundo - - - Carregar Mundo Gravado - - - Prime START para jogar - - - A sair do jogo - - - Ocorreu um erro. A sair para o menu principal. - - - Falha na ligação - - - Ligação perdida - - - Perdeste a ligação ao servidor. A sair para o menu principal. - - - Desligado pelo servidor - - - Foste expulso do jogo - - - Foste expulso do jogo por voares - - - A tentativa de ligação excedeu o tempo - - - O servidor está cheio - - - O anfitrião saiu do jogo. - - - Não podes juntar-te a este jogo porque não és amigo de nenhum dos participantes. - - - Não podes juntar-te a este jogo porque foste expulso pelo anfitrião anteriormente. - - - 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. - - - 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. - - - Novo Mundo - - - Prémio Desbloqueado! - - - Parabéns - recebeste uma imagem de jogador com o Steve do Minecraft! - - - Parabéns - recebeste uma imagem de jogador com um Creeper! - - - 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: - - - Amigos - - - A Minha Pontuação - - - Geral - - - Entradas: - - - Lugar - - - A Preparar para Gravar Nível - - - A Preparar Blocos... - - - A Finalizar... - - - A Construir Terreno - - - A simular o mundo - - - A iniciar o servidor - - - 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 - - - A transferir terreno - - - A mudar para jogo offline - - - Aguarda enquanto o anfitrião grava o jogo - - - Entrar em O FIM - - - Sair de O FIM - - - Esta cama está ocupada - - - Só podes dormir à noite - - - %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. - - - A tua cama desapareceu ou está bloqueada - - - Não podes descansar agora, existem monstros nas redondezas - - - Estás a dormir numa cama. Para acelerares até de madrugada, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. - - - Ferramentas e Armas - - - Armas - - - Alimentos - - - Estruturas - - - Armadura - - - Mecanismos - - - Transporte - - - Decorações - - - Blocos de Construção - - - Redstone e Transporte - - - Vários - - - Preparação - - - Ferramentas, Armas e Armadura - - - Materiais - - - Sessão terminada - - - Dificuldade - - - Música - - - Som - - - Gama - - - Precisão do Jogo - - - Precisão da Interface - - - Calmo - - - Fácil - - - Normal - - - Difícil - - - Neste modo, o jogador recupera a saúde com o passar do tempo e não há inimigos no ambiente. - - - Neste modo, os inimigos surgem no ambiente, mas irão provocar menos danos ao jogador do que no modo Normal. - - - Neste modo, os inimigos surgem no ambiente e provocam uma quantidade de danos normal ao jogador. - - - 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! - - - Tempo Limite da Avaliação Excedido - - - Jogo cheio - - - Falha ao entrar no jogo, não existem espaços livres - - - Introduzir Texto de Sinal - - - Introduz uma linha de texto para o teu sinal - - - Introduzir Título - - - Introduz um título para a tua publicação - - - Introduzir Legenda - - - Introduz uma legenda para a tua publicação - - - Introduzir Descrição - - - Introduz uma descrição da tua publicação - - - Inventário - - - Ingredientes - - + Posto de Poções - - Baú + + Lágrima de Ghast - - Encantar + + Sementes de Abóbora - - Fornalha + + Sementes de Melão - - Ingrediente + + Galinha Crua - - Combustível + + Disco de Música - "11" - - Distribuidor + + Disco de Música - "where are we now" - - De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. + + Tesoura - - %s juntou-se ao jogo. + + Galinha Cozinhada - - %s saiu do jogo. + + Pérola de Ender - - %s foi expulso do jogo. + + Fatia de Melão - - Tens a certeza de que queres eliminar este jogo gravado? + + Varinha de Blaze - - A aguardar aprovação + + Bife Cru - - Censurado + + Bife - - A tocar: + + Carne Podre - - Repor Definições + + Garrafa Mágica - - Tens a certeza de que queres repor as definições para os valores predefinidos? + + Tábuas de Carvalho - - Erro de Carregamento + + Tábuas de Abeto - - Jogo de %s + + Tábuas de Bétula - - Jogo anfitrião desconhecido + + Bloco de Erva - - Um convidado terminou a sessão + + Terra - - Um jogador convidado terminou sessão. Como tal, todos os jogadores convidados foram removidos do jogo. + + Pedra Arredondada - - Iniciar Sessão + + Tábuas da Selva - - Não tens sessão iniciada. Para jogares este jogo, tens de iniciar uma sessão. Queres iniciar sessão agora? + + Bétula Jovem - - Multijogador não é permitido + + Rebentos de Árvores da Selva - - Falha ao criar jogo + + Rocha - - Auto Selecionado + + Rebento - - Sem Pack: Skins Predefinidas + + Carvalho Jovem - - Skins Favoritas + + Abeto Jovem - - Nível Excluído + + Pedra - - 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. + + Moldura de Item - - Excluir este Nível? + + Gerar {*CREATURE*} - - Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? -Se selecionares OK, irás sair do jogo. + + Tijolo de Submundo - - Removido da Lista de Excluídos + + Carga de Fogo - - Gravação Automática + + Carga Fogo Carv. Veg. - - Gravação Automática: DESLIGADO + + Carga Fogo (Carvão) - - Mins + + Caveira - - Não Podes Colocar Aqui! + + Cabeça - - Não é possível colocar lava junto ao ponto de regeneração do nível, devido à possibilidade de morte instantânea dos jogadores regenerados. + + Cabeça de %s - - Opacidade + + Cabeça de Creeper - - A Preparar Gravação Automática do Nível + + Caveira de Esqueleto - - Tamanho de HUD + + Caveira de Esqueleto Atrofiado - - Tamanho de HUD (Ecrã Dividido) + + Cabeça de Morto-vivo - - Semear - - - Desbloquear Pack de Skins - - - Para utilizares a skin selecionada, tens de desbloquear este pack de skins. -Queres desbloquear agora este pack de skins? - - - Desbloquear Pack de Texturas - - - Para usares este pack de texturas no teu mundo, precisas de desbloqueá-lo. -Queres desbloqueá-lo agora? - - - Pack de Texturas de Avaliação - - - 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? - - - Pack de Texturas Não Disponível - - - Desbloquear Versão Completa - - - Transferir Versão de Avaliação - - - Transferir Versão Completa - - - 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? - - - Obtém a Versão de Avaliação - - - Obtém a Versão Completa - - - Expulsar Jogador - - - Tens a certeza de que queres expulsar este jogador do jogo? Ele não poderá voltar a juntar-se até reiniciares o mundo. - - - Packs de Imagens de Jogador - - - Temas - - - Pack de Skins - - - Permitir amigos de amigos - - - Não podes juntar-te a este jogo porque está limitado a amigos do anfitrião. - - - Impossível Juntares-te ao Jogo - - - Selecionado - - - Skin selecionada: - - - Conteúdo Transferível Corrompido - - - 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. - - - 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. - - - O teu modo de jogo foi alterado - - - Muda o Nome do Teu Mundo - - - Introduz o novo nome para o teu mundo - - - Modo Jogo: Sobrevivência - - - Modo Jogo: Criativo - - - Sobrevivência - - - Criativo - - - Criado no Modo Sobrevivência - - - Criado no Modo Criativo - - - Compor Nuvens - - - O que queres fazer com esta gravação de jogo? - - - Mudar o Nome - - - A gravar automaticamente em %d... - - - Ligado - - - Desligado - - - Normal - - - Superplano - - - Quando ativada, o jogo ficará online. - - - Quando ativada, só os jogadores convidados podem juntar-se. - - - Quando ativada, amigos de pessoas na tua Lista de Amigos podem juntar-se. - - - Quando ativada, os jogadores podem infligir danos aos outros jogadores. Afeta apenas o modo de Sobrevivência. - - - Quando desativada, os jogadores que se juntaram ao jogo não podem construir ou escavar, até receberem autorização. - - - Quando ativada, o fogo pode propagar-se aos blocos inflamáveis mais próximos. - - - Quando ativada, o TNT explode ao ser acionado. - - - Quando ativada, o Submundo será regenerado. É útil se tiveres um ficheiro mais antigo em que não existissem Fortalezas do Submundo. - - - Quando ativada, são geradas estruturas como Aldeias e Fortalezas no mundo. - - - Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo. - - - Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. - - - Packs de Skins - - - Temas - - - Imagens de Jogador - - - Itens de Avatar - - - Packs de Textura - - - Packs de Mistura - - - {*PLAYER*} foi consumido pelas chamas - - - {*PLAYER*} morreu carbonizado - - - {*PLAYER*} tentou nadar na lava - - - {*PLAYER*} sufocou numa parede - - - {*PLAYER*} afogou-se - - - {*PLAYER*} morreu à fome - - - {*PLAYER*} foi picado até à morte - - - {*PLAYER*} embateu no chão com muita força - - - {*PLAYER*} caiu do mundo - - - {*PLAYER*} morreu - - - {*PLAYER*} explodiu - - - {*PLAYER*} foi morto por magia - - - {*PLAYER*} foi morto pelo bafo do Ender Dragon - - - {*PLAYER*} foi assassinado por {*SOURCE*} - - - {*PLAYER*} foi assassinado por {*SOURCE*} - - - {*PLAYER*} foi atingido por {*SOURCE*} - - - {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} - - - {*PLAYER*} foi agredido por {*SOURCE*} - - - {*PLAYER*} foi morto por {*SOURCE*} - - - Rochas Enevoadas - - - Mostrar HUD - - - Mostrar Mão - - - Mensagens de Morte - - - Personagem Animada - - - Anim. Skin Personalizada - - - Já não podes escavar ou usar objetos - - - Já podes escavar e usar objetos - - - Já não podes colocar blocos - - - Já podes colocar blocos - - - Agora podes usar portas e interruptores - - - Já não podes usar portas e interruptores - - - Agora podes usar contentores (tais como baús) - - - Já não podes usar contentores (tais como baús) - - - Já não podes atacar habitantes - - - Já podes atacar habitantes - - - Já não podes atacar jogadores - - - Já podes atacar jogadores - - - Já não podes atacar animais - - - Já podes atacar animais - - - Já és um moderador - - - Já não és um moderador - - - Já podes voar - - - Já não podes voar - - - Já não vais ficar exausto - - - Agora vais ficar exausto - - - Já estás invisível - - - Já não estás invisível - - - Já és invulnerável - - - Já não és invulnerável - - - %d MSP - - - Ender Dragon - - - %s entrou em O Fim - - - %s abandonou O Fim - - - {*C3*}Sei a que jogador te referes.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Sim. 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*} - - - {*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*} - - - {*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*} - - - Repor Submundo - - - Queres mesmo repor o Submundo desta gravação no seu estado predefinido? Vais perder tudo o que construíste no Submundo! - - - Repor Submundo - - - Não Repor Submundo - - - De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas e Gatos. - - - De momento, não é possível usar o Ovo de Geração. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. - - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Vacogumelos. - - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lobos num mundo. - - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Galinhas num mundo. - - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lulas num mundo. - - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de inimigos num mundo. - - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de aldeões num mundo. - - - O número máximo de Pinturas/Molduras de Objetos num mundo foi atingido. - - - Não podes produzir inimigos no modo Calmo. - - - Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. - - - Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Lobos de criação. - - - Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Galinhas de criação. - - - Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Vacogumelos de criação. - - - Foi alcançado o número máximo de Barcos num mundo. - - - O número máximo de Cabeças de Habitantes num mundo foi alcançado. - - - Inverter Olhar - - - Esquerdino - - - Morreste! - - - Regenerar - - - Ofertas de Conteúdo Transferível - - - Alterar Skin - - - Instruções de Jogo - - - Controlos - - - Definições - - - Ficha técnica - - - Reinstalar Conteúdo - - - Definições de Depuração - - - Fogos Propagados - - - Explosões de TNT - - - Jogador vs. Jogador - - - Confiar nos Jogadores - - - Privilégios de Anfitrião - - - Gerar Estruturas - - - Mundo Superplano - - - Baú de Bónus - - - Opções de Mundo - - - Pode Construir e Escavar - - - Pode Usar Portas e Interruptores - - - Pode Abrir Contentores - - - Pode Atacar Jogadores - - - Pode Atacar Animais - - - Moderador - - - Expulsar Jogador - - - Pode Voar - - - Desativar Exaustão - - - Invisível - - - Opções de Anfitrião - - - Jogadores/Convidar - - - Jogo Online - - - Apenas por Convite - - - Mais Opções - - - Carregar - - - Novo Mundo - - - Nome do Mundo - - - Semente para o Gerador de Mundos - - - Deixar livre para uma semente aleatória - - - Jogadores - - - Juntar ao Jogo - - - Iniciar Jogo - - - Não foram encontrados jogos - - - Jogar - - - Tabelas de Liderança - - - Ajuda e Opções - - - Jogo Completo - - - Retomar Jogo - - - Gravar Jogo - - - Dificuldade: - - - Modo Jogo: - - - Estruturas: - - - Tipo de Nível: - - - JvJ: - - - Confiar Jogadores: - - - TNT: - - - Fogos Propagados: - - - Reinstalar Tema - - - Reinstalar Imagem de Jogador 1 - - - Reinstalar Imagem de Jogador 2 - - - Reinstalar Item de Avatar 1 - - - Reinstalar Item de Avatar 2 - - - Reinstalar Item de Avatar 3 - - - Opções - - - Áudio - - - Controlo - - - Gráficos - - - Interface de Utilizador - - - Repor Predefinições - - - Ver Oscilações - - - Sugestões - - - Dicas Durante o Jogo - - - Ecrã Dividido Vertical 2 Jog. - - - Concluído - - - Editar mensagem do sinal: - - - Preenche os detalhes da tua captura de ecrã - - - Legenda - - - Captura de ecrã do jogo - - - Editar mensagem do sinal: - - - As texturas, os ícones e a interface de utilizador clássicos do Minecraft! - - - Mostrar Todos os Mundos de Mistura - - - Sem Efeitos - - - Velocidade - - - Lentidão - - - Rapidez - - - Cansaço por Escavação - - - Força - - - Fraqueza - - - Saúde Instantânea - - - Danos Instantâneos - - - Impulso de Salto - - - Náusea - - - Regeneração - - - Resistência - - - Resistência ao Fogo - - - Inalação de Água - - - Invisibilidade - - - Cegueira - - - Visão Noturna - - - 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 Sonolência + + + de Rapidez + + + de Fraqueza + + + de Força + + + Resistência ao Fogo + + + Saturação + de Resistência - - de Resistência ao Fogo + + de Salto - - de Inalação de Água + + Wither - - de Invisibilidade + + Impulso de Saúde - - de Cegueira - - - de Visão Noturna - - - de Fome - - - de Veneno + + Absorção @@ -5062,9 +5987,78 @@ Queres instalar o pack de mistura ou pack de texturas agora? III + + de Invisibilidade + IV + + de Inalação de Água + + + de Resistência ao Fogo + + + de Visão Noturna + + + de Veneno + + + de Fome + + + de Absorção + + + de Saturação + + + de Impulso de Saúde + + + de Cegueira + + + da Decadência + + + Simples + + + Fina + + + Difusa + + + Clara + + + Leitosa + + + Estranha + + + Amanteigada + + + Macia + + + Estragada + + + Plana + + + Pesada + + + Suave + Explosiva @@ -5074,50 +6068,14 @@ Queres instalar o pack de mistura ou pack de texturas agora? Desinteressante - - Suave + + Enérgica - - Clara + + Cordial - - Leitosa - - - Difusa - - - Simples - - - Fina - - - Estranha - - - Plana - - - Pesada - - - Estragada - - - Amanteigada - - - Macia - - - Suave - - - Alegre - - - Espessa + + Charmosa Elegante @@ -5125,149 +6083,152 @@ Queres instalar o pack de mistura ou pack de texturas agora? Pomposa - - Charmosa - - - Enérgica - - - Sofisticada - - - Cordial - Brilhante - - Potente - - - Repugnante - - - Sem Cheiro - Grosseira Severa + + Sem Cheiro + + + Potente + + + Repugnante + + + Suave + + + Sofisticada + + + Espessa + + + Alegre + + + Restitui a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. + + + Reduz instantaneamente a saúde dos jogadores, animais e monstros afetados. + + + 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. + 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. + + + Usada como base em todas as poções. Usa-a num posto de poções para criares poções. + Nojenta Mal Cheirosa - - Usada como base em todas as poções. Usa-a num posto de poções para criares poções. - - - Não tem efeitos, pode ser usada num posto de poções para criar poções adicionando mais ingredientes. - - - Aumenta a velocidade dos movimentos dos jogadores, animais e monstros afetados, e a velocidade de sprint, comprimento do salto e campo de visão dos jogadores. - - - Reduz a velocidade dos movimentos dos jogadores, animais e monstros afetados, e a velocidade de sprint, comprimento do salto e campo de visão dos jogadores. - - - Aumenta os danos causados pelos jogadores e monstros, quando atacam. - - - Reduz os danos causados pelos jogadores e monstros, quando atacam. - - - Aumenta instantaneamente a saúde dos jogadores, animais e monstros afetados. - - - Reduz instantaneamente a saúde dos jogadores, animais e monstros afetados. - - - Restitui a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. - - - Faz com que os jogadores, animais e monstros afetados fiquem imunes ao fogo, lava e ataques de Blaze à distância. - - - Reduz a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. + + Golpear Precisão - - Golpear + + Reduz a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. - - Veneno de Artrópodes + + Danos de Ataque Coice - - Aspeto do Fogo + + Veneno de Artrópodes - - Proteção + + Velocidade - - Proteção contra Fogo + + Reforços de Mortos-vivos - - Queda de Penas + + Força de Salto do Cavalo - - Proteção contra Explosões + + Quando Aplicável: - - Proteção contra Projéteis + + Resistência de Coice - - Respiração + + Alcance de Habitante Seguidor - - Afinidade Aquática - - - Eficiência + + Máximo de Saúde Toque de Seda - - Inquebrável + + Eficiência - - Saque + + Afinidade Aquática Sorte - - Poder + + Saque - - Chama + + Inquebrável - - Soco + + Proteção contra Fogo - - Infinidade + + Proteção - - I + + Aspeto do Fogo - - II + + Queda de Penas - - III + + Respiração + + + Proteção contra Projéteis + + + Proteção contra Explosões IV @@ -5278,23 +6239,29 @@ Queres instalar o pack de mistura ou pack de texturas agora? VI + + Soco + VII - - VIII + + III - - IX + + Chama - - X + + Poder - - Pode ser escavado com uma picareta de ferro ou melhor para recolher Esmeraldas. + + Infinidade - - 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. + + II + + + I É ativado quando uma entidade passa através de uma Armadilha com Fio ligada. @@ -5305,44 +6272,59 @@ Queres instalar o pack de mistura ou pack de texturas agora? Uma forma compacta de armazenar Esmeraldas. - - Uma parede feita de Pedra Arredondada. + + 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. - - Pode ser usada para reparar armas, ferramentas e armaduras. + + IX - - Funde-se numa fornalha para produzir Quartzo do Submundo. + + VIII - - Usado como decoração. + + Pode ser escavado com uma picareta de ferro ou melhor para recolher Esmeraldas. - - Pode ser trocada com os aldeãos. - - - Usado como decoração. Nele podes plantar Flores, Rebentos, Catos e Cogumelos. + + X Restitui 2{*ICON_SHANK_01*} e pode fazer uma cenoura dourada. Pode ser plantada em terrenos de cultivo. + + Usado como decoração. Nele podes plantar Flores, Rebentos, Catos e Cogumelos. + + + Uma parede feita de Pedra Arredondada. + Restitui 0,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Pode ser plantada em terrenos de cultivo. - - Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando uma batata numa fornalha. + + Funde-se numa fornalha para produzir Quartzo do Submundo. + + + Pode ser usada para reparar armas, ferramentas e armaduras. + + + Pode ser trocada com os aldeãos. + + + Usado como decoração. + + + Restitui 4{*ICON_SHANK_01*}. - 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. + Restitui 1{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. Usada para controlar um porco com sela, quando o montas. - - Restitui 4{*ICON_SHANK_01*}. + + Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando uma batata numa fornalha. + + + Restitui 3{*ICON_SHANK_01*}. Faz-se de uma cenoura e pepitas de ouro. Pode ser usado com uma Bigorna para enfeitiçar armas, ferramentas e armaduras. @@ -5350,6 +6332,15 @@ Queres instalar o pack de mistura ou pack de texturas agora? 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 + + Tarte de Abóbora - - Batata - - - 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,72 +6479,77 @@ 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. + + + + Pintar coleira + + + + Para começares a trabalhar num objeto, coloca-o no primeiro espaço de entrada. @@ -5572,9 +6559,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre o interface da Bigorna. - + - Para começares a trabalhar num objeto, coloca-o no primeiro espaço de entrada. + Em alternativa, podes colocar um segundo objeto idêntico no segundo espaço para combinar os dois objetos. @@ -5582,24 +6569,14 @@ Queres instalar o pack de mistura ou pack de texturas agora? 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. - + - Em alternativa, podes colocar um segundo objeto idêntico no segundo espaço para combinar os dois objetos. + 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. Para enfeitiçares os objetos na Bigorna, coloca um Livro Enfeitiçado no segundo espaço de entrada. - - - - - 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. @@ -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,14 +6658,24 @@ 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. Nesta área, existe um aldeão e um Baú que contém Papel, para comprar objetos. + + + + + Prime{*CONTROLLER_VK_A*} para trocar os objetos que o aldeão requer pelo objeto em oferta. + + + + + Os jogadores podem trocar objetos do seu inventário com os aldeões. @@ -5698,19 +6685,14 @@ Queres instalar o pack de mistura ou pack de texturas agora? Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre trocas. - + - Os jogadores podem trocar objetos do seu inventário com os aldeões. + 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. - - - - - Ao executares trocas variadas, as trocas disponíveis do aldeão vão alterar-se aleatoriamente ou serão atualizadas. @@ -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,37 +1,123 @@  - + + Queres iniciar uma sessão na "PSN"? + + + + 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. + + + SELECT + + + 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. + + + + Sistema PlayStation®Vita + + + 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. + + + Rede Ad Hoc + + + Mudar Modo de Rede + + + Selecionar Modo de Rede + + + ID's Online de Ecrã Dividido + + + Troféus + + + 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. + + + 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. + + + ID's Online: + + + 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. + + + + Patch 1.04 (Atualização de Título 14) + + + ID's Online do Jogo + + + Olha o que eu fiz no Minecraft: PlayStation®Vita Edition! + + + A transferência falhou. Tenta novamente mais tarde. + + + Não foi possível juntar ao jogo devido a um tipo de NAT restritivo. Por favor, verifica as tuas definições de rede. + + + O carregamento falhou. Tenta novamente mais tarde. + + + Transferência Completa! + + + 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. + + + Gravação incompleta + + + 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. + + + Carregamento cancelado + + + Cancelaste o carregamento deste ficheiro de gravação para a área de transferência de ficheiros de gravação. + + + Carregar Gravação para PS3™/PS4™ + + + A enviar dados: %d%% + + + "PSN" + + + Transferir dados de PS3™ + + + A transferir dados: %d%% + + + A Gravar + + + Carregamento Completo! + + + 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? + + + A Converter Dados + + NOT USED - - Podes usar o ecrã táctil do sistema PlayStation®Vita para navegar pelos menus! - - - minecraftforum tem uma secção dedicada à PlayStation®Vita Edition. - - - Obtém as mais recentes novidades sobre este jogo do @4J Studios e do @Kappische no Twitter! - - - Não olhes para um Enderman nos olhos! - - - Pensamos que a 4J Studios retirou o Herobrine do jogo do sistema PlayStation®Vita, mas não temos totalmente a certeza. - - - Minecraft: PlayStation®Vita Edition bateu muitos recordes! - - - {*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. - - - {*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ã. + + NOT USED {*T3*}INSTRUÇÕES DE JOGO: MODO CRIATIVO{*ETW*}{*B*}{*B*} @@ -45,32 +131,80 @@ No modo de voo, podes manter premido {*CONTROLLER_ACTION_JUMP*} para subires e { 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. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Convidar Amigos - 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? 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? - - Este mundo já foi gravado no Modo Criativo, pelo que as atualizações de troféus e tabelas de liderança estão desativadas. + + "NOT USED" - - 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? + + Convidar Amigos + + + minecraftforum tem uma secção dedicada à PlayStation®Vita Edition. + + + Obtém as mais recentes novidades sobre este jogo do @4J Studios e do @Kappische no Twitter! + + + NOT USED + + + Podes usar o ecrã táctil do sistema PlayStation®Vita para navegar pelos menus! + + + Não olhes para um Enderman nos olhos! + + + {*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. + + + {*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ã. + + + Pensamos que a 4J Studios retirou o Herobrine do jogo do sistema PlayStation®Vita, mas não temos totalmente a certeza. + + + Minecraft: PlayStation®Vita Edition bateu muitos recordes! + + + 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? + + + Não foi possível carregar "Minecraft: PlayStation®Vita Edition" e não é possível continuar. + + + Preparação + + + Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. Perdeste a ligação à "PSN". A sair para o menu principal. @@ -78,11 +212,23 @@ No modo de voo, podes manter premido {*CONTROLLER_ACTION_JUMP*} para subires e { Perdeste a ligação à "PSN". + + Este mundo já foi gravado no Modo Criativo, pelo que as atualizações de troféus e tabelas de liderança estão desativadas. + + + 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? + 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? + + Os jogadores convidados não podem desbloquear o jogo completo. Inicia sessão com uma conta Sony Entertainment Network. + + + ID Online + 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". @@ -92,150 +238,7 @@ Queres desbloquear o jogo completo? 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? - - Os jogadores convidados não podem desbloquear o jogo completo. Inicia sessão com uma conta Sony Entertainment Network. - - - ID Online - - - Preparação - - - Foste reencaminhado para o ecrã principal porque terminaste a sessão na "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? - - - Não foi possível carregar "Minecraft: PlayStation®Vita Edition" e não é possível continuar. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - ID's Online de Ecrã Dividido - - - Troféus - - - ID's Online: - - - ID's Online do Jogo - - - Olha o que eu fiz no Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Patch 1.04 (Atualização de Título 14) - - - SELECT - - - 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. - - - - Queres iniciar uma sessão na "PSN"? - - - - 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. - - - Sistema PlayStation®Vita - - - Mudar Modo de Rede - - - Selecionar Modo de Rede - - - 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. - - - Rede Ad Hoc - - - "PSN" - - - Transferir dados sistema PlayStation®3 - - - - Carregar Gravação para sistema PlayStation®3/PlayStation®4 - - - Carregamento cancelado - - - Cancelaste o carregamento deste ficheiro de gravação para a área de transferência de ficheiros de gravação. - - - A enviar dados: %d%% - - - A transferir dados: %d%% - - - 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? - - - A Converter Dados - - - A Gravar - - - Carregamento Completo! - - - O carregamento falhou. Tenta novamente mais tarde. - - - Transferência Completa! - - - A transferência falhou. Tenta novamente mais tarde. - - - Não foi possível juntar ao jogo devido a um tipo de NAT restritivo. Por favor, verifica as tuas definições de rede. - - - 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. - - - Gravação incompleta - - - 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. + + 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 @@  - - На системном накопителе недостаточно свободного места, чтобы создать сохранение. - - - Вы вернулись на титульный экран, так как вышли из "PSN". - - - Игра закончилась, так как вы вышли из "PSN". - - - - В данный момент не в сети. - - - - В игре есть возможности, которые требуют соединения с "PSN", однако вы сейчас не в сети. - - - Нет подключения к сети в специальном режиме. - - - В игре есть возможности, которые требуют подключения к сети в специальном режиме, однако вы сейчас не в сети. - - - Для доступa к этой возможности нужно войти в "PSN". - - - - Войти в "PSN" - - - Подключиться к сети в специальном режиме - - - Проблема с призами - - - Не удалось получить доступ к вашей учетной записи Sony Entertainment Network. Сейчас вы не сможете получить этот приз. + + Не удалось сохранить настройки учетной записи Sony Entertainment Network. Проблема с учетной записью Sony Entertainment Network - - Не удалось сохранить настройки учетной записи Sony Entertainment Network. + + Не удалось получить доступ к вашей учетной записи Sony Entertainment Network. Сейчас вы не сможете получить этот приз. Это пробная версия игры Minecraft: PlayStation®3 Edition. Будь у вас полная версия, вы бы только что получили приз! Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®3 Edition и играть с друзьями со всего мира посредством "PSN". Получить доступ к полной версии игры? + + Подключиться к сети в специальном режиме + + + В игре есть возможности, которые требуют подключения к сети в специальном режиме, однако вы сейчас не в сети. + + + Нет подключения к сети в специальном режиме. + + + Проблема с призами + + + Игра закончилась, так как вы вышли из "PSN". + + + + Вы вернулись на титульный экран, так как вышли из "PSN". + + + На системном накопителе недостаточно свободного места, чтобы создать сохранение. + + + В данный момент не в сети. + + + Войти в "PSN" + + + Для доступa к этой возможности нужно войти в "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,3109 +1,905 @@  - - Появился новый загружаемый контент! Чтобы получить к нему доступ, нажмите кнопку "Магазин 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*} -На верстаке предметы создаются как обычно, но у вас больше рабочего пространства и больше доступных предметов для изготовления. - - - - {*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*} - Эта функция позволяет игроку перемещать игроков или себя самого к другим игрокам в мире. - - - Следующая страница - - - Предыдущая страница - - - Основы управления - - - Интерфейс - - - Инвентарь - - - Сундуки - - - Создание предметов - - - Печь - - - Раздатчик - - - Содержание животных - - - Разведение животных - - - Создание зелий - - - Зачаровывание предметов - - - Портал в преисподнюю - - - Сетевая игра - - - Поделиться скриншотом - - - Запрещенные уровни - - - Режим "Творчество" - - - Настройки хоста и игроков - - - Торговля - - - Наковальня - - - Край - - - {*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. + + Выйти в главное меню и отключить от игры всех пользователей? Все несохраненные данные будут потеряны. - - Увеличивает уровень доспехов на 2. + + Выйти и сохранить - - Увеличивает уровень доспехов на 1. + + Создать новый мир - - Увеличивает уровень доспехов на 2. + + Введите имя мира - - Увеличивает уровень доспехов на 5. + + Введите число-затравку для создания мира - - Увеличивает уровень доспехов на 4. + + Загрузить мир - - Увеличивает уровень доспехов на 1. + + Пройти обучение - - Увеличивает уровень доспехов на 2. + + Обучение - - Увеличивает уровень доспехов на 6. + + Назвать новый мир - - Увеличивает уровень доспехов на 5. + + Поврежденное сохранение - - Увеличивает уровень доспехов на 2. + + ОК - - Увеличивает уровень доспехов на 2. + + Отмена - - Увеличивает уровень доспехов на 5. + + Магазин Minecraft - - Увеличивает уровень доспехов на 3. + + Повернуть - - Увеличивает уровень доспехов на 1. + + Скрыть - - Увеличивает уровень доспехов на 3. + + Очистить все ячейки - - Увеличивает уровень доспехов на 8. + + Выйти из текущей игры и присоединиться к новой? Все несохраненные данные будут утеряны. - - Увеличивает уровень доспехов на 6. + + Переписать все прежние сохранения данной версией? - - Увеличивает уровень доспехов на 3. + + Выйти без сохранения? Все, чего вы добились в этом мире, будет утеряно! - - Блестящий слиток, из которого можно делать инструменты. Чтобы получить его, расплавьте в печи кусок руды. + + Начать игру - - Позволяет делать из слитков, самоцветов и красок размещаемые блоки. Можно использовать как дорогостоящий строительный материал или компактный вариант хранения руды. + + Выйти из игры - - Выпускает электрический разряд, оказавшись под ногами игрока, монстра или животного. Деревянные пластины можно также активировать, сбросив на них что-нибудь. + + Сохранить игру - - Используется для создания небольших лестниц. + + Выйти без сохранения - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок нормального размера. + + START - присоединиться - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + Ура! Вы получили в награду картинку с изображением Стива из Minecraft! - - Используется для освещения. С помощью факелов можно также топить снег и лед. + + Ура! Вы получили в награду картинку с изображением крипера! - - Используется как строительный материал и для создания предметов. Получается из любых видов деревьев. + + Получить доступ к полной версии - - Используется как строительный материал. Сила тяжести действует на него иначе, чем на обычный песок. + + Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более новую версию игры. - - Используется как строительный материал. + + Новый мир - - Материал для факелов, стрел, табличек, лестниц, заборов и рукоятей для инструментов и оружия. + + Доступна награда! - - Позволяет перейти от любого момента ночи к утру (если в кроватях лежат все игроки в мире) и меняет точку спауна игрока. Окраска кровати всегда одна и та же. + + Вы играете в пробную версию, но сохранить игру можно только в полной версии. +Получить доступ к полной версии игры? - - Позволяет создавать более разнообразные предметы, чем при обычном занятии ремеслом. + + Друзья - - Позволяет плавить руду, создавать древесный уголь и стекло, а также готовить рыбу и свиные отбивные. + + Мой счет - - В нем можно хранить блоки и предметы. Чтобы создать сундук вдвое большего объема, поставьте два сундука рядом. + + Всего - - Барьер, через который нельзя перепрыгнуть. Для игроков, животных и монстров его высота считается равной 1,5 блокам. Для блоков его высота равна 1. + + Пожалуйста, подождите... - - По ней можно лазить вертикально. + + Нет результатов - - Чтобы активировать люк, нужно использовать его, ударить по нему или применить к нему красный камень. Они выполняют ту же самую роль, что и двери, но лежат на земле и они размером в один блок. + + Фильтр: - - На этом предмете размещается текст, написанный вами или другим игроками. + + Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более старую версию игры. - - Дает более яркий свет, чем факелы. Им можно плавить снег и лед, а также использовать его под водой. + + Соединение разорвано - - Позволяет устраивать взрывы. Для детонации подожгите его кремнем и огнивом или электрическим разрядом. + + Утрачено соединение с сервером. Сейчас вы вернетесь в главное меню. - - Тут хранятся тушеные грибы. Когда они съедены, миска остается у вас. + + Сервер разорвал соединение - - Тут можно хранить и переносить воду, лаву и молоко. + + Выход из игры - - Тут можно хранить и переносить воду. + + Произошла ошибка. Сейчас вы вернетесь в главное меню. - - Тут можно хранить и переносить лаву. + + Не удалось установить соединение - - Тут можно хранить и переносить молоко. + + Вас исключили из игры - - С помощью этих предметов можно разводить огонь, поджигать тротил и открывать построенный портал. + + Хост вышел из игры. - - С ее помощью можно ловить рыбу. + + Вы не можете присоединиться к этой игре, так как в ней не участвуют ваши друзья. - - Показывает положение солнца и луны. + + Вы не можете присоединиться к этой игре, так как вас исключил хост. - - Указывает направление к точке старта. + + Вас исключили из игры за полеты - - Если держать ее в руках, она показывает исследованные области. Помогает искать маршрут. + + Попытка подключения длилась слишком долго - - Позволяет выпускать во врагов стрелы. + + Сервер переполнен - - Это боеприпасы для лука. + + В этом режиме в мире появляются враги, наносящие игрокам серьезные повреждения. Остерегайтесь криперов: они могут начать атаку-взрыв, даже если вы отойдете от них! - - Восстанавливает 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*}. Готовится из сырой говядины в печи. + + Этот загружаемый контент поврежден, использовать его невозможно. Удалите его и заново установите из меню магазина Minecraft. - - Восстанавливает 1,5{*ICON_SHANK_01*}, можно приготовить в печи. + + Часть загружаемого контента повреждена и не может быть использована. Удалите этот загружаемый контент, а затем заново установите из меню магазина Minecraft. - - Восстанавливает 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*}. Этой едой можно отравиться. + + Прежде чем использовать этот набор текстур, необходимо получить к нему доступ. +Получить к нему доступ сейчас? - - Используется для приготовления торта или в качестве ингредиента для зелий. + + Набор текстур пробной версии - - При включении/выключении выпускает электрический разряд. Остается во включенном или выключенном положении, пока на него не нажать. + + Число-затравка - - Постоянно выпускает электрические разряды. Соединив с блоком, можно использовать в качестве приемника/передатчика. Также является слабым источником света. + + Получить доступ к набору скинов - - Используется в красных сетях в качестве ретранслятора, элемента задержки и/или диода. + + Прежде чем использовать этот набор скинов, необходимо получить к нему доступ. +Получить к нему доступ сейчас? - - При нажатии выпускает электрический разряд. Выключается примерно через секунду после активации. + + Вы используете набор текстур пробной версии. Вы не сможете сохранить этот мир, пока не получите доступ к полной версии. +Получить доступ к полной версии набора текстур? - - Хранит и случайным образом выдает предметы, если поместить в него заряд красного камня. + + Загрузить полную версию - - При активации проигрывает ноту. Чтобы изменить ее высоту, ударьте по блоку. Ставьте его на разные другие блоки, чтобы изменять тип музыкального инструмента. + + В этом мире использован смешанный набор или набор текстур, которого у вас нет! +Установить смешанный набор или набор текстур? - - По ним ездят вагонетки. + + Получить пробную версию - - Под напряжением ускоряют вагонетки, которые по ним едут. При отключении напряжения останавливают вагонетки. + + Нет набора текстур - - Работают как нажимная пластина (под напряжением посылают красный сигнал), но их могут активировать только вагонетки. + + Получить доступ к полной версии - - Может перевозить вас, животное или монстра по рельсам. + + Загрузить пробную версию - - Может перевозить товары по рельсам. + + Режим игры изменен - - Движется по рельсам. Если в нее положить уголь, сможет толкать другие вагонетки. + + Выберите, чтобы к игре могли присоединиться только приглашенные. - - Позволяет передвигаться по воде быстрее, чем вплавь. + + Выберите, чтобы к игре могли присоединиться друзья ваших друзей. - - Ее можно состричь с овец и покрасить. + + Выберите, чтобы игроки могли причинять урон друг другу. Действует только в режиме "Выживание". - - Используется в качестве строительного материала, можно покрасить. Этот рецепт не рекомендуется - шерсть легко состричь с овец. + + Нормальный - - Краска для производства черной шерсти. + + Суперплоский - - Краска для производства зеленой шерсти. + + Выберите, чтобы игра была сетевой. - - Используется для производства коричневой шерсти, в качестве ингредиента для печенья или для выращивания плодов какао. + + Отключите, и игроки не смогут строить или добывать руду без разрешения. - - Краска для производства серебряной шерсти. + + Выберите, чтобы в мире появились такие структуры, как деревни и крепости. - - Краска для производства желтой шерсти. + + Выберите, чтобы и верхний мир, и преисподняя были совершенно плоскими. - - Краска для производства красной шерсти. + + Выберите, чтобы рядом с точкой спауна игроков появился сундук с полезными предметами. - - Позволяет мгновенно вырастить урожай, деревья, высокую траву, огромные грибы и цветы. Может использоваться при создании красок. + + Выберите, чтобы огонь распространялся на соседние горючие блоки. - - Краска для производства розовой шерсти. + + Выберите, чтобы после активации тротил взрывался. - - Краска для производства оранжевой шерсти. + + Выберите, чтобы создать преисподнюю заново. Это полезно, если у вас старое сохранение, в котором нет адских крепостей. - - Краска для производства светло-зеленой шерсти. + + Выкл. - - Краска для производства серой шерсти. + + Режим игры: Творчество - - Краска для производства светло-серой шерсти. (Примечание: светло-серую краску также можно сделать, перемешав серую краску с костной мукой.) + + Выживание - - Краска для производства голубой шерсти. + + Творчество - - Краска для производства бирюзовой шерсти. + + Изменить название мира - - Краска для производства лиловой шерсти. + + Введите новое название мира - - Краска для производства пурпурной шерсти. + + Режим игры: Выживание - - Краска для производства синей шерсти. + + Создано в режиме "Выживание" - - Воспроизводит музыкальные диски. + + Переименовать файл - - Позволяют создавать очень прочные инструменты, доспехи и оружие. + + Автосохранение через %d... - - Дает более яркий свет, чем факелы. Может плавить снег и лед и использоваться под водой. + + Вкл. - - Из нее можно делать книги и карты. + + Создано в режиме "Творчество" - - Из них можно делать книжные полки; на них также можно накладывать чары, чтобы получить зачарованные книги. + + Отображать облака - - Позволяет создавать более мощные чары, если находится рядом с колдовским столом. + + Что вы хотите сделать с этим сохранением? - - Украшение. + + Размер и-фейса (разд. экран) - - Можно добыть железной или более прочной киркой, а затем расплавить в печи, чтобы получить золотые слитки. + + Ингредиент - - Можно добыть каменной или более прочной киркой, а затем расплавить в печи, чтобы получить железные слитки. + + Топливо - - Можно добыть киркой, чтобы получить уголь. + + Распределитель - - Можно добыть каменной или более прочной киркой, чтобы получить ляпис-лазурь. - - - Можно добыть железной или более прочной киркой, чтобы получить алмазы. - - - Можно добыть железной или более прочной киркой, чтобы получить красную пыль. - - - Можно добыть киркой, чтобы получить булыжники. - - - Можно добыть с помощью лопаты и использовать в строительстве. - - - Его можно посадить, и постепенно он превратится в дерево. - - - Это невозможно сломать. - - - Поджигает все, к чему прикасается. Лаву можно набрать в ведро. - - - Можно добыть лопатой и превратить в стекло, расплавив в печи. Если под ним нет другой плитки, на песок действует сила тяжести. - - - Можно добыть лопатой. Иногда из него выпадает кремень. Если под гравием нет другой плитки, на него действует сила тяжести. - - - Можно нарубить с помощью топора и превратить в доски или использовать в качестве топлива. - - - Можно создать, расплавив в печи песок. Используется в строительстве, но оно разобьется, если вы попытаетесь его копать. - - - Можно добыть из камня с помощью кирки и использовать для создания печи или каменных инструментов. - - - Получается путем обжига глины в печи. - - - Ее можно превратить в кирпичи, обжигая в печи. - - - Из разрушенного блока выпадают комки глины, которые в печи можно превратить в кирпичи. - - - Компактный контейнер для снежков. - - - Из него можно добыть снежки с помощью лопаты. - - - Из сломанного растения могут выпасть семена пшеницы. - - - Используется для изготовления краски. - - - Их можно потушить в миске. - - - Этот материал можно добыть только с помощью алмазной кирки. Он возникает в точке, где встречаются вода и стоячая лава. Из обсидиана можно делать порталы. - - - Выпускает в мир монстров. - - - Его можно положить на землю, и он будет проводить электрический заряд. Если использовать его в качестве ингредиента для зелья, эффект этого зелья будет длиться дольше. - - - Когда он созреет, его можно собрать и получить пшеницу. - - - Земля, подготовленная к посеву семян. - - - Можно запечь в печи, чтобы получить зеленую краску. - - - Из него можно сделать сахар. - - - Можно носить в качестве шлема или вставить в нее факел, чтобы создать тыкву-фонарь. Также является главным ингредиентом для тыквенного пирога. - - - Если поджечь, горит вечно. - - - Замедляет всех, кто по нему идет. - - - Встав на портал, можно перейти из верхнего мира в преисподнюю и обратно. - - - Уголь служит топливом для печи, а также, из него можно сделать факел. - - - Ее можно получить, убив паука. Из нее можно сделать лук. - - - Его можно получить, убив курицу. Из него можно сделать стрелу. - - - Его можно получить, убив крипера. Из него можно сделать тротил или использовать в качестве ингредиента для зелий. - - - Их можно посадить на грядке, чтобы получить урожай. Убедитесь, что семенам хватает света! - - - Ее можно добыть, собрав урожай. Из пшеницы делают пищу. - - - Его можно добыть, копая гравий. Из кремня можно сделать кремень и огниво. - - - Можно накинуть на свинью, чтобы ездить на ней верхом. После этого свиньей можно управлять с помощью морковки на палке. - - - Чтобы добыть снежки, копайте снег. Снежки можно бросать. - - - Ее можно получить, убив корову. Из нее можно сделать доспехи и книги. - - - Комки слизи можно добыть, убивая слизней. Слизь используется в качестве ингредиента для зелий, а также для создания липких поршней. - - - Яйца случайным образом выпадают из куриц. Из яиц можно делать пищу. - - - Этот материал можно получить, добывая сияющий камень. Его можно снова превращать в блоки сияющего камня или добавлять в зелья, чтобы усилить их эффекты. - - - Кость можно добыть, убив скелета, и превратить в костную муку. Скормите кость волку, если хотите приручить его. - - - Появляется, когда скелет убивает крипера. Диски можно проигрывать в музыкальном автомате. - - - Тушит огонь и помогает урожаю расти. Воду можно набрать в ведро. - - - Из сломанного листа иногда выпадает росток, который можно посадить и вырастить дерево. - - - Используется как строительный материал и украшение. Можно найти в подземельях. - - - Используются, чтобы стричь шерсть с овец и добывать блоки листьев. - - - Под напряжением (используйте кнопку, рычаг, нажимную пластину, красный фонарь или красный камень вместе с любым из перечисленных предметов) выдвигается поршень, который может толкать блоки. - - - Под напряжением выдвигается поршень, который может толкать блоки. Когда поршень движется назад, он тянет за собой блок, который к нему прикасается. - - - Делаются из каменных блоков. Обычно встречаются в крепостях. - - - Можно использовать в качестве преграды - как забор. - - - То же, что и дверь, но обычно используются в заборах. - - - Можно сделать из кусков дыни. - - - Прозрачные блоки, которые можно использовать вместо стеклянных блоков. - - - Можно посадить, чтобы вырастить тыквы. - - - Можно посадить, чтобы вырастить дыни. - - - Выпадают из погибших заокраинников. Если бросить жемчужину, игрок телепортируется туда, где она упала, потеряв часть здоровья. - - - Блок земли, на котором растет трава. Его можно добыть с помощью лопаты и использовать при строительстве. - - - Можно использовать как строительный материал и украшение. - - - Замедляет всех, кто идет через нее. Ее можно разрезать ножницами и добыть нить. - - - При уничтожении создает чешуйницу. Кроме того, может создать чешуйницу, если рядом напали на другую чешуйницу. - - - Посаженная лоза начинает расти. Ее можно собрать ножницами. По лозе можно лазить, как по лестнице. - - - По нему скользко ходить. Если находится на другом блоке, разрушившись, лед превращается в воду. Тает, если находится в преисподней или располагается близко к источнику света. - - - Можно использовать в качестве украшения. - - - Используются для создания зелий и при поиске крепостей. Выпадают из сполохов, которые находятся рядом или внутри адских крепостей. - - - Используются для создания зелий. Выпадают из убитых вурдалаков. - - - Используются для создания зелий. Выпадают из убитых зомби-свинолюдей, которых можно встретить в преисподней. - - - Используется для создания зелий. Такие растения обычно растут в адских крепостях, но их также можно посадить на песке души. - - - Эффект зависит от того, на каком объекте используется зелье. - - - Бутылку можно наполнить водой и использовать в качестве первого ингредиента зелья на варочной стойке. - - - Это ядовитая пища и ингредиент зелий. Выпадает из убитых пауков и пещерных пауков. - - - Используется при изготовлении зелий - в основном с вредоносным эффектом. - - - Используется при изготовлении зелий или, вместе с другими предметами, для создания "Глаза Края" или "Сливок магмы". - - - Используется при изготовлении зелий. - - - Используется при изготовлении зелий и разрывных зелий. - - - В котел можно налить воду из ведра (или поставить его под дождь, и вода наберется сама), а затем наполнять из него бутылки. - - - Если бросить, укажет направление к порталу Края. Портал Края активируется, когда двенадцать таких глаз размещены на его рамках. - - - Используется при изготовлении зелий. - - - Похож на блоки травы, но на нем очень хорошо выращивать грибы. - - - Плавает по воде, и по ней можно пройти. - - - Используется для строительства адских крепостей. На них не действуют огненные шары вурдалаков. - - - Используется в адских крепостях. - - - Этот объект можно найти в адских крепостях. Если его разломать, из него выпадают адские бородавки. - - - Позволяет накладывать чары на мечи, кирки, топоры, лопаты, луки и доспехи в обмен на очки опыта. - - - Можно активировать с помощью 12 глаз Края, и тогда он позволит игроку перейти в мир Края. - - - Используется для строительства портала Края. - - - Блоки такого типа можно найти в мире Края. Они очень устойчивы к взрывам и являются отличным строительными материалом. - - - Этот блок создается после победы над драконом на Краю. - - - Если бросить, из него вылетают сферы опыта. Собранные сферы увеличивают ваш опыт. - - - Отлично подходит для поджигания различных объектов. Вы можете поджигать все без разбора, если воспользуетесь раздатчиком. - - - Этот предмет похож на витрину. Предмет или блок, положенный в него, будет виден. - - - При броске породит существо указанного типа. - - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. - - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. - - - Данный предмет можно получить, расплавив адский камень в печи. Из него можно сделать блоки адских кирпичей. - - - Под напряжением излучают свет. - - - С этого растения можно собирать какао-бобы. - - - Можно использовать в качестве украшения или носить как маску, поместив в ячейку шлема. - - - Кальмар - - - Из убитого животного выпадают чернильные мешки. - - - Корова - - - Из убитой коровы выпадает кожа. Кроме того, корову можно доить, собирая молоко в ведро. - - - Овца - - - С овцы можно состричь шерсть с помощью ножниц (если ее уже не остригли). Шерсть можно покрасить в разные цвета. - - - Курица - - - Из убитой курицы выпадают перья. Кроме того, курицы иногда несут яйца. - - - Свинья - - - Из убитой свиньи выпадают отбивные. Если надеть на свинью седло, на ней можно ездить верхом. - - - Волк - - - Смирные животные, но если на них напасть, они оказывают сопротивление. Можно приручить волка, дав ему кость; в этом случае он будет следовать за вами повсюду и нападать на всех, кто нападает на вас. - - - Крипер - - - Если подойти слишком близко, взрывается! - - - Скелет - - - Выпускает в вас стрелы. Если его убить, из него выпадают стрелы. - - - Паук - - - Если подойти близко, нападает. Может лазить по стенам. Из убитых пауков выпадают нити. - - - Зомби - - - Если подойти близко, нападает. - - - Зомби-свиночеловек - - - Обычно смирные, но начнут атаковать группами, если напасть на одного из них. - - - Вурдалак - - - Стреляет огненными шарами, которые взрываются при соприкосновении с целью. - - - Слизняк - - - Получив урон, распадается на маленьких слизней. - - - Заокраинник - - - Нападет, если посмотреть на него. Умеет передвигать блоки. - - - Чешуйница - - - Если это существо атаковать, оно привлекает других чешуйниц, прячущихся неподалеку. Прячется в каменных блоках. - - - Пещерный паук - - - Укус этого паука ядовит. - - - Гриборова - - - Если использовать на ней миску, дает тушеные грибы. Если ее остричь, сбрасывает грибы и превращается в обычную корову. - - - Снежный голем - - - Снежного голема можно сделать из снежных блоков и тыквы. Големы бросают снежки во врагов своего создателя. - - - Дракон Края - - - Большой черный дракон, которого можно встретить в мире Края. - - - Сполох - - - Этих врагов можно встретить в преисподней, особенно в адских крепостях. Если их убить, из них выпадают огненные жезлы. - - - Куб магмы - - - Этих врагов можно встретить в преисподней. Как и слизни, убитые распадаются на несколько меньших существ. - - - Крестьянин - - - Оцелот - - - Оцелоты водятся в джунглях. Их можно приручить, накормив сырой рыбой. Однако оцелот сам должен подойти к вам, так как любые резкие движения его пугают. - - - Железный голем - - - Появляется в деревнях, чтобы их защищать. Его можно сделать из железных блоков и тыкв. - - - Аниматор взрывов - - - Художник по эскизам - - - Перемалывание чисел и статистика - - - Координатор запугивания - - - Дизайн и программный код - - - Менеджер проекта/продюсер - - - Остальной народ из офиса Mojang - - - Ведущий игровой программист Minecraft для ПК - - - Ниндзя-программист - - - Главный исполнительный директор - - - Белые воротнички - - - Техподдержка - - - Офисный диджей - - - Дизайнер/программист Minecraft для КПК - - - Разработчик - - - Главный архитектор - - - Разработчик графики - - - Разработчик игры - - - Директор по веселью - - - Музыка и звуки - - - Программирование - - - Рисунки - - - Контроль качества - - - Исполнительный продюсер - - - Ведущий продюсер - - - Продюсер - - - Руководство тестированием - - - Ведущий тестер - - - Команда дизайнеров - - - Команда разработчиков - - - Управление релизами - - - Директор, отдел издания XBLA - - - Развитие бизнеса - - - Директор по портфолио - - - Менеджер продукта - - - Маркетинг - - - Менеджер по связям с сообществом - - - Команда локализаторов (Европа) - - - Команда локализаторов (Редмонд) - - - Команда локализаторов (Азия) - - - Исследовательская команда - - - Команды MGS Central - - - Тестер ключевых версий - - - Особая благодарность - - - Менеджер тестирования - - - Старший ведущий сотрудник по тестированию - - - SDET - - - STE проекта - - - Дополнительный STE проекта - - - Помощники тестеров - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Деревянный меч - - - Каменный меч - - - Железный меч - - - Алмазный меч - - - Золотой меч - - - Деревянная лопата - - - Каменная лопата - - - Железная лопата - - - Алмазная лопата - - - Золотая лопата - - - Деревянная кирка - - - Каменная кирка - - - Железная кирка - - - Алмазная кирка - - - Золотая кирка - - - Деревянный топор - - - Каменный топор - - - Железный топор - - - Алмазный топор - - - Золотой топор - - - Деревянная мотыга - - - Каменная мотыга - - - Железная мотыга - - - Алмазная мотыга - - - Золотая мотыга - - - Деревянная дверь - - - Железная дверь - - - Кольчужный шлем - - - Кольчужный нагрудник - - - Кольчужные поножи - - - Кольчужные сапоги - - - Кожаная шапка - - - Железный шлем - - - Алмазный шлем - - - Золотой шлем - - - Кожаная куртка - - - Железный нагрудник - - - Алмазный нагрудник - - - Золотой нагрудник - - - Кожаные штаны - - - Железные поножи - - - Алмазные поножи - - - Золотые поножи - - - Кожаные сапоги - - - Железные сапоги - - - Алмазные сапоги - - - Золотые сапоги - - - Железный слиток - - - Золотой слиток - - - Ведро - - - Ведро с водой - - - Ведро с лавой - - - Кремень и огниво - - - Яблоко - - - Лук - - - Стрела - - - Уголь - - - Древесный уголь - - - Алмаз - - - Палка - - - Миска - - - Тушеные грибы - - - Нить - - - Перо - - - Порох - - - Зерна пшеницы - - - Пшеница - - - Хлеб - - - Кремень - - - Сырая свиная отбивная - - - Готовая свиная отбивная - - - Картина - - - Золотое яблоко - - - Табличка - - - Вагонетка - - - Седло - - - Красный камень - - - Снежок - - - Лодка - - - Кожа - - - Ведро с молоком - - - Кирпич - - - Глина - - - Сахарный тростник - - - Бумага - - - Книга - - - Комок слизи - - - Вагонетка с сундуком - - - Вагонетка с печкой - - - Яйцо - - - Компас - - - Удочка - - - Часы - - - Сияющая пыль - - - Сырая рыба - - - Готовая рыба - - - Сухая краска - - - Чернильный мешок - - - Краска "Красная роза" - - - Кактусовый зеленый - - - Какао-бобы - - - Ляпис-лазурь - - - Лиловая краска - - - Бирюзовая краска - - - Светло-серая краска - - - Серая краска - - - Розовая краска - - - Светло-зеленая краска - - - Одуванчиковый желтый - - - Голубая краска - - - Пурпурная краска - - - Оранжевая краска - - - Костная мука - - - Кость - - - Сахар - - - Торт - - - Кровать - - - Красный ретранслятор - - - Печенье - - - Карта - - - Музыкальный диск "13" - - - Музыкальный диск "Кошка" - - - Музыкальный диск "Блоки" - - - Музыкальный диск "Щебет" - - - Музыкальный диск "Даль" - - - Музыкальный диск "Молл" - - - Музыкальный диск "Меллохи" - - - Музыкальный диск "Шталь" - - - Музыкальный диск "Штрад" - - - Музыкальный диск "Вард" - - - Музыкальный диск "11" - - - Музыкальный диск "Где мы сейчас" - - - Ножницы - - - Семена тыквы - - - Семена дыни - - - Сырая курятина - - - Готовая курятина - - - Сырая говядина - - - Бифштекс - - - Гнилое мясо - - - Жемчужина Края - - - Кусок дыни - - - Огненный жезл - - - Слеза вурдалака - - - Золотой самородок - - - Адская бородавка - - - {*splash*}{*prefix*}зелье {*postfix*} - - - Стеклянная бутылка - - - Бутылка с водой - - - Глаз паука - - - Ферментир. глаз паука - - - Огненный порошок - - - Сливки магмы - - - Варочная стойка - - - Котел - - - Глаз Края - - - Искрящаяся дыня - - - Бутыль колдовства - - - Огненный заряд - - - Огн. заряд (др. уголь) - - - Огн. заряд (уголь) - - - Рамка - - - Возродить существо: {*CREATURE*} - - - Адский кирпич - - - Череп - - - Череп скелета - - - Череп иссушенного скелета - - - Голова зомби - - - Голова - - - Голова игрока %s - - - Голова крипера - - - Камень - - - Трава - - - Земля - - - Булыжник - - - Дубовые доски - - - Еловые доски - - - Березовые доски - - - Доски (дер. джунглей) - - - Саженец - - - Саженец дуба - - - Саженец ели - - - Саженец березы - - - Саженец дерева джунглей - - - Коренная порода - - - Вода - - - Лава - - - Песок - - - Песчаник - - - Гравий - - - Золотоносная руда - - - Железная руда - - - Угольная руда - - - Древесина - - - - Дубовое полено - - - Еловое полено - - - Березовое полено - - - Полено из дерева джунглей - - - Дуб - - - Ель - - - Береза - - - Листья - - - Дубовые листья - - - Еловые иголки - - - Березовые листья - - - Листья дерева джунглей - - - Губка - - - Стекло - - - Шерсть - - - Черная шерсть - - - Красная шерсть - - - Зеленая шерсть - - - Коричневая шерсть - - - Синяя шерсть - - - Лиловая шерсть - - - Бирюзовая шерсть - - - Светло-серая шерсть - - - Серая шерсть - - - Розовая шерсть - - - Светло-зеленая шерсть - - - Желтая шерсть - - - Голубая шерсть - - - Пурпурная шерсть - - - Оранжевая шерсть - - - Белая шерсть - - - Цветок - - - Роза - - - Гриб - - - Золотой блок - - - Способ компактно хранить золото. - - - Железный блок - - - Способ компактно хранить железо. - - - Каменная плита - - - Каменная плита - - - Плита из песчаника - - - Дубовая плита - - - Плита из булыжника - - - Плита из кирпича - - - Плита из каменных блоков - - - Плита из дуба - - - Плита из ели - - - Плита из березы - - - Плита из дерева джунглей - - - Плита из адского камня - - - Кирпичи - - - Тротил - - - Книжная полка - - - Замшелый камень - - - Обсидиан - - - Факел - - - Факел (уголь) - - - Факел (древ. уголь) - - - Огонь - - - Источник монстров - - - Дубовая лестница - - + Сундук - - Красная пыль + + Зачаровать - - Алмазная руда - - - Алмазный блок - - - Способ компактно хранить алмазы. - - - Верстак - - - Урожай - - - Грядка - - + Печь - - Табличка + + Для этой игры сейчас нет загружаемого контента данного типа. - - Деревянная дверь + + Удалить эту сохраненную игру? - - Лестница + + Ожидает проверки - - Рельсы + + Отклонено - - Рельсы под напряжением + + %s присоединяется к игре. - - Рельсы с детектором + + %s покидает игру. - - Каменная лестница + + %s исключается из игры. - - Рычаг - - - Нажимная плита - - - Железная дверь - - - Красная руда - - - Красный факел - - - Кнопка - - - Снег - - - Лед - - - Кактус - - - Глина - - - Сахарный тростник - - - Музыкальный автомат - - - Забор - - - Тыква - - - Фонарь из тыквы - - - Адский камень - - - Песок души - - - Сияющий камень - - - Портал - - - Лазуритовая руда - - - Блок ляпис-лазури - - - Способ компактно хранить ляпис-лазурь. - - - Раздатчик - - - Нотный блок - - - Торт - - - Кровать - - - Паутина - - - Высокая трава - - - Засохший куст - - - Диод - - - Запертый сундук - - - Люк - - - Шерсть (любого цвета) - - - Поршень - - - Липкий поршень - - - Блок-чешуйница - - - Каменные кирпичи - - - Кирпичи из замшелых камней - - - Кирпичи из растрескавшихся камней - - - Кирпичи из обработанных камней - - - Гриб - - - Гриб - - - Железная решетка - - - Стекло - - - Дыня - - - Стебель тыквы - - - Стебель дыни - - - Лоза - - - Ворота забора - - - Кирпичная лестница - - - Лестница (камен. кирпичи) - - - Камень-чешуйница - - - Булыжник-чешуйница - - - Каменный кирпич-чешуйница - - - Мицелий - - - Кувшинка - - - Адский кирпич - - - Забор из адского кирпича - - - Лестница (ад. кирпичи) - - - Адская бородавка - - - Колдовской стол - - + Варочная стойка - - Котел + + Текст на табличке - - Портал Края + + Введите текст вашей таблички - - Рамка портала Края + + Заголовок - - Камень Края + + Тайм-аут пробной версии - - Яйцо дракона + + Игра переполнена - - Куст + + Не удалось присоединиться к игре, так как в ней нет свободных мест - - Папоротник + + Введите заголовок вашего сообщения - - Лестница из песчаника + + Введите описание вашего сообщение - - Лестница из ели - - - Березовая лестница - - - Лестница (дерево джунг.) - - - Красная лампа - - - Какао - - - Череп - - - Выбранное управление - - - Раскладка - - - Движение/ускорение - - - Осмотр - - - Пауза - - - Прыжок - - - Прыжок/взлет - - + Инвентарь - - Выбор предмета + + Ингредиенты - - Действие + + Подпись - - Применение + + Введите подпись вашего сообщения - - Создание предметов + + Описание - - Выбросить + + Играет: - - Красться + + Добавить этот уровень к списку запрещенных? +Выбрав "ОК", вы, кроме того, выйдете из игры. - - Красться/лететь вниз + + Удалить из черного списка - - Изменить режим камеры + + Сохранять каждые - - Игроки/пригласить + + Запрещенный уровень - - Движение (в полете) + + Игра, к которой вы присоединяетесь, находится в вашем списке запрещенных уровней. Если вы к ней присоединитесь, она будет удалена из списка запрещенных. - - Раскладка 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;]]> + + Игра пользователя %s - - <![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;]]> + + Ошибка при загрузке - - <![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*}. Пока вы удерживаете{*CONTROLLER_ACTION_MOVE*} смещенным вперед, персонаж будет бежать вперед, пока не закончится время бега или продовольствие. - - - Чтобы прыгнуть, нажмите{*CONTROLLER_ACTION_JUMP*}. - - - Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... - - - Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы срубить 4 блока дерева (ствола).{*B*}Когда блок разломится на части, вы сможете подобрать висящий в воздухе предмет, встав рядом с ним. После этого предмет появится в инвентаре. - - - Нажмите{*CONTROLLER_ACTION_CRAFTING*}, чтобы открыть панель создания предметов. - - - По мере того, как вы собираете и изготавливаете предметы, ваш инвентарь будет заполняться.{*B*} - Нажмите{*CONTROLLER_ACTION_INVENTORY*}, чтобы открыть инвентарь. - - - Когда вы двигаетесь, добываете породу и нападаете на врагов, шкала пищи пустеет{*ICON_SHANK_01*}. Во время бега и прыжков с разбегу расходуется больше продовольствия, чем при ходьбе и обычных прыжках. - - - Если ваше здоровье ухудшилось, но шкала пищи находится на отметке 9{*ICON_SHANK_01*} или больше, то здоровье улучшится автоматически. Ешьте, чтобы заполнить шкалу пищи. - - - Чтобы съесть съедобный предмет, который вы держите в руках, и восполнить уровень здоровья, удерживайте{*CONTROLLER_ACTION_USE*}. Вы не можете есть, если шкала пищи заполнена. - - - Шкала пищи почти на нуле, и вы ранены. Съешьте бифштекс, который находится в инвентаре, чтобы пополнить шкалу пищи и подлечиться.{*ICON*}364{*/ICON*} - - - Из древесины, которую вы собрали, можно сделать доски. Для этого откройте экран создания предметов.{*PlanksIcon*} - - - Создание многих предметов состоит из нескольких этапов. Теперь, когда у вас есть доски, вы можете изготовить новые предметы. Сделайте верстак.{*CraftingTableIcon*} - - - Вы можете делать инструменты, которые ускорят добычу блоков. Некоторым инструментам нужны ручки, сделанные из палок. Приготовьте несколько палок.{*SticksIcon*} - - - Используйте{*CONTROLLER_ACTION_LEFT_SCROLL*} и{*CONTROLLER_ACTION_RIGHT_SCROLL*}, чтобы сменить предмет, который вы держите в руках. - - - Используйте{*CONTROLLER_ACTION_USE*}, чтобы использовать предметы, размещать их и взаимодействовать с объектами. Размещенные предметы можно подобрать заново, добыв их с помощью соответствующего инструмента. - - - Чтобы поставить верстак, выберите его, наведите курсор на нужное место и используйте{*CONTROLLER_ACTION_USE*}. - - - Чтобы открыть верстак, наведите на него курсор и нажмите{*CONTROLLER_ACTION_USE*}. - - - Лопата помогает копать мягкие блоки, например, землю и снег. Получая различные материалы, вы сможете изготавливать инструменты, которые будут работать быстрее и служить вам дольше. Создайте деревянную лопату.{*WoodenShovelIcon*} - - - Топор помогает быстрее рубить древесину и квадраты с деревом. Получая различные материалы, вы сможете изготавливать инструменты, которые будут работать быстрее и служить вам дольше. Создайте деревянный топор.{*WoodenHatchetIcon*} - - - Кирка помогает добывать быстрее прочные блоки вроде камня и руды. Получая различные материалы, вы сможете изготавливать инструменты, которые будут работать быстрее и служить вам дольше. Создайте деревянную кирку.{*WoodenPickaxeIcon*} - - - Открыть контейнер - - + - Ночь может наступить очень быстро, и находиться снаружи станет опасно. Вы можете изготовить оружие и доспехи, но лучше всего построить надежное убежище. + Здесь находится ферма. Фермы позволяют создавать возобновляемый источник пищи и других предметов. - - - Неподалеку находится брошенное убежище шахтера, которое вы можете достроить, чтобы там переночевать. - - - - - Для строительства убежища вам понадобятся ресурсы. Стены и крышу можно сделать из любых блоков, но вам также придется создать дверь, окна и освещение. - - - - Добудьте несколько каменных блоков с помощью кирки. Добывая каменные блоки, можно получить немного булыжника. Если вы наберете 8 булыжников, то сможете сложить печь. Возможно, вам придется раскопать землю, чтобы добраться до камня. Сделайте это с помощью лопаты.{*StoneIcon*} - - - У вас достаточно булыжников, чтобы сложить печь. Для этого воспользуйтесь верстаком. - - - Поставьте печь с помощью{*CONTROLLER_ACTION_USE*}, а затем откройте ее. - - - Сделайте немного древесного угля с помощью печи. А пока он готовится, может, наберете еще материалов и достроите убежище? - - - Сделайте немного стекла с помощью печи. А пока оно готовится, может, наберете еще материалов и достроите убежище? - - - У хорошего убежища есть дверь, чтобы можно было легко входить и выходить, не вырубая дыры в стенах. Сделайте деревянную дверь.{*WoodenDoorIcon*} - - - Поставьте дверь с помощью{*CONTROLLER_ACTION_USE*}. Открывать и закрывать ее можно с помощью{*CONTROLLER_ACTION_USE*}. - - - Ночью очень темно, так что в убежище нужно освещение. Создайте факел из палок и угля. Для этого используйте экран создания предметов.{*TorchIcon*} - - - - Вы прошли первую часть обучения. - - - + {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить обучение.{*B*} - Нажмите{*CONTROLLER_VK_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*}, если вы уже умеете пользоваться инвентарем. - - - + - Для передвижения курсора используйте{*CONTROLLER_MENU_NAVIGATE*}. Нажмите{*CONTROLLER_VK_A*}, чтобы взять предмет. - Если предметов несколько, вы возьмете их все. Если хотите взять только половину, используйте{*CONTROLLER_VK_X*}. + Здесь находится портал в преисподнюю! - + - Чтобы поместить предметы в другую ячейку, наведите на нее курсор и нажмите{*CONTROLLER_VK_A*}. - Если на курсоре несколько предметов, используйте{*CONTROLLER_VK_A*}, чтобы положить все, или{*CONTROLLER_VK_X*}, чтобы положить только один. + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о порталах и преисподней.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о порталах и преисподней. - + - Чтобы бросить предмет, выведите курсор с предметом за пределы экрана предметов. + Красную пыль можно получить, добывая красную руду с помощью железной, алмазной или золотой кирки. С помощью пыли можно передавать энергию на расстояние до 15 блоков, и она может сдвигаться на 1 блок вверх или вниз. + {*ICON*}331{*/ICON*} - + - Если вам нужна дополнительная информация о предмете, наведите на него курсор и нажмите {*CONTROLLER_VK_BACK*}. + Красные ретрансляторы можно использовать для передачи энергии на большие расстояния или для того, чтобы задержать прохождение сигнала по схеме. + {*ICON*}356{*/ICON*} - + - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть инвентарь. + Поршень, соединенный с источником энергии, выдвигается, толкая до 12 блоков. Липкий поршень, втягиваясь, может тянуть за собой один блок почти любого вида. + {*ICON*}33{*/ICON*} - + - Это инвентарь режима "Творчество". В нем показаны предметы, которые можно взять в руки, а также все остальные. + Чтобы создать портал, необходимо построить обсидиановую раму - 4 блока в ширину и 5 в высоту. Угловые блоки не требуются. - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете пользоваться инвентарем в режиме "Творчество". - - - + - Для передвижения курсора используйте{*CONTROLLER_MENU_NAVIGATE*}. - Находясь в списке предметов, используйте{*CONTROLLER_VK_A*}, чтобы взять предмет под курсором, и{*CONTROLLER_VK_Y*}, чтобы взять все предметы данного вида. + Путешествия по преисподней - хороший способ быстро преодолеть расстояние в наземном мире: 1 блок в преисподней равен 3 в наземном мире. - + - Курсор автоматически переместится на ячейку в ряду использования. Вы можете положить предмет с помощью{*CONTROLLER_VK_A*}. После этого курсор вернется в список, и вы сможете выбрать другой предмет. + Вы в режиме "Творчество". - + - Чтобы бросить предмет, выведите курсор с предметом за пределы экрана предметов. Чтобы выбросить все предметы из панели быстрого выбора, нажмите{*CONTROLLER_VK_X*}. + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о режиме "Творчество".{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о режиме "Творчество". - + - Пролистайте закладки с помощью{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*} и выберите нужную группу предметов. + Чтобы активировать портал в преисподнюю, подожгите обсидиановые блоки, находясь внутри портала, с помощью кремня и огнива. Порталы деактивируются только в том случае, если одна из стен разрушена, если рядом произошел взрыв или если через них протекла жидкость. - + - Если вам нужна дополнительная информация о предмете, наведите на него курсор и нажмите{*CONTROLLER_VK_BACK*} . + Чтобы воспользоваться порталом в преисподнюю, зайдите в него. Экран окрасится в лиловый цвет, и прозвучит определенный звук. Через несколько мгновений вы окажетесь в другом измерении. + - + - Нажмите{*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*}, если вы уже знаете, как изготавливать предметы. - - - - {*B*} - Нажмите{*CONTROLLER_VK_X*}, чтобы открыть описание предмета. - - - - {*B*} - Нажмите{*CONTROLLER_VK_X*}, чтобы показать ингредиенты, необходимые для изготовления данного предмета. - - - - {*B*} - Нажмите{*CONTROLLER_VK_X*}, чтобы снова открыть инвентарь. - - - + - Пролистайте закладки с помощью{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы выбрать нужную группу предметов, а затем выберите в ней предмет, который хотите создать, с помощью{*CONTROLLER_MENU_NAVIGATE*}. + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о животных и их разведении.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о животных и их разведении. - + + Чтобы животные размножались, они должны перейти в "Режим любви". Для этого их нужно кормить подходящими продуктами. + + + Некоторые животные будут следовать за вами, если вы держите в руке их пищу. Так вам будет проще собрать их вместе для разведения.{*ICON*}296{*/ICON*} + + - На экране создания предметов указаны все ингредиенты, необходимые для изготовления нового предмета. Нажмите{*CONTROLLER_VK_A*}, чтобы создать предмет и отправить его в инвентарь. + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о големах.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о големах. - + + Чтобы создать голема, необходимо поставить тыкву на штабель блоков. + + + Снежный голем состоит из двух блоков снега, поставленных один на другой, наверху которых стоит тыква. Снежные големы бросают снежки в ваших врагов. + + - Верстак увеличивает число предметов, которые можно создать. На верстаке работа идет, как обычно, но у вас больше рабочего пространства и больше доступных ингредиентов. +Диких волков можно приручить, давая им кости. Над прирученным волком появляются сердечки. Такой волк будет следовать за игроком и защищать его, если только ему не была дана команда сидеть. - + + Вы прошли курс обучения, посвященный животным и их разведению. + + - В нижней части верстака показаны предметы в вашем инвентаре, а также дано описание выбранного предмета и перечислены ингредиенты, необходимые для его создания. + Здесь находятся тыквы и блоки, из которых можно сделать снежного и железного голема. - + - Вы видите описание выбранного предмета. Оно даст некоторое представление о том, как можно использовать данный предмет. - - - - - Вы видите список ингредиентов, необходимых для создания выбранного предмета. - - - - Собранное вами дерево можно превратить в доски. Выберите значок досок и нажмите{*CONTROLLER_VK_A*}, чтобы их создать.{*PlanksIcon*} - - - - Теперь у вас есть верстак; поставьте его, и у вас появится возможность создавать еще больше разных предметов.{*B*} - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. - - - - - Нажимайте{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы перейти к группе, к которой относится нужный предмет. Выберите группу инструментов.{*ToolsIcon*} - - - - - Нажимайте{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы перейти к группе, к которой относится нужный предмет. Выберите группу зданий.{*StructuresIcon*} - - - - - Выберите предмет, который хотите создать, с помощью{*CONTROLLER_MENU_NAVIGATE*}. У некоторых предметов есть разные варианты - в зависимости от использованных материалов. Выберите деревянную лопату.{*WoodenShovelIcon*} - - - - - Создание многих предметов состоит из нескольких этапов. Теперь, когда у вас есть доски, вы можете изготовить новые предметы. -Чтобы перейти к предмету, который вы хотите создать, используйте{*CONTROLLER_MENU_NAVIGATE*}. Выберите верстак.{*CraftingTableIcon*} - - - - - Вы создали несколько отличных инструментов, и теперь сможете более эффективно добывать материалы.{*B*} - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. - - - - - Некоторые предметы нельзя изготовить на верстаке - для их создания нужна печь. Сделайте ее.{*FurnaceIcon*} - - - - - Поставьте созданную печь. Имеет смысл расположить ее внутри убежища.{*B*} - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. - - - - - Это экран печи. Печь позволяет изменять предметы, обжигая их. Например, с ее помощью вы сможете превратить железную руду в железные слитки. - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как работать с печью. - - - - - Поместите топливо в нижнюю ячейку печи, а предмет, который нужно изменить - в верхнюю. Затем в печи загорится огонь, и она начнет работать. Готовый предмет попадет в ячейку справа. - - - - - Многие деревянные предметы можно использовать в качестве топлива, но не все они горят одинаково долго. Кроме того, есть и другие предметы, которые можно жечь. - - - - - После обжига вы можете переместить предметы в инвентарь. Экспериментируйте с разными ингредиентами, чтобы узнать, что еще можно сделать. - - - - - Возьмите в качестве ингредиента древесину, чтобы приготовить древесный уголь. Положите в печь топливо, а древесину - в ячейку ингредиента. На приготовление уйдет некоторое время, так что можете заняться другими делами, а потом вернуться к печи. - - - - - Древесный уголь - один из видов топлива. Кроме того, если насадить уголь на палку, получится факел. - - - - - Поместив песок в ячейку ингредиента, вы сделаете стекло. Создайте несколько стеклянных блоков, чтобы сделать из них окна в вашем убежище. - - - - - Это интерфейс создания зелий. Здесь можно создать зелья, обладающие различными эффектами. - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать варочную стойку. - - - - - Чтобы сварить зелье, поместите в верхнюю ячейку ингредиент, а в нижние - зелья или бутылки с водой (одновременно можно создавать до 3 зелий). Если получилась допустимая комбинация, начнется процесс зельеварения, и через некоторое время зелье будет готово. - - - - - Для каждого зелья нужна бутылка с водой. Приготовление большинства зелий можно начать с создания "Неудобоваримого зелья" из адской бородавки, а затем добавить к нему еще хотя бы один ингредиент. - - - - - Сварив зелье, вы можете изменить его эффект. Добавив красную пыль, вы увеличите время действия зелья, а сияющая пыль сделает его более мощным. - - - - - Ферментированный глаз паука оскверняет зелье и может изменить его эффект на противоположный, а порох превращает зелье в разрывное, которое можно бросить, чтобы оно подействовало на все объекты, находящиеся в определенной области. - - - - - Создайте зелье устойчивости к огню, сначала положив в бутылку с водой адскую бородавку, а затем добавив сливки магмы. - - - - - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания зелий. - - - - - Здесь находятся варочная стойка, котел и сундук с ингредиентами. - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зельях и том, как их варить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже достаточно знаете о зельеварении. - - - - - Чтобы сварить зелье, для начала получите бутылку с водой. Для этого возьмите из сундука стеклянную бутылку. - - - - - Наполнить бутылку можно из котла, в котором есть вода, или из блока воды. Наполните бутылку, указав на источник воды и нажав{*CONTROLLER_ACTION_USE*}. + Эффект, который источник энергии оказывает на окружающие блоки, зависит от его положения и ориентации. Например, факел рядом с блоком, может погаснуть, если блок получает энергию из другого источника. @@ -3120,11 +916,42 @@ Minecraft - игра, в которой можно построить из бл Чтобы использовать зелье, возьмите его в руку и зажмите{*CONTROLLER_ACTION_USE*}. Обычное зелье вы выпьете, и его эффект подействует на вас, а разрывное - бросите, и оно подействует на существ, которые окажутся в зоне поражения. Чтобы превратить обычное зелье в разрывное, добавьте в него порох. + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зельях и том, как их варить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже достаточно знаете о зельеварении. + + + + + Чтобы сварить зелье, для начала получите бутылку с водой. Для этого возьмите из сундука стеклянную бутылку. + + + + + Наполнить бутылку можно из котла, в котором есть вода, или из блока воды. Наполните бутылку, указав на источник воды и нажав{*CONTROLLER_ACTION_USE*}. Выпейте зелье устойчивости к огню. + + + + + Чтобы зачаровать предмет, прежде всего положите его в ячейку для зачаровывания. Зачарованные предметы приобретают особые свойства: например, увеличивается их уровень защиты или число предметов, получаемых при разработке блока. + + + + + Если поместить предмет в ячейку, на кнопке справа появятся различные случайно выбранные чары. + + + + + Число на кнопке соответствует уровням опыта, которые нужно потратить. Если вашего уровня недостаточно, кнопка будет неактивной. @@ -3143,117 +970,80 @@ Minecraft - игра, в которой можно построить из бл Нажмите{*CONTROLLER_VK_B*}, если вы уже знакомы с окном зачаровывания. - + - Чтобы зачаровать предмет, прежде всего положите его в ячейку для зачаровывания. Зачарованные предметы приобретают особые свойства: например, увеличивается их уровень защиты или число предметов, получаемых при разработке блока. + Здесь находятся варочная стойка, котел и сундук с ингредиентами. - + - Если поместить предмет в ячейку, на кнопке справа появятся различные случайно выбранные чары. + Древесный уголь - один из видов топлива. Кроме того, если насадить уголь на палку, получится факел. - + - Число на кнопке соответствует уровням опыта, которые нужно потратить. Если вашего уровня недостаточно, кнопка будет неактивной. + Поместив песок в ячейку ингредиента, вы сделаете стекло. Создайте несколько стеклянных блоков, чтобы сделать из них окна в вашем убежище. + + + + + Это интерфейс создания зелий. Здесь можно создать зелья, обладающие различными эффектами. + + + + + Многие деревянные предметы можно использовать в качестве топлива, но не все они горят одинаково долго. Кроме того, есть и другие предметы, которые можно жечь. + + + + + После обжига вы можете переместить предметы в инвентарь. Экспериментируйте с разными ингредиентами, чтобы узнать, что еще можно сделать. + + + + + Возьмите в качестве ингредиента древесину, чтобы приготовить древесный уголь. Положите в печь топливо, а древесину - в ячейку ингредиента. На приготовление уйдет некоторое время, так что можете заняться другими делами, а потом вернуться к печи. + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать варочную стойку. + + + + + Ферментированный глаз паука оскверняет зелье и может изменить его эффект на противоположный, а порох превращает зелье в разрывное, которое можно бросить, чтобы оно подействовало на все объекты, находящиеся в определенной области. + + + + + Создайте зелье устойчивости к огню, сначала положив в бутылку с водой адскую бородавку, а затем добавив сливки магмы. + + + + + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания зелий. + + + + + Чтобы сварить зелье, поместите в верхнюю ячейку ингредиент, а в нижние - зелья или бутылки с водой (одновременно можно создавать до 3 зелий). Если получилась допустимая комбинация, начнется процесс зельеварения, и через некоторое время зелье будет готово. + + + + + Для каждого зелья нужна бутылка с водой. Приготовление большинства зелий можно начать с создания "Неудобоваримого зелья" из адской бородавки, а затем добавить к нему еще хотя бы один ингредиент. + + + + + Сварив зелье, вы можете изменить его эффект. Добавив красную пыль, вы увеличите время действия зелья, а сияющая пыль сделает его более мощным. Выберите чары и нажмите{*CONTROLLER_VK_A*}, чтобы зачаровать предмет. Ваш уровень опыта уменьшится на сумму, необходимую для зачаровывания. - - - - - Чары выбираются случайным образом, однако лучшие из них доступны только тем игрокам, у которых высокий уровень опыта и которые окружили свой колдовской стол большим количеством книжных шкафов. - - - - - Здесь находится колдовской стол и другие предметы, которые помогут вам узнать больше о зачаровывании. - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зачаровывании.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как зачаровывать предметы. - - - - - Колдовской стол позволяет снабдить предметы особыми свойствами. Например, увеличить число предметов, получаемых при разработке блока, или повысить сопротивляемость урону для оружия, доспехов или некоторых инструментов. - - - - - Окружив колдовской стол книжными шкафами, вы повысите его силу и получите доступ к чарам высоких уровней. - - - - - На зачаровывание уходят уровни опыта. Чтобы приобрести опыт, собирайте сферы опыта, выпадающие из убитых монстров и животных, добывайте руду, разводите животных, ловите рыбу и обрабатывайте предметы в печи. - - - - - Кроме того, вы можете использовать бутыли зачаровывания: если их бросить, то на месте падения появятся сферы опыта, которые можно собрать. - - - - - Здесь в сундуках хранятся зачарованные предметы, бутыли зачаровывания и предметы, которые еще не зачарованы. Вы сможете поэкспериментировать с ними на колдовском столе. - - - - - Вы едете на вагонетке. Чтобы слезть с нее, наведите на нее курсор и нажмите{*CONTROLLER_ACTION_USE*}. {*MinecartIcon*} - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о вагонетках.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете про вагонетки. - - - - - Вагонетки ездят по рельсам. Можно сделать вагонетку с печкой или вагонетку с сундуком. - {*RailIcon*} - - - - - Кроме того, вы можете создать рельсы с источником энергии, которые ускоряют вагонетку, черпая энергию из факелов и схем из красного камня. Их можно подключать к переключателям, рычагам и нажимным пластинам, таким образом строя сложные системы. - {*PoweredRailIcon*} - - - - - Вы плывете на лодке. Чтобы выйти из нее, наведите на нее курсор и нажмите{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о лодках.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете про лодки. - - - - - Лодка позволяет быстрее плыть по воде. Чтобы управлять ею, используйте{*CONTROLLER_ACTION_MOVE*} и{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - - - - - Вы удите рыбу удочкой. Чтобы использовать удочку, нажмите{*CONTROLLER_ACTION_USE*}.{*FishingRodIcon*} - - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать, как ловить рыбу.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете ловить рыбу. @@ -3272,11 +1062,46 @@ Minecraft - игра, в которой можно построить из бл Удочка, как и многие другие инструменты, ломается после определенного числа применений, однако ее можно использовать не только на рыбалке. Экспериментируйте, и вы узнаете, что еще можно поймать или активировать с ее помощью... {*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*}, если вы уже знаете про схемы с красным камнем и поршнями. + + + + + Рычаги, кнопки, нажимные пластины и факелы из красного камня могут питать схемы энергией. Для этого либо прикрепите их к предмету или соедините источник энергии и предмет с помощью красной пыли. @@ -3298,250 +1123,303 @@ Minecraft - игра, в которой можно построить из бл {*ICON*}355{*/ICON*} - - - Здесь есть несколько простых схем с красным камнем и поршнями, а также сундук с предметами, которые позволят усложнить эти схемы. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о лодках.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете про лодки. - + - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о схемах с красным камнем и поршнями.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете про схемы с красным камнем и поршнями. + Колдовской стол позволяет снабдить предметы особыми свойствами. Например, увеличить число предметов, получаемых при разработке блока, или повысить сопротивляемость урону для оружия, доспехов или некоторых инструментов. - + - Рычаги, кнопки, нажимные пластины и факелы из красного камня могут питать схемы энергией. Для этого либо прикрепите их к предмету или соедините источник энергии и предмет с помощью красной пыли. + Окружив колдовской стол книжными шкафами, вы повысите его силу и получите доступ к чарам высоких уровней. - + - Эффект, который источник энергии оказывает на окружающие блоки, зависит от его положения и ориентации. Например, факел рядом с блоком, может погаснуть, если блок получает энергию из другого источника. + На зачаровывание уходят уровни опыта. Чтобы приобрести опыт, собирайте сферы опыта, выпадающие из убитых монстров и животных, добывайте руду, разводите животных, ловите рыбу и обрабатывайте предметы в печи. - + - Красную пыль можно получить, добывая красную руду с помощью железной, алмазной или золотой кирки. С помощью пыли можно передавать энергию на расстояние до 15 блоков, и она может сдвигаться на 1 блок вверх или вниз. - {*ICON*}331{*/ICON*} + Чары выбираются случайным образом, однако лучшие из них доступны только тем игрокам, у которых высокий уровень опыта и которые окружили свой колдовской стол большим количеством книжных шкафов. - + - Красные ретрансляторы можно использовать для передачи энергии на большие расстояния или для того, чтобы задержать прохождение сигнала по схеме. - {*ICON*}356{*/ICON*} + Здесь находится колдовской стол и другие предметы, которые помогут вам узнать больше о зачаровывании. - - - Поршень, соединенный с источником энергии, выдвигается, толкая до 12 блоков. Липкий поршень, втягиваясь, может тянуть за собой один блок почти любого вида. - {*ICON*}33{*/ICON*} + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зачаровывании.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как зачаровывать предметы. - + - Здесь в сундуке лежат компоненты для схем и поршней. Попробуйте воспользоваться схемами, которые находятся поблизости, расширить их или сделать собственные. За границами зоны обучения есть и другие схемы. + Кроме того, вы можете использовать бутыли зачаровывания: если их бросить, то на месте падения появятся сферы опыта, которые можно собрать. - + - Здесь находится портал в преисподнюю! + Вагонетки ездят по рельсам. Можно сделать вагонетку с печкой или вагонетку с сундуком. + {*RailIcon*} - + - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о порталах и преисподней.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о порталах и преисподней. + Кроме того, вы можете создать рельсы с источником энергии, которые ускоряют вагонетку, черпая энергию из факелов и схем из красного камня. Их можно подключать к переключателям, рычагам и нажимным пластинам, таким образом строя сложные системы. + {*PoweredRailIcon*} - + - Чтобы создать портал, необходимо построить обсидиановую раму - 4 блока в ширину и 5 в высоту. Угловые блоки не требуются. + Вы плывете на лодке. Чтобы выйти из нее, наведите на нее курсор и нажмите{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} - + - Чтобы активировать портал в преисподнюю, подожгите обсидиановые блоки, находясь внутри портала, с помощью кремня и огнива. Порталы деактивируются только в том случае, если одна из стен разрушена, если рядом произошел взрыв или если через них протекла жидкость. + Здесь в сундуках хранятся зачарованные предметы, бутыли зачаровывания и предметы, которые еще не зачарованы. Вы сможете поэкспериментировать с ними на колдовском столе. - + - Чтобы воспользоваться порталом в преисподнюю, зайдите в него. Экран окрасится в лиловый цвет, и прозвучит определенный звук. Через несколько мгновений вы окажетесь в другом измерении. - + Вы едете на вагонетке. Чтобы слезть с нее, наведите на нее курсор и нажмите{*CONTROLLER_ACTION_USE*}. {*MinecartIcon*} - - - Преисподняя - опасное место, здесь много лавы, зато здесь можно добыть адский камень, который горит вечно, если его поджечь, а также сияющий камень - источник света. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о вагонетках.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете про вагонетки. - - - Путешествия по преисподней - хороший способ быстро преодолеть расстояние в наземном мире: 1 блок в преисподней равен 3 в наземном мире. - - - - - Вы в режиме "Творчество". - - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о режиме "Творчество".{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о режиме "Творчество". - - - - В режиме "Творчество" у вас бесконечное число всех доступных предметов и блоков, вы можете уничтожать блоки одним щелчком без помощи инструментов. Кроме того, вы неуязвимы и можете летать. - - - Нажмите{*CONTROLLER_ACTION_CRAFTING*}, чтобы открыть инвентарь в режиме "Творчество". - - - Чтобы продолжить, доберитесь до противоположной стороны этой дыры. - - - Вы прошли курс обучения, посвященный режиму "Творчество". - - - - Здесь находится ферма. Фермы позволяют создавать возобновляемый источник пищи и других предметов. - - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о фермах.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы все уже знаете о фермах. - - - - Пшеницу, тыквы и дыни выращивают из семян. Чтобы добыть семена пшеницы, разбивайте блоки высокой травы или собирайте урожай пшеницы. Семена тыквы и дыни делаются из тыкв и дынь соответственно. - - - Прежде чем сажать семена, превратите блок земли в грядку, обработав его с помощью мотыги. Если рядом находятся источники воды и/или света, посевы будут расти быстрее. - - - Пшеница по мере роста проходит через несколько этапов. Когда она потемнеет, урожай можно собирать.{*ICON*}59:7{*/ICON*} - - - Рядом с тыквой или дыней должен быть еще один блок, чтобы стеблю было куда расти. - - - Сахарный тростник нужно сажать на блок травы, земли или песка, находящийся рядом с блоком воды. Срубив блок сахарного песка, вы обрушите все блоки, которые находятся над ним.{*ICON*}83{*/ICON*} - - - Кактусы нужно сажать на песке, и они вырастают на 3 блока в высоту. Срубив блок кактуса, вы обрушите все блоки, которые находятся над ним.{*ICON*}81{*/ICON*} - - - Грибы нужно сажать в местах со слабым освещением. Грибница разрастется на другие плохо освещенные блоки.{*ICON*}39{*/ICON*} - - - Костная мука заставляет урожай сразу же созреть, а грибы превращает в огромные грибы.{*ICON*}351:15{*/ICON*} - - - Вы прошли курс обучения, посвященный посадкам. - - - - Здесь находится загон с животными. Разводите животных, чтобы получить детенышей их вида. - - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о животных и их разведении.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о животных и их разведении. - - - - Чтобы животные размножались, они должны перейти в "Режим любви". Для этого их нужно кормить подходящими продуктами. - - - Кормите пшеницей коров, гриборов и овец. Морковку давайте свиньям. Кур кормите семенами пшеницы или адскими бородавками. Волков - любым видом мяса. И тогда они начнут искать другое животное своего вида, которое также находится в режиме любви. - - - Когда встречаются две особи одного вида, которые находятся в режиме любви, несколько секунд они будут целоваться, а потом появится детеныш. Некоторое время малыш будет следовать за родителями, а затем превратится во взрослую особь. - - - Побывав в режиме любви, животное не сможет войти в него повторно около 5 минут. - - - Некоторые животные будут следовать за вами, если вы держите в руке их пищу. Так вам будет проще собрать их вместе для разведения.{*ICON*}296{*/ICON*} - - - -Диких волков можно приручить, давая им кости. Над прирученным волком появляются сердечки. Такой волк будет следовать за игроком и защищать его, если только ему не была дана команда сидеть. - - - - Вы прошли курс обучения, посвященный животным и их разведению. - - - - Здесь находятся тыквы и блоки, из которых можно сделать снежного и железного голема. - - - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о големах.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о големах. - - - - Чтобы создать голема, необходимо поставить тыкву на штабель блоков. - - - Снежный голем состоит из двух блоков снега, поставленных один на другой, наверху которых стоит тыква. Снежные големы бросают снежки в ваших врагов. - - - Железные големы состоят из 4 железных блоков, составленных так, как показано на рисунке. Наверху среднего блока должна стоять тыква. Железные големы атакуют ваших врагов. - - - Железные големы также появляются сами по себе, чтобы защищать деревни. Они нападут на вас, если вы будете нападать на крестьян. - - - Вы не сможете покинуть эту зону, пока не завершите курс обучения. - - - Для каждой задачи есть свои инструменты. Копать мягкие материалы, например землю и песок, следует лопатой. - - - Для каждой задачи есть свои инструменты. Рубить деревья следует топором. - - - Для каждой задачи есть свои инструменты. Добывать камень и руду следует киркой. Для некоторых материалов необходимы более прочные кирки. - - - Некоторые инструменты предназначены для борьбы с врагами. Советуем использовать в бою меч. - - - Подсказка: зажмите{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... - - - Ваш инструмент поврежден. При каждом использовании инструмент получает повреждения и в конце концов ломается. Когда предмет находится в инвентаре, цветная полоска внизу отражает его состояние. - - - Зажмите{*CONTROLLER_ACTION_JUMP*}, чтобы плыть вверх. - - - В этой зоне находится вагонетка на рельсах. Чтобы сесть в нее, наведите курсор на вагонетку и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы привести ее в движение, используйте{*CONTROLLER_ACTION_USE*}. - - - В сундуке на берегу реки лежит лодка. Чтобы использовать ее, наведите курсор на воду и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы сесть в нее, используйте{*CONTROLLER_ACTION_USE*}, наведя курсор на лодку. - - - В сундуке на берегу пруда лежит удочка. Достаньте ее и возьмите в руки, чтобы использовать ее. - - - Этот более сложный поршневой механизм создает саморемонтирующийся мост! Нажмите кнопку, чтобы включить его, и посмотрите, как взаимодействуют его части. - Чтобы выбросить предмет, который вы держите в руке, переместите курсор за пределы экрана. + + Прочитать + + + Повесить + + + Бросить + + + Открыть + + + Изменить высоту + + + Взорвать + + + Посадить + + + Получить доступ к полной версии + + + Удалить сохранение + + + Удалить + + + Вспахать + + + Собрать урожай + + + Продолжить + + + Всплыть + + + Ударить + + + Подоить + + + Собрать + + + Вылить + + + Оседлать + + + Положить + + + Съесть + + + Ехать + + + Плыть на лодке + + + Вырастить + + + Поспать + + + Проснуться + + + Проиграть + + + Настройки + + + Переместить доспех + + + Переместить оружие + + + Взять/надеть + + + Переместить ингредиент + + + Переместить топливо + + + Переместить инструмент + + + Натянуть тетиву + + + Предыдущая страница + + + Следующая страница + + + Режим любви + + + Отпустить тетиву + + + Привилегии + + + Заблокировать + + + Творчество + + + Запретить уровень + + + Выбрать скин + + + Поджечь + + + Пригласить друзей + + + ОК + + + Подстричь + + + Навигация + + + Переустановить + + + Опции + + + Выполнить команду + + + Установить полную версию + + + Установить пробную версию + + + Установить + + + Выбросить + + + Обновить список сетевых игр + + + Игры-вечеринки + + + Все игры + + + Выход + + + Отмена + + + Не присоединяться + + + Изменить группу + + + Создание предметов + + + Создать + + + Взять/положить + + + Открыть инвентарь + + + Показать описание + + + Показать ингредиенты + + + Назад + + + Напоминание: + + + + + + В последней версии игры появились новые возможности, в том числе новые зоны в мире обучения. + Для создания этого предмета у вас не хватает ингредиентов. Все необходимые ингредиенты перечислены в окне слева. @@ -3554,29 +1432,9 @@ Minecraft - игра, в которой можно построить из бл {*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*}, чтобы пропустить основной курс обучения. - - - В этой зоне вы сможете узнать о том, как ловить рыбу, плавать на лодках, использовать поршни и красный камень. - - - За пределами этой зоны вы познакомитесь со зданиями, научитесь основам сельского хозяйства, узнаете, как ездить на вагонетках, зачаровывать предметы, варить зелья, торговать, ковать предметы и многое другое! - - - - Шкала пищи находится на таком уровне, что вы уже не сможете улучшить здоровье. - @@ -3591,102 +1449,20 @@ Minecraft - игра, в которой можно построить из бл Использовать - - Назад + + В этой зоне вы сможете узнать о том, как ловить рыбу, плавать на лодках, использовать поршни и красный камень. - - Выход + + За пределами этой зоны вы познакомитесь со зданиями, научитесь основам сельского хозяйства, узнаете, как ездить на вагонетках, зачаровывать предметы, варить зелья, торговать, ковать предметы и многое другое! - - Отмена - - - Не присоединяться - - - Обновить список сетевых игр - - - Игры-вечеринки - - - Все игры - - - Изменить группу - - - Открыть инвентарь - - - Показать описание - - - Показать ингредиенты - - - Создание предметов - - - Создать - - - Взять/положить + + + Шкала пищи находится на таком уровне, что вы уже не сможете улучшить здоровье. + Взять - - Взять все - - - Взять половину - - - Положить - - - Положить все - - - Положить 1 - - - Выбросить - - - Выбросить все - - - Выбросить 1 - - - Поменять - - - Быстрое перемещение - - - Очистить ячейку быстрого выбора - - - Что это? - - - Поделиться в Facebook - - - Изменить фильтр - - - Предложить дружбу - - - Следующая страница - - - Предыдущая страница - Вперед @@ -3696,18 +1472,18 @@ Minecraft - игра, в которой можно построить из бл Исключить игрока + + Предложить дружбу + + + Следующая страница + + + Предыдущая страница + Покрасить - - Добыть - - - Кормить - - - Приручить - Вылечить @@ -3717,1068 +1493,866 @@ Minecraft - игра, в которой можно построить из бл Следуй за мной - + + Добыть + + + Кормить + + + Приручить + + + Изменить фильтр + + + Положить все + + + Положить 1 + + Выбросить - - Вылить + + Взять все - - Оседлать + + Взять половину - + Положить - - Ударить + + Выбросить все - - Подоить + + Очистить ячейку быстрого выбора - - Собрать + + Что это? - - Съесть + + Поделиться в Facebook - - Поспать + + Выбросить 1 - - Проснуться + + Поменять - - Проиграть - - - Ехать - - - Плыть на лодке - - - Вырастить - - - Всплыть - - - Открыть - - - Изменить высоту - - - Взорвать - - - Прочитать - - - Повесить - - - Бросить - - - Посадить - - - Вспахать - - - Собрать урожай - - - Продолжить - - - Получить доступ к полной версии - - - Удалить сохранение - - - Удалить - - - Настройки - - - Пригласить друзей - - - ОК - - - Подстричь - - - Запретить уровень - - - Выбрать скин - - - Поджечь - - - Навигация - - - Установить полную версию - - - Установить пробную версию - - - Установить - - - Переустановить - - - Опции - - - Выполнить команду - - - Творчество - - - Переместить ингредиент - - - Переместить топливо - - - Переместить инструмент - - - Переместить доспех - - - Переместить оружие - - - Взять/надеть - - - Натянуть тетиву - - - Отпустить тетиву - - - Привилегии - - - Заблокировать - - - Предыдущая страница - - - Следующая страница - - - Режим любви - - - Выпить - - - Повернуть - - - Скрыть - - - Очистить все ячейки - - - ОК - - - Отмена - - - Магазин Minecraft - - - Выйти из текущей игры и присоединиться к новой? Все несохраненные данные будут утеряны. - - - Выйти из игры - - - Сохранить игру - - - Выйти без сохранения - - - Переписать все прежние сохранения данной версией? - - - Выйти без сохранения? Все, чего вы добились в этом мире, будет утеряно! - - - Начать игру - - - Поврежденное сохранение - - - Файл поврежден. Удалить? - - - Выйти в главное меню и отключить от игры всех пользователей? Все несохраненные данные будут потеряны. - - - Выйти и сохранить - - - Выйти без сохранения - - - Выйти в главное меню? Все несохраненные данные будут потеряны. - - - Выйти в главное меню? Несохраненные данные будут потеряны! - - - Создать новый мир - - - Пройти обучение - - - Обучение - - - Назвать новый мир - - - Введите имя мира - - - Введите число-затравку для создания мира - - - Загрузить мир - - - START - присоединиться - - - Выход из игры - - - Произошла ошибка. Сейчас вы вернетесь в главное меню. - - - Не удалось установить соединение - - - Соединение разорвано - - - Утрачено соединение с сервером. Сейчас вы вернетесь в главное меню. - - - Сервер разорвал соединение - - - Вас исключили из игры - - - Вас исключили из игры за полеты - - - Попытка подключения длилась слишком долго - - - Сервер переполнен - - - Хост вышел из игры. - - - Вы не можете присоединиться к этой игре, так как в ней не участвуют ваши друзья. - - - Вы не можете присоединиться к этой игре, так как вас исключил хост. - - - Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более старую версию игры. - - - Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более новую версию игры. - - - Новый мир - - - Доступна награда! - - - Ура! Вы получили в награду картинку с изображением Стива из Minecraft! - - - Ура! Вы получили в награду картинку с изображением крипера! - - - Получить доступ к полной версии - - - Вы играете в пробную версию, но сохранить игру можно только в полной версии. -Получить доступ к полной версии игры? - - - Пожалуйста, подождите... - - - Нет результатов - - - Фильтр: - - - Друзья - - - Мой счет - - - Всего - - - Записи: - - - Ранг - - - Подготовка к сохранению уровня - - - Подготовка фрагментов... - - - Завершение... - - - Создание поверхности - - - Короткая симуляция мира - - - Инициализация сервера - - - Создание зоны возрождения - - - Загрузка зоны возрождения - - - Вход в преисподнюю - - - Выход из преисподней - - - Возрождение - - - Создание уровня - - - Загрузка уровня - - - Сохранение игроков - - - Подключение к хосту - - - Загрузка поверхности - - - Переключение на игру вне сети - - - Подождите, пока хост сохраняет игру - - - Вход на Край - - - Выход с Края - - - Кровать занята - - - Спать можно только ночью - - - %s спит на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. - - - В вашем доме не было кровати, или путь к ней был заблокирован - - - Вы не можете отдыхать, рядом монстры - - - Вы спите на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. - - - Инструменты и оружие - - - Оружие - - - Пища - - - Здания - - - Доспехи - - - Механизмы - - - Транспорт - - - Украшения - - - Строительные блоки - - - Красный камень и транспорт - - - Другое - - - Создание зелья - - - Инструменты, оружие и доспехи - - - Материалы - - - Пользователь вышел из игры - - - Уровень сложности - - - Музыка - - - Звук - - - Гамма - - - В игре - - - В интерфейсе - - - Мирный - - - Легкий - - - Обычный - - - Высокий - - - В этом режиме здоровье игрока постепенно восстанавливается, а врагов в мире нет. - - - В этом режиме в мире появляются враги, но они наносят игроку меньше урона, чем на обычном уровне сложности. - - - В этом режиме в мире появляются враги, наносящие игрокам стандартные повреждения. - - - В этом режиме в мире появляются враги, наносящие игрокам серьезные повреждения. Остерегайтесь криперов: они могут начать атаку-взрыв, даже если вы отойдете от них! - - - Тайм-аут пробной версии - - - Игра переполнена - - - Не удалось присоединиться к игре, так как в ней нет свободных мест - - - Текст на табличке - - - Введите текст вашей таблички - - - Заголовок - - - Введите заголовок вашего сообщения - - - Подпись - - - Введите подпись вашего сообщения - - - Описание - - - Введите описание вашего сообщение - - - Инвентарь - - - Ингредиенты - - - Варочная стойка - - - Сундук - - - Зачаровать - - - Печь - - - Ингредиент - - - Топливо - - - Распределитель - - - Для этой игры сейчас нет загружаемого контента данного типа. - - - %s присоединяется к игре. - - - %s покидает игру. - - - %s исключается из игры. - - - Удалить эту сохраненную игру? - - - Ожидает проверки - - - Отклонено - - - Играет: - - - Сбросить настройки - - - Вернуть настройки к значениям по умолчанию? - - - Ошибка при загрузке - - - Игра пользователя %s - - - Игра неизвестного хоста - - - Гость вышел - - - Игрок-гость вышел из игры, в результате чего все игроки-гости удалены из игры. - - - Войти - - - В эту игру невозможно играть, не войдя в систему. Войти? - - - Сетевая игра не разрешена - - - Не удалось создать игру - - - Автовыбор - - - Стандартные скины - - - Любимые скины - - - Запрещенный уровень - - - Игра, к которой вы присоединяетесь, находится в вашем списке запрещенных уровней. Если вы к ней присоединитесь, она будет удалена из списка запрещенных. - - - Запретить этот уровень? - - - Добавить этот уровень к списку запрещенных? -Выбрав "ОК", вы, кроме того, выйдете из игры. - - - Удалить из черного списка - - - Сохранять каждые - - - Автосохранение: выкл. - - - мин. - - - Здесь нельзя! - - - Размещать лаву рядом с точкой возрождения не разрешается, так как в этом случае высока вероятность мгновенной гибели возрождающихся игроков. - - - Прозрач. интерфейса - - - Подготовка к автосохранению уровня - - - Размер интерфейса - - - Размер и-фейса (разд. экран) - - - Число-затравка - - - Получить доступ к набору скинов - - - Прежде чем использовать этот набор скинов, необходимо получить к нему доступ. -Получить к нему доступ сейчас? - - - Получить доступ к набору текстур - - - Прежде чем использовать этот набор текстур, необходимо получить к нему доступ. -Получить к нему доступ сейчас? - - - Набор текстур пробной версии - - - Вы используете набор текстур пробной версии. Вы не сможете сохранить этот мир, пока не получите доступ к полной версии. -Получить доступ к полной версии набора текстур? - - - Нет набора текстур - - - Получить доступ к полной версии - - - Загрузить пробную версию - - - Загрузить полную версию - - - В этом мире использован смешанный набор или набор текстур, которого у вас нет! -Установить смешанный набор или набор текстур? - - - Получить пробную версию - - - Получить полную версию - - - Исключить игрока - - - Исключить игрока из игры? Он не сможет присоединиться до тех пор, пока вы не перегрузите мир заново. - - - Наборы картинок игрока - - - Темы - - - Наборы скинов - - - Пускать друзей друзей - - - Вы не можете присоединиться к игре, так как в ней могут участвовать только друзья хоста. - - - Невозможно присоединиться к игре - - - Выбрано - - - Выбранный скин: - - - Загружаемый контент поврежден - - - Этот загружаемый контент поврежден, использовать его невозможно. Удалите его и заново установите из меню магазина Minecraft. - - - Часть загружаемого контента повреждена и не может быть использована. Удалите этот загружаемый контент, а затем заново установите из меню магазина Minecraft. - - - Режим игры изменен - - - Изменить название мира - - - Введите новое название мира - - - Режим игры: Выживание - - - Режим игры: Творчество - - - Выживание - - - Творчество - - - Создано в режиме "Выживание" - - - Создано в режиме "Творчество" - - - Отображать облака - - - Что вы хотите сделать с этим сохранением? - - - Переименовать файл - - - Автосохранение через %d... - - - Вкл. - - - Выкл. - - - Нормальный - - - Суперплоский - - - Выберите, чтобы игра была сетевой. - - - Выберите, чтобы к игре могли присоединиться только приглашенные. - - - Выберите, чтобы к игре могли присоединиться друзья ваших друзей. - - - Выберите, чтобы игроки могли причинять урон друг другу. Действует только в режиме "Выживание". - - - Отключите, и игроки не смогут строить или добывать руду без разрешения. - - - Выберите, чтобы огонь распространялся на соседние горючие блоки. - - - Выберите, чтобы после активации тротил взрывался. - - - Выберите, чтобы создать преисподнюю заново. Это полезно, если у вас старое сохранение, в котором нет адских крепостей. - - - Выберите, чтобы в мире появились такие структуры, как деревни и крепости. - - - Выберите, чтобы и верхний мир, и преисподняя были совершенно плоскими. - - - Выберите, чтобы рядом с точкой спауна игроков появился сундук с полезными предметами. + + Быстрое перемещение Наборы скинов - - Темы + + Красная окрашенная стеклянная панель - - Картинки игрока + + Зеленая окрашенная стеклянная панель - - Предметы аватара + + Коричневая окрашенная стеклянная панель - - Наборы текстур + + Белое окрашенное стекло - - Смешанные наборы + + Окрашенная стеклянная панель - - Игрок {*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 покидает Край + + Золотая броня для лошади - + + Алмазная броня для лошади + + + Компаратор + + + Вагонетка с тротилом + + + Вагонетка с воронкой + + + Вести + + + Маяк + + + Сундук с ловушкой + + + Утяжеленная нажимная пластина (легкая) + + + Бирка + + + Доски (любого типа) + + + Командный блок + + + Звездочка + + + Этих животных можно приручить. Кроме того, можно ездить на них верхом и прикрепить к ним сундук. + + + Мул + + + Рождается при скрещивании лошади и осла. Можно приручить, ездить верхом и прикрепить сундук. + + + Лошадь + + + Этих животных можно приручить. На них также можно ездить верхом. + + + Осел + + + Лошадь-зомби + + + Пустая карта + + + Звезда Нижнего мира + + + Ракета + + + Лошадь-скелет + + + Иссушение + + + Создается из черепа осушителя и песка души. Кидает в вас взрывающиеся черепа. + + + Утяжеленная нажимная пластина (тяжелая) + + + Светло-серая окрашенная глина + + + Серая окрашенная глина + + + Розовая окрашенная глина + + + Синяя окрашенная глина + + + Лиловая окрашенная глина + + + Бирюзовая окрашенная глина + + + Светло-зеленая окрашенная глина + + + Оранжевая окрашенная глина + + + Белая окрашенная глина + + + Окрашенное стекло + + + Желтая окрашенная глина + + + Светло-синяя окрашенная глина + + + Пурпурная окрашенная глина + + + Коричневая окрашенная глина + + + Загрузочная воронка + + + Активирующие рельсы + + + Выбрасыватель + + + Компаратор + + + Датчик дневного света + + + Блок красного камня + + + Окрашенная глина + + + Черная окрашенная глина + + + Красная окрашенная глина + + + Зеленая окрашенная глина + + + Сноп сена + + + Обожженная глина + + + Блок угля + + + Угасание: + + + При отключении не дает монстрам и животным изменять блоки (например, взрыв крипера не уничтожит блоки, а овцы не съедят траву) и поднимать предметы. + + + Если включено, игроки будут сохранять свои пожитки после смерти. + + + При отключении монстры не будут возрождаться естественным образом. + + + Режим игры: Приключение + + + Приключение + + + Введите число-семя для воссоздания мира. Оставьте поле пустым, если хотите создать случайный мир. + + + Если отключено, из монстров и животных не будет ничего выпадать после смерти (например, из криперов не будет выпадать порох). + + + {*PLAYER*} падает с лестницы + + + {*PLAYER*} падает с каких-то ветвей + + + {*PLAYER*} выпадает из воды + + + Если отключено, из блоков не будут выпадать предметы (например, из каменных блоков не будет выпадать булыжник). + + + Если отключено, у игрока не будет восстанавливаться здоровье естественным образом. + + + Если отключено, время суток не будет меняться. + + + Вагонетка + + + Поводок + + + Отпустить + + + Прикрепить + + + Слезть + + + Прикрепить сундук + + + Запустить + + + Имя + + + Маяк + + + Основной эффект + + + Побочный эффект + + + Лошадь + + + Выбрасыватель + + + Загрузочная воронка + + + {*PLAYER*} падает откуда-то сверху + + + Невозможно использовать яйцо возрождения, т.к. в мире уже находится максимальное количество летучих мышей. + + + Животные не могут перейти в режим любви. Достигнуто максимальное количество разводимых лошадей. + + + Настройки + + + {*PLAYER*} попадает по огненный шар, который выпустил {*SOURCE*} с помощью {*ITEM*} + + + {*PLAYER*} был избит {*SOURCE*}, который пользовался предметом {*ITEM*} + + + {*PLAYER*} был убит {*SOURCE*}, который пользовался предметом {*ITEM*} + + + Повреждение мира + + + Предметы из блоков + + + Естественное восстановление + + + Цикл дня и ночи + + + Сохранять инвентарь + + + Возрождение монстров + + + Добыча из монстров + + + {*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*} + + + Оседлать + + -{*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*} +Чтобы управлять лошадью, на нее нужно сначала надеть седло. +Его можно купить у крестьян, выловить при рыбалке или найти в спрятанных сундуках. + + +На прирученных ослов и мулов можно повесить седельные сумки, прикрепив сундук. Чтобы открыть седельную сумку, оседлайте животное или подкрадитесь к нему. + + + + +Лошадей и ослов (но не мулов) можно разводить, используя золотые яблоки и золотые морковки. Жеребята со временем вырастают во взрослых лошадей. Этот процесс можно ускорить, подкармливая их пшеницей или сеном. + + + + +Лошадей, ослов и мулов нужно сначала приручить. Чтобы приручить лошадь, оседлайте ее и не дайте ей себя сбросить. + + + + +Когда лошадь будет приручена, вокруг нее появятся сердца. Она больше не будет пытаться сбросить седока. + + + + +Попробуйте прокатиться на этой лошади. Используйте {*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*} @@ -4829,9 +2403,63 @@ Minecraft - игра, в которой можно построить из бл Перегрузить преисподнюю + + %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*} + + Вернуть преисподнюю в этом сохранении к исходному состоянию? Вы потеряете все, что в ней построили! + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число свиней, овец, коров, кошек и лошадей. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число гриборов. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число волков. + Перегрузить преисподнюю @@ -4839,113 +2467,11 @@ Minecraft - игра, в которой можно построить из бл Не перегружать преисподнюю - Сейчас нельзя подстричь эту гриборову. Достигнуто максимальное число свиней, овец, гриборов и кошек. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число свиней, овец, коров и кошек. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число гриборов. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число волков. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число кур. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число кальмаров. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число врагов. - - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число крестьян. - - - Достигнуто максимальное число картин/рамок. - - - Вы не можете создавать врагов в мирном режиме. - - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся свиней, овец, коров и кошек. - - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся волков. - - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся кур. - - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся гриборов. - - - Достигнуто максимальное число лодок. - - - Достигнуто максимальное число голов мобов. - - - Инверт. обзор - - - Левша + Сейчас нельзя подстричь эту гриборову. Достигнуто максимальное число свиней, овец, гриборов, кошек и лошадей. Вы умерли! - - Возродиться! - - - Загружаемый контент - предложения - - - Изменить скин - - - Обучение - - - Управление - - - Настройки - - - Авторы - - - Переустановить контент - - - Настройки поиска неисправностей - - - Огонь распространяется - - - Тротил взрывается - - - Дуэль - - - Доверять игрокам - - - Привилегии хоста - - - Создавать структуры - - - Суперплоский мир - - - Дополнительный сундук - Настройки мира @@ -4955,18 +2481,18 @@ Minecraft - игра, в которой можно построить из бл Можно ис-ть двери и переключатели + + Создавать структуры + + + Суперплоский мир + + + Дополнительный сундук + Можно открывать контейнеры - - Можно атаковать игроков - - - Можно атаковать животных - - - Модератор - Исключить игрока @@ -4976,185 +2502,307 @@ Minecraft - игра, в которой можно построить из бл Отключить утомление + + Можно атаковать игроков + + + Можно атаковать животных + + + Модератор + + + Привилегии хоста + + + Обучение + + + Управление + + + Настройки + + + Возродиться! + + + Загружаемый контент - предложения + + + Изменить скин + + + Авторы + + + Тротил взрывается + + + Дуэль + + + Доверять игрокам + + + Переустановить контент + + + Настройки поиска неисправностей + + + Огонь распространяется + + + Дракон Края + + + Игрок {*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 - - - Переустановить предмет аватара 1 - - - Переустановить предмет аватара 2 - - - Переустановить предмет аватара 3 - - - Настройки - - - Звук - - - Чувств. управления - - - Графика - - - Интерфейс - - - Вернуть исходные настройки - - - "Дрожащая" камера - - - Подсказки - - - Всплывающие описания - - - Вертикал. разделенный экран - - - Готово - - - Изменить текст таблички: - - - Напишите текст, который будет сопровождать ваш скриншот - - - Подпись - - - Скриншот из игры - - - Изменить текст таблички: - - - Классические текстуры, значки и интерфейс Minecraft! - - - Показать все смешанные миры - - - Без эффектов - - - Скорость - - - Медлительность - - - Ускорение - - - Усталость при добыче руды - - - Сила - - - Слабость + + НЕ ИСПОЛЬЗУЕТСЯ Мгновенное здоровье @@ -5165,62 +2813,3324 @@ Minecraft - игра, в которой можно построить из бл Мощные прыжки + + Усталость при добыче руды + + + Сила + + + Слабость + Тошнота + + НЕ ИСПОЛЬЗУЕТСЯ + + + НЕ ИСПОЛЬЗУЕТСЯ + + + НЕ ИСПОЛЬЗУЕТСЯ + Регенерация Сопротивление - - Устойчивость к огню + + Поиск начального значения для генератора мира - - Дыхание под водой + + Создает цветные взрывы при активации. Цвет, эффект, форма и затухание определяются звездочкой, использованной для создания фейерверка. - - Невидимость + + Тип рельсов, которые могут включать или выключать вагонетки с воронками, а также активировать вагонетки с тротилом. - - Слепота + + Может содержать и ронять предметы или выталкивать их в другие контейнеры при наличии красного заряда. - - Ночное зрение + + Разноцветные блоки. Получаются окрашиванием обожженной глины. - - Голод + + Производит красный заряд. Чем больше предметов лежит на плите, тем сильнее заряд. Ее необходимо нагружать сильнее, чем легкую пластину. + + + Используется как источник красной энергии. Из него можно обратно получить красный камень. + + + Используется для ловли предметов или переноса их в контейнер и наружу. + + + Можно скармливать лошадям, ослам и мулам. Восстанавливает до 10 сердец. Ускоряет рост жеребят. + + + Летучая мышь + + + Эти летающие создания водятся в пещерах или других больших закрытых пространствах. + + + Ведьма + + + Создается путем обжигания глины в печи. + + + Создается из стекла и краски. + + + Создается из окрашенного стекла + + + Производит красный заряд. Чем больше предметов лежит на плите, тем сильнее заряд. + + + Этот блок испускает красный сигнал в зависимости от наличия или отсутствия освещения. + + + Специальный тип вагонетки, работающий подобно воронке. Собирает предметы, лежащие на рельсах или в контейнерах над ними. + + + Специальная броня, которую можно надеть на лошадь. Увеличивает уровень доспехов на 5. + + + Задает цвет, эффект и форму фейерверка. + + + Используется в красных сетях для поддержания, сравнения или вычитания силы сигнала. Также может измерять некоторые состояния блоков. + + + Тип вагонетки, который действует как двигающийся блок тротила. + + + Специальная броня, которую можно надеть на лошадь. Увеличивает уровень доспехов на 7. + + + Используется для выполнения команд. + + + Испускает в небо луч света, может накладывать эффекты статуса на ближайших игроков. + + + В нем можно хранить блоки и предметы. Чтобы создать сундук вдвое большего объема, поставьте два сундука рядом. Сундук с ловушкой создает красный разряд при открытии. + + + Специальная броня, которую можно надеть на лошадь. Увеличивает уровень доспехов на 11. + + + Используется для того, чтобы привязывать монстров к игроку или забору. + + + Используется для того, чтобы давать монстрам имена. + + + Ускорение + + + Полная версия + + + Продолжить игру + + + Сохранить игру + + + Играть + + + Списки лидеров + + + Помощь и настройки + + + Уровень сложности: + + + Дуэль: + + + Доверять игрокам: + + + Тротил: + + + Тип игры: + + + Структуры: + + + Тип уровня: + + + Игры не найдены + + + Только по приглашениям + + + Другие настройки + + + Загрузить + + + Настройки хоста + + + Игроки/пригласить + + + Сетевая игра + + + Новый мир + + + Игроки + + + Присоединиться к игре + + + Начать игру + + + Название мира + + + Число-затравка для создания мира + + + Пустое поле создаст случайное число + + + Огонь распространяется: + + + Изменить текст таблички: + + + Напишите текст, который будет сопровождать ваш скриншот + + + Подпись + + + Всплывающие описания + + + Вертикал. разделенный экран + + + Готово + + + Скриншот из игры + + + Без эффектов + + + Скорость + + + Медлительность + + + Изменить текст таблички: + + + Классические текстуры, значки и интерфейс Minecraft! + + + Показать все смешанные миры + + + Подсказки + + + Переустановить предмет аватара 1 + + + Переустановить предмет аватара 2 + + + Переустановить предмет аватара 3 + + + Переустановить тему + + + Переустановить картинку игрока 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 есть вики? + + + Не смотрите на жуков в упор. + + + Криперы появились из-за ошибки в коде. + + + Это курица или утка? + + + Новый офис 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*} +На экране приведена информация о вашем состоянии - уровне здоровья, количестве кислорода, если вы под водой, голоде (чтобы с ним бороться, нужно есть), а также об уровне доспехов, если они на вас надеты.{*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() была отличной! + + + Не стоит верить слухам - проще считать, что все они не соответствуют истине. + + + Предыдущая страница + + + Торговля + + + Наковальня + + + Край + + + Запрещенные уровни + + + Режим "Творчество" + + + Настройки хоста и игроков + + + {*T3*}ОБУЧЕНИЕ: КРАЙ{*ETW*}{*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*} + + + + Наносит больше урона, чем кулак. + + + С ней копать землю, траву, песок, гравий и снег быстрее, чем рукой. Снежки можно откапывать только лопатой. + + + Бег + + + Что нового + + + {*T3*}Список изменений{*ETW*}{*B*}{*B*} +- Добавлены новые предметы: обожженная глина, окрашенная глина, блок угля, сноп сена, активирующие рельсы, блок красного камня, датчик дневного света, выбрасыватель, воронка, вагонетка с воронкой, вагонетка с тротилом, компаратор, утяжеленная нажимная пластина, маяк, сундук с ловушкой, ракета, звездочка, звезда нижнего мира, поводок, броня для лошади, бирка, яйцо возрождения лошади.{*B*} +- Добавлены новые мобы: иссушитель, скелеты-иссушители, ведьмы, летучие мыши, лошади, ослы и мулы.{*B*} +- Добавлены новые варианты генерации поверхности: хижины ведьм.{*B*} +- Добавлен экран маяка.{*B*} +- Добавлен экран лошади.{*B*} +- Добавлен экран воронки.{*B*} +- Добавлены фейерверки. Их можно получить с помощью верстака, если у вас есть ингредиенты для создания звездочки и ракеты.{*B*} +- Добавлен ''Режим приключений'' - в нем вы можете ломать блоки, только если используете правильный инструмент.{*B*} +- Добавлено много новых звуков.{*B*} +- Мобы, предметы и снаряды теперь могут проходить через порталы.{*B*} +- Повторители теперь можно блокировать, размещая рядом с ними другие активированные повторители.{*B*} +- Зомби и скелеты теперь могут возрождаться с различным оружием и броней. {*B*} +- Новые сообщения о смерти.{*B*} +- Теперь вы можете давать мобам имена с помощью бирок и менять названия контейнеров, когда открыто их меню.{*B*} +- Теперь костная мука заставляет растения вырастать не полностью, а на случайное количество стадий.{*B*} +- Красный сигнал, описывающий содержимое сундуков, варочных стоек, раздатчиков и музыкальных автоматов, теперь можно засечь, размещая рядом с ними компараторы.{*B*} +- Теперь раздатчики можно направить в любую сторону.{*B*} +- Теперь, съев золотое яблоко, игрок ненадолго получает дополнительное здоровье от эффекта ''Поглощение''. {*B*} +- Чем дольше вы находитесь в какой-либо зоне, тем сильнее там будут становиться монстры.{*B*} + + + Поделиться скриншотом + + + Сундуки + + + Создание предметов + + + Печь + + + Основы управления + + + Интерфейс + + + Инвентарь + + + Раздатчик + + + Зачаровывание предметов + + + Портал в преисподнюю + + + Сетевая игра + + + Содержание животных + + + Разведение животных + + + Создание зелий + + + deadmau5 любит Minecraft! + + + Свинолюди не нападают первыми. + + + Спите в кровати, чтобы изменить точку спауна и быстрее перейти от ночи к утру. + + + Бросайте огненные шары обратно в вурдалака! + + + Чтобы осветить участок земли, используйте факелы. Монстры избегают подходить к ним. + + + Ездить на вагонетке по рельсам быстрее, чем ходить пешком! + + + Сажайте ростки, и они вырастут в деревья. + + + Построив портал, вы сможете попасть в другое измерение - преисподнюю. + + + Копать вертикально вниз или вверх - не лучшая мысль. + + + Костная мука (ее можно сделать из кости скелета) - это удобрение, которое заставляет растения вырасти мгновенно! + + + Подойдя к вам поближе, криперы взрываются! + + + Чтобы бросить предмет, который вы держите в руке, нажмите{*CONTROLLER_VK_B*}. + + + Подбирайте правильные инструменты для каждой задачи! + + + Если не удается найти уголь для факелов, вы можете его сделать, сжигая деревья в печи. + + + Приготовленная свиная отбивная сильнее повышает уровень здоровья, чем сырая. + + + В "Мирном" режиме игры здоровье персонажа будет восстанавливаться автоматически, а монстры не будут приходить по ночам! + + + Дайте волку кость, чтобы приручить его. Затем вы можете приказать ему сидеть или следовать за вами. + + + Чтобы выбросить предмет, находясь в инвентаре, переместите курсор за пределы инвентаря и нажмите{*CONTROLLER_VK_A*} + + + Появился новый загружаемый контент! Чтобы получить к нему доступ, нажмите кнопку "Магазин Minecraft" в главном меню. + + + Вы можете изменить облик своего персонажа, купив набор скинов в магазине Minecraft. Выберите "Магазин Minecraft" в главном меню, чтобы увидеть доступные наборы. + + + Изменить настройки гаммы, чтобы игра стала светлее или темнее. + + + Если заснуть в кровати, ночь сменится утром. В сетевой игре для этого все игроки должны быть в кроватях одновременно. + + + С помощью мотыги можно подготовить землю к посеву. + + + Днем пауки не нападут на вас, если вы их не атакуете. + + + Копать землю или песок лопатой быстрее, чем голыми руками! + + + Добывайте свиные отбивные, убивая свиней. Чтобы восстановить здоровье, приготовьте и съешьте отбивную. + + + Добывайте кожу, убивая коров, и делайте из нее доспехи. + + + Пустое ведро можно наполнить коровьим молоком, водой или лавой! + + + Обсидиан возникает там, где вода сталкивается с блоком-источником лавы. + + + В игре появились ограды, которые можно ставить друг на друга! + + + Некоторые животные будут следовать за вами, если вы держите пшеницу. + + + Если животное не может пройти больше 20 блоков в одном направлении, оно не исчезнет. + + + Положение хвоста ручного волка символизирует уровень его здоровья. Чтобы вылечить волка, кормите его мясом. + + + Чтобы получить зеленую краску, приготовьте кактус в печи. + + + Прочтите раздел "Что нового" в обучающих меню, чтобы узнать о последних изменениях в игре. + + + Композитор - C418! + + + Кто такой Notch? + + + У Mojang больше наград, чем сотрудников! + + + В Minecraft играют знаменитости! + + + У Notch более миллиона последователей в Твиттере! + + + Не у всех шведов светлые волосы. Среди них есть и рыжие, например Йенс из Mojang! + + + Когда-нибудь у этой игры появится обновление! + + + Поставив два сундука рядом, вы получите один большой. + + + Будьте осторожны, возводя здания из шерсти на открытом месте: во время грозы их могут поджечь молнии. + + + С помощью одного ведра лавы в печи можно расплавить 100 блоков. + + + Инструмент, звучание которого воспроизводит нотный блок, зависит от материала под ним. + + + Если убрать блок-источник лавы, то ПОЛНОСТЬЮ лава исчезнет только через несколько минут. + + + Булыжники устойчивы к огненным шарам вурдалаков, поэтому они пригодятся при строительстве сторожевых порталов. + + + Блоки, которые можно использовать в качестве источника света, растапливают снег и лед. К ним относятся факелы, сияющие камни и фонари из тыквы. + + + Зомби и скелеты могут выжить при дневном свете, если находятся в воде. + + + Куры откладывают яйца с интервалом 5-10 минут. + + + Обсидиан можно добыть только с помощью алмазной кирки. + + + Легче всего добывать порох из криперов. + + + Если вы атакуете волка, на вас нападут все волки, находящиеся поблизости. Так же ведут себя и зомби-свинолюди. + + + Волки не могут входить в преисподнюю. + + + Волки не нападают на криперов. + + + Необходима для добычи каменных блоков и руды. + + + Используется для приготовления торта или в качестве ингредиента для зелий. + + + При включении/выключении выпускает электрический разряд. Остается во включенном или выключенном положении, пока на него не нажать. + + + Постоянно выпускает электрические разряды. Соединив с блоком, можно использовать в качестве приемника/передатчика. Также является слабым источником света. + + + Восстанавливает 2{*ICON_SHANK_01*}. Можно превратить в золотое яблоко. + + + Восстанавливает 2{*ICON_SHANK_01*} и дает регенерацию здоровья на 4 секунды. Создается из яблока и золотых самородков. + + + Восстанавливает 2{*ICON_SHANK_01*}. Этой едой можно отравиться. + + + Используется в красных сетях в качестве ретранслятора, элемента задержки и/или диода. + + + По ним ездят вагонетки. + + + Под напряжением ускоряют вагонетки, которые по ним едут. При отключении напряжения останавливают вагонетки. + + + Работают как нажимная пластина (под напряжением посылают красный сигнал), но их могут активировать только вагонетки. + + + При нажатии выпускает электрический разряд. Выключается примерно через секунду после активации. + + + Хранит и случайным образом выдает предметы, если поместить в него заряд красного камня. + + + При активации проигрывает ноту. Чтобы изменить ее высоту, ударьте по блоку. Ставьте его на разные другие блоки, чтобы изменять тип музыкального инструмента. + + + Восстанавливает 2,5{*ICON_SHANK_01*}. Готовится из сырой рыбы в печи. + + + Восстанавливает 1{*ICON_SHANK_01*}. + + + Восстанавливает 1{*ICON_SHANK_01*}. + + + Восстанавливает 3{*ICON_SHANK_01*}. + + + Это боеприпасы для лука. + + + Восстанавливает 2,5{*ICON_SHANK_01*}. + + + Восстанавливает 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*}. Готовится из сырой говядины в печи. + + + Может перевозить вас, животное или монстра по рельсам. + + + Краска для производства голубой шерсти. + + + Краска для производства бирюзовой шерсти. + + + Краска для производства лиловой шерсти. + + + Краска для производства светло-зеленой шерсти. + + + Краска для производства серой шерсти. + + + Краска для производства светло-серой шерсти. (Примечание: светло-серую краску также можно сделать, перемешав серую краску с костной мукой.) + + + Краска для производства пурпурной шерсти. + + + Дает более яркий свет, чем факелы. Может плавить снег и лед и использоваться под водой. + + + Из нее можно делать книги и карты. + + + Из них можно делать книжные полки; на них также можно накладывать чары, чтобы получить зачарованные книги. + + + Краска для производства синей шерсти. + + + Воспроизводит музыкальные диски. + + + Позволяют создавать очень прочные инструменты, доспехи и оружие. + + + Краска для производства оранжевой шерсти. + + + Ее можно состричь с овец и покрасить. + + + Используется в качестве строительного материала, можно покрасить. Этот рецепт не рекомендуется - шерсть легко состричь с овец. + + + Краска для производства черной шерсти. + + + Может перевозить товары по рельсам. + + + Движется по рельсам. Если в нее положить уголь, сможет толкать другие вагонетки. + + + Позволяет передвигаться по воде быстрее, чем вплавь. + + + Краска для производства зеленой шерсти. + + + Краска для производства красной шерсти. + + + Позволяет мгновенно вырастить урожай, деревья, высокую траву, огромные грибы и цветы. Может использоваться при создании красок. + + + Краска для производства розовой шерсти. + + + Используется для производства коричневой шерсти, в качестве ингредиента для печенья или для выращивания плодов какао. + + + Краска для производства серебряной шерсти. + + + Краска для производства желтой шерсти. + + + Позволяет выпускать во врагов стрелы. + + + Увеличивает уровень доспехов на 5. + + + Увеличивает уровень доспехов на 3. + + + Увеличивает уровень доспехов на 1. + + + Увеличивает уровень доспехов на 5. + + + Увеличивает уровень доспехов на 2. + + + Увеличивает уровень доспехов на 2. + + + Увеличивает уровень доспехов на 3. + + + Блестящий слиток, из которого можно делать инструменты. Чтобы получить его, расплавьте в печи кусок руды. + + + Позволяет делать из слитков, самоцветов и красок размещаемые блоки. Можно использовать как дорогостоящий строительный материал или компактный вариант хранения руды. + + + Выпускает электрический разряд, оказавшись под ногами игрока, монстра или животного. Деревянные пластины можно также активировать, сбросив на них что-нибудь. + + + Увеличивает уровень доспехов на 8. + + + Увеличивает уровень доспехов на 6. + + + Увеличивает уровень доспехов на 3. + + + Увеличивает уровень доспехов на 6. + + + Железные двери можно открыть только с помощью красного камня, кнопок или переключателей. + + + Увеличивает уровень доспехов на 1. + + + Увеличивает уровень доспехов на 3. + + + Этот инструмент помогает быстрее добывать деревянные блоки. + + + С помощью этого инструмента можно вскапывать блоки земли и травы, чтобы подготовить их к посеву. + + + Чтобы открыть деревянную дверь, нужно использовать ее, ударить по ней или применить к ней красный камень. + + + Увеличивает уровень доспехов на 2. + + + Увеличивает уровень доспехов на 4. + + + Увеличивает уровень доспехов на 1. + + + Увеличивает уровень доспехов на 2. + + + Увеличивает уровень доспехов на 1. + + + Увеличивает уровень доспехов на 2. + + + Увеличивает уровень доспехов на 5. + + + Используется для создания небольших лестниц. + + + Тут хранятся тушеные грибы. Когда они съедены, миска остается у вас. + + + Тут можно хранить и переносить воду, лаву и молоко. + + + Тут можно хранить и переносить воду. + + + На этом предмете размещается текст, написанный вами или другим игроками. + + + Дает более яркий свет, чем факелы. Им можно плавить снег и лед, а также использовать его под водой. + + + Позволяет устраивать взрывы. Для детонации подожгите его кремнем и огнивом или электрическим разрядом. + + + Тут можно хранить и переносить лаву. + + + Показывает положение солнца и луны. + + + Указывает направление к точке старта. + + + Если держать ее в руках, она показывает исследованные области. Помогает искать маршрут. + + + Тут можно хранить и переносить молоко. + + + С помощью этих предметов можно разводить огонь, поджигать тротил и открывать построенный портал. + + + С ее помощью можно ловить рыбу. + + + Чтобы активировать люк, нужно использовать его, ударить по нему или применить к нему красный камень. Они выполняют ту же самую роль, что и двери, но лежат на земле и они размером в один блок. + + + Используется как строительный материал и для создания предметов. Получается из любых видов деревьев. + + + Используется как строительный материал. Сила тяжести действует на него иначе, чем на обычный песок. + + + Используется как строительный материал. + + + Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок нормального размера. + + + Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + + Используется для освещения. С помощью факелов можно также топить снег и лед. + + + Материал для факелов, стрел, табличек, лестниц, заборов и рукоятей для инструментов и оружия. + + + В нем можно хранить блоки и предметы. Чтобы создать сундук вдвое большего объема, поставьте два сундука рядом. + + + Барьер, через который нельзя перепрыгнуть. Для игроков, животных и монстров его высота считается равной 1,5 блокам. Для блоков его высота равна 1. + + + По ней можно лазить вертикально. + + + Позволяет перейти от любого момента ночи к утру (если в кроватях лежат все игроки в мире) и меняет точку спауна игрока. Окраска кровати всегда одна и та же. + + + Позволяет создавать более разнообразные предметы, чем при обычном занятии ремеслом. + + + Позволяет плавить руду, создавать древесный уголь и стекло, а также готовить рыбу и свиные отбивные. + + + Железный топор + + + Красная лампа + + + Лестница (дерево джунг.) + + + Березовая лестница + + + Выбранное управление + + + Череп + + + Какао + + + Лестница из ели + + + Яйцо дракона + + + Камень Края + + + Рамка портала Края + + + Лестница из песчаника + + + Папоротник + + + Куст + + + Раскладка + + + Создание предметов + + + Применение + + + Действие + + + Красться/лететь вниз + + + Красться + + + Выбросить + + + Выбор предмета + + + Пауза + + + Осмотр + + + Движение/ускорение + + + Инвентарь + + + Прыжок/взлет + + + Прыжок + + + Портал Края + + + Стебель тыквы + + + Дыня + + + Стекло + + + Ворота забора + + + Лоза + + + Стебель дыни + + + Железная решетка + + + Кирпичи из растрескавшихся камней + + + Кирпичи из замшелых камней + + + Каменные кирпичи + + + Гриб + + + Гриб + + + Кирпичи из обработанных камней + + + Кирпичная лестница + + + Адская бородавка + + + Лестница (ад. кирпичи) + + + Забор из адского кирпича + + + Котел + + + Варочная стойка + + + Колдовской стол + + + Адский кирпич + + + Булыжник-чешуйница + + + Камень-чешуйница + + + Лестница (камен. кирпичи) + + + Кувшинка + + + Мицелий + + + Каменный кирпич-чешуйница + + + Изменить режим камеры + + + Если ваше здоровье ухудшилось, но шкала пищи находится на отметке 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*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... + + + Чтобы прыгнуть, нажмите{*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 - игра, в которой можно построить из блоков все что угодно. +По ночам в мир выходят монстры, так что не забудьте заранее возвести убежище. + + + + + + + + + + + + + + + + + + + + + + + + Раскладка 1 + + + Движение (в полете) + + + Игроки/пригласить + + + + + + Раскладка 3 + + + Раскладка 2 + + + + + + + + + + + + + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы начать обучение.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы готовы играть самостоятельно. + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить. + + + + + + + + + + + + + + + + + + + + + + + + + + + Блок-чешуйница + + + Каменная плита + + + Способ компактно хранить железо. + + + Железный блок + + + Дубовая плита + + + Плита из песчаника + + + Каменная плита + + + Способ компактно хранить золото. + + + Цветок + + + Белая шерсть + + + Оранжевая шерсть + + + Золотой блок + + + Гриб + + + Роза + + + Плита из булыжника + + + Книжная полка + + + Тротил + + + Кирпичи + + + Факел + + + Обсидиан + + + Замшелый камень + + + Плита из адского камня + + + Плита из дуба + + + Плита из каменных блоков + + + Плита из кирпича + + + Плита из дерева джунглей + + + Плита из березы + + + Плита из ели + + + Пурпурная шерсть + + + Березовые листья + + + Еловые иголки + + + Дубовые листья + + + Стекло + + + Губка + + + Листья дерева джунглей + + + Листья + + + Дуб + + + Ель + + + Береза + + + Еловое полено + + + Березовое полено + + + Полено из дерева джунглей + + + Шерсть + + + Розовая шерсть + + + Серая шерсть + + + Светло-серая шерсть + + + Голубая шерсть + + + Желтая шерсть + + + Светло-зеленая шерсть + + + Бирюзовая шерсть + + + Зеленая шерсть + + + Красная шерсть + + + Черная шерсть + + + Лиловая шерсть + + + Синяя шерсть + + + Коричневая шерсть + + + Факел (уголь) + + + Сияющий камень + + + Песок души + + + Адский камень + + + Блок ляпис-лазури + + + Лазуритовая руда + + + Портал + + + Фонарь из тыквы + + + Сахарный тростник + + + Глина + + + Кактус + + + Тыква + + + Забор + + + Музыкальный автомат + + + Способ компактно хранить ляпис-лазурь. + + + Люк + + + Запертый сундук + + + Диод + + + Липкий поршень + + + Поршень + + + Шерсть (любого цвета) + + + Засохший куст + + + Торт + + + Нотный блок + + + Раздатчик + + + Высокая трава + + + Паутина + + + Кровать + + + Лед + + + Верстак + + + Способ компактно хранить алмазы. + + + Алмазный блок + + + Печь + + + Грядка + + + Урожай + + + Алмазная руда + + + Источник монстров + + + Огонь + + + Факел (древ. уголь) + + + Красная пыль + + + Сундук + + + Дубовая лестница + + + Табличка + + + Красная руда + + + Железная дверь + + + Нажимная плита + + + Снег + + + Кнопка + + + Красный факел + + + Рычаг + + + Рельсы + + + Лестница + + + Деревянная дверь + + + Каменная лестница + + + Рельсы с детектором + + + Рельсы под напряжением + + + У вас достаточно булыжников, чтобы сложить печь. Для этого воспользуйтесь верстаком. + + + Удочка + + + Часы + + + Сияющая пыль + + + Вагонетка с печкой + + + Яйцо + + + Компас + + + Сырая рыба + + + Краска "Красная роза" + + + Кактусовый зеленый + + + Какао-бобы + + + Готовая рыба + + + Сухая краска + + + Чернильный мешок + + + Вагонетка с сундуком + + + Снежок + + + Лодка + + + Кожа + + + Вагонетка + + + Седло + + + Красный камень + + + Ведро с молоком + + + Бумага + + + Книга + + + Комок слизи + + + Кирпич + + + Глина + + + Сахарный тростник + + + Ляпис-лазурь + + + Карта + + + Музыкальный диск "13" + + + Музыкальный диск "Кошка" + + + Кровать + + + Красный ретранслятор + + + Печенье + + + Музыкальный диск "Блоки" + + + Музыкальный диск "Меллохи" + + + Музыкальный диск "Шталь" + + + Музыкальный диск "Штрад" + + + Музыкальный диск "Щебет" + + + Музыкальный диск "Даль" + + + Музыкальный диск "Молл" + + + Торт + + + Серая краска + + + Розовая краска + + + Светло-зеленая краска + + + Лиловая краска + + + Бирюзовая краска + + + Светло-серая краска + + + Одуванчиковый желтый + + + Костная мука + + + Кость + + + Сахар + + + Голубая краска + + + Пурпурная краска + + + Оранжевая краска + + + Табличка + + + Кожаная куртка + + + Железный нагрудник + + + Алмазный нагрудник + + + Железный шлем + + + Алмазный шлем + + + Золотой шлем + + + Золотой нагрудник + + + Золотые поножи + + + Кожаные сапоги + + + Железные сапоги + + + Кожаные штаны + + + Железные поножи + + + Алмазные поножи + + + Кожаная шапка + + + Каменная мотыга + + + Железная мотыга + + + Алмазная мотыга + + + Алмазный топор + + + Золотой топор + + + Деревянная мотыга + + + Золотая мотыга + + + Кольчужный нагрудник + + + Кольчужные поножи + + + Кольчужные сапоги + + + Деревянная дверь + + + Железная дверь + + + Кольчужный шлем + + + Алмазные сапоги + + + Перо + + + Порох + + + Зерна пшеницы + + + Миска + + + Тушеные грибы + + + Нить + + + Пшеница + + + Готовая свиная отбивная + + + Картина + + + Золотое яблоко + + + Хлеб + + + Кремень + + + Сырая свиная отбивная + + + Палка + + + Ведро + + + Ведро с водой + + + Ведро с лавой + + + Золотые сапоги + + + Железный слиток + + + Золотой слиток + + + Кремень и огниво + + + Уголь + + + Древесный уголь + + + Алмаз + + + Яблоко + + + Лук + + + Стрела + + + Музыкальный диск "Вард" + + + + Нажимайте{*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*} + + + Ферментир. глаз паука + + + Котел + + + Глаз Края + + + Искрящаяся дыня + + + Огненный порошок + + + Сливки магмы + + + Варочная стойка + + + Слеза вурдалака + + + Семена тыквы + + + Семена дыни + + + Сырая курятина + + + Музыкальный диск "11" + + + Музыкальный диск "Где мы сейчас" + + + Ножницы + + + Готовая курятина + + + Жемчужина Края + + + Кусок дыни + + + Огненный жезл + + + Сырая говядина + + + Бифштекс + + + Гнилое мясо + + + Бутыль колдовства + + + Дубовые доски + + + Еловые доски + + + Березовые доски + + + Трава + + + Земля + + + Булыжник + + + Доски (дер. джунглей) + + + Саженец березы + + + Саженец дерева джунглей + + + Коренная порода + + + Саженец + + + Саженец дуба + + + Саженец ели + + + Камень + + + Рамка + + + Возродить существо: {*CREATURE*} + + + Адский кирпич + + + Огненный заряд + + + Огн. заряд (др. уголь) + + + Огн. заряд (уголь) + + + Череп + + + Голова + + + Голова игрока %s + + + Голова крипера + + + Череп скелета + + + Череп иссушенного скелета + + + Голова зомби + + + Способ компактно хранить уголь. Можно использовать в качестве топлива в печи. Яд - - стремительности + + Голод медлительности - - ускорения + + стремительности - - тупости + + Невидимость - - силы + + Дыхание под водой - - слабости + + Ночное зрение - - исцеления + + Слепота урона - - прыгучести + + исцеления тошноты @@ -5228,29 +6138,38 @@ Minecraft - игра, в которой можно построить из бл регенерации + + тупости + + + ускорения + + + слабости + + + силы + + + Устойчивость к огню + + + Насыщение + сопротивления - - устойчив. к огню + + прыгучести - - дыхания под водой + + Иссушение - - невидимости + + Пополнение здоровья - - слепоты - - - ночного зрения - - - голода - - - яда + + Поглощение @@ -5261,9 +6180,78 @@ Minecraft - игра, в которой можно построить из бл III + + невидимости + IV + + дыхания под водой + + + устойчив. к огню + + + ночного зрения + + + яда + + + голода + + + Поглощения + + + насыщения + + + пополнения здоровья + + + слепоты + + + гниения + + + Простое + + + Разбавленное + + + Разведенное + + + Прозрачное + + + Мутное + + + Неудобоваримое + + + Жирное + + + Однородное + + + Скверное + + + Безвкусное + + + Громоздкое + + + Слабое + Разрывное @@ -5273,50 +6261,14 @@ Minecraft - игра, в которой можно построить из бл Неинтересное - - Слабое + + Потрясающее - - Прозрачное + + Крепкое - - Мутное - - - Разведенное - - - Простое - - - Разбавленное - - - Неудобоваримое - - - Безвкусное - - - Громоздкое - - - Скверное - - - Жирное - - - Однородное - - - Бархатистое - - - Веселящее - - - Густое + + Очаровательное Элегантное @@ -5324,149 +6276,152 @@ Minecraft - игра, в которой можно построить из бл Замысловатое - - Очаровательное - - - Потрясающее - - - Изысканное - - - Крепкое - Игристое - - Мощное - - - Мерзкое - - - Лишенное запаха - Противное Грубое + + Лишенное запаха + + + Мощное + + + Мерзкое + + + Бархатистое + + + Изысканное + + + Густое + + + Веселящее + + + Постепенно восстанавливает здоровье игроков, животных и монстров. + + + Мгновенно уменьшает здоровье игроков, животных и монстров. + + + Делает игроков, животных и монстров неуязвимыми к огню, лаве и дистанционным атакам сполохов. + + + Не обладает собственным эффектом. Используйте в варочной стойке, чтобы создать зелье из нескольких ингредиентов. + Едкое + + Уменьшает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + + + Увеличивает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + + + Увеличивает урон, который наносят игроки и монстры. + + + Мгновенно увеличивает здоровье игроков, животных и монстров. + + + Уменьшает урон, который наносят игроки и монстры. + + + Основной ингредиент всех зелий. Используйте его в варочной стойке, чтобы создать зелье. + Отвратительное Вонючее - - Основной ингредиент всех зелий. Используйте его в варочной стойке, чтобы создать зелье. - - - Не обладает собственным эффектом. Используйте в варочной стойке, чтобы создать зелье из нескольких ингредиентов. - - - Увеличивает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. - - - Уменьшает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. - - - Увеличивает урон, который наносят игроки и монстры. - - - Уменьшает урон, который наносят игроки и монстры. - - - Мгновенно увеличивает здоровье игроков, животных и монстров. - - - Мгновенно уменьшает здоровье игроков, животных и монстров. - - - Постепенно восстанавливает здоровье игроков, животных и монстров. - - - Делает игроков, животных и монстров неуязвимыми к огню, лаве и дистанционным атакам сполохов. - - - Постепенно уменьшает здоровье игроков, животных и монстров. + + Сокрушение Острота - - Сокрушение + + Постепенно уменьшает здоровье игроков, животных и монстров. - - Гроза членистоногих + + Урон при атаке Ударная волна - - Огонь + + Гроза членистоногих - - Защита + + Скорость - - Защита от огня + + Подкрепления зомби - - Падающее перо + + Сила прыжка лошади - - Защита от взрывов + + При применении: - - Защита от стрел + + Сопротивление отбрасыванию - - Дыхание + + Дистанция следования монстров - - Сродство с водой - - - Эффективность + + Максимум здоровья Легкое прикосновение - - Прочность + + Эффективность - - Грабеж + + Сродство с водой Удача - - Сила + + Грабеж - - Пламя + + Прочность - - Удар + + Защита от огня - - Бесконечность + + Защита - - I + + Огонь - - II + + Падающее перо - - III + + Дыхание + + + Защита от стрел + + + Защита от взрывов IV @@ -5477,23 +6432,29 @@ Minecraft - игра, в которой можно построить из бл VI + + Удар + VII - - VIII + + III - - IX + + Пламя - - X + + Сила - - Можно добыть железной или более прочной киркой, чтобы получить изумруды. + + Бесконечность - - Похож на обычный сундук, но с одним исключением: все вещи, положенные в сундук Края, можно достать из любого другого сундука Края, принадлежащего игроку - даже если они находятся в разных измерениях. + + II + + + I Активируется, когда движущийся объект задевает присоединенную нить. @@ -5504,44 +6465,59 @@ Minecraft - игра, в которой можно построить из бл Компактный вариант хранения изумрудов. - - Стена из булыжника. + + Похож на обычный сундук, но с одним исключением: все вещи, положенные в сундук Края, можно достать из любого другого сундука Края, принадлежащего игроку - даже если они находятся в разных измерениях. - - С ее помощью можно чинить оружие, инструменты и доспехи. + + IX - - Можно расплавить в печи, чтобы получить адский кварц. + + VIII - - Используется как украшение. + + Можно добыть железной или более прочной киркой, чтобы получить изумруды. - - Можно использовать для торговли с крестьянами. - - - Используется как украшение. В него можно сажать цветы, саженцы, кактусы и грибы. + + X Восстанавливает 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*}. Создается из морковки и золотых самородков. + Восстанавливает 1{*ICON_SHANK_01*}. Этой едой можно отравиться. Используется для управления свиньей при езде верхом. - - Восстанавливает 4{*ICON_SHANK_01*}. + + Восстанавливает 3{*ICON_SHANK_01*}. Готовится из картошки в печи. + + + Восстанавливает 3{*ICON_SHANK_01*}. Создается из морковки и золотых самородков. Используется при зачаровывании оружия, инструментов или доспехов на наковальне. @@ -5549,6 +6525,15 @@ Minecraft - игра, в которой можно построить из бл Добывается из руды адского кварца. Может использоваться для создания кварцевого блока. + + Картошка + + + Печеная картошка + + + Морковка + Создается из шерсти, служит украшением. @@ -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,72 +6672,77 @@ Minecraft - игра, в которой можно построить из бл Резной песчаник - - Гладкий песчаник - {*PLAYER*} погиб, пытаясь нанести урон игроку {*SOURCE*} + + Гладкий песчаник + {*PLAYER*} был раздавлен упавшей наковальней. {*PLAYER*} был раздавлен упавшим блоком. - - {*PLAYER*} был телепортирован к игроку {*DESTINATION*} - {*PLAYER*} телепортировал вас к себе - - {*PLAYER*} телепортировался к вам + + {*PLAYER*} был телепортирован к игроку {*DESTINATION*} Шипы - - Плита из кварца + + {*PLAYER*} телепортировался к вам Делает темные места светлыми, даже под водой. + + Плита из кварца + Делает игроков, животных и монстров невидимыми. Ремонт и переименов. - - Стоимость зачаровывания: %d - Слишком дорого! - - Переименовать + + Стоимость зачаровывания: %d У вас есть: - - Нуж. для торговли + + Переименовать {*VILLAGER_TYPE*} предлагает %s - - Ремонт + + Нуж. для торговли Торговля - - Окраска ошейника + + Ремонт Это окно наковальни. Здесь вы можете чинить и присваивать имена оружию, доспехам или инструментам, а также накладывать на них чары. Все это делается за счет уровней опыта. + + + + Окраска ошейника + + + + Чтобы начать работать с предметом, положите его в первую ячейку. @@ -5771,9 +6752,9 @@ Minecraft - игра, в которой можно построить из бл Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать наковальню. - + - Чтобы начать работать с предметом, положите его в первую ячейку. + Кроме того, во вторую ячейку можно положить точно такой же предмет - это позволит скомбинировать два предмета. @@ -5781,24 +6762,14 @@ 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,14 +6851,24 @@ Minecraft - игра, в которой можно построить из бл Вы можете увидеть, сколько предметов необходимо для совершения сделки, в двух ячейках слева. - + - Нажмите{*CONTROLLER_VK_A*}, чтобы обменять предметы, нужные крестьянину, на то, что он предлагает. + Количество и тип предметов, которые вы отдаете крестьянину, показаны в двух ячейках слева. Здесь неподалеку живет крестьянин и стоит сундук. В сундуке вы найдете бумагу, которую сможете обменять на другие предметы. + + + + + Нажмите{*CONTROLLER_VK_A*}, чтобы обменять предметы, нужные крестьянину, на то, что он предлагает. + + + + + Игроки могут продавать предметы из инвентаря крестьянам. @@ -5897,19 +6878,14 @@ Minecraft - игра, в которой можно построить из бл Нажмите{*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,36 +1,125 @@  - + + Вы хотите войти в "PSN"? + + + Данный пункт позволяет исключить игрока, система PlayStation®Vita которого отличается от системы хоста. Все остальные игроки, использующие его систему PlayStation®Vita, также будут отключены. Игрок не сможет присоединиться до тех пор, пока игра не будет запущена заново. + + + + SELECT + + + Эта функция отключает обновление призов и списков лидеров для данного мира на время игры. Если эта функция включена во время сохранения, призы и списки лидеров будут отключены и после загрузки данного мира. + + + система PlayStation®Vita + + + Выберите подключение к сети в специальном режиме, чтобы установить соединение с другими системами PlayStation®Vita поблизости, или "PSN", чтобы играть с друзьями по всему миру. + + + Специальный режим + + + Изменить сетевой режим + + + Выбрать сетевой режим + + + Сетевые идентификаторы на раздел. экране + + + Призы + + + В игре имеется функция автосохранения уровня. Если на экране появляется этот значок, идет сохранение игры. +Пока вы его видите, не выключайте вашу систему PlayStation®Vita. + + + Если эта функция включена, хост может включить или отключить в главном меню полеты, усталость и невидимость. Включение этой функции отключает призы и обновления списков лидеров. + + + Сетевые идентификаторы: + + + Вы используете пробную версию набора текстур. У вас будет доступ ко всему содержимому набора, но не будет возможности сохранить свою игру. +При попытке сохранения с использованием пробной версии вам будет предложено купить полную версию набора. + + + + Версия 1.04 (обновление 14) + + + Сетевые идентификаторы + + + Взгляните на мое творение в Minecraft: PlayStation®Vita Edition! + + + Не удалось завершить загрузку. Повторите попытку позже. + + + Не удалось присоединиться к игре из-за ограничений NAT. Пожалуйста, проверьте настройки сети. + + + Не удалось завершить передачу. Повторите попытку позже. + + + Загрузка завершена! + + + +В настоящий момент в области переноса сохранений нет доступных сохранений. +Вы можете передать сохраненный мир в область переноса сохранений из игры Minecraft: PlayStation®3 Edition, а затем загрузить его в игру Minecraft: PlayStation®Vita Edition. + + + + Сохранение не завершено + + + Игре Minecraft: PlayStation®Vita Edition не хватает места для записи сохранений. Чтобы освободить место, удалите существующие сохранения Minecraft: PlayStation®Vita Edition. + + + Передача отменена + + + Вы отменили передачу сохраненного мира в область переноса сохранений. + + + Передать сохранение для PS3™/PS4™ + + + Передача данных: %d%% + + + "PSN" + + + Загрузить сохранение с PS3™ + + + Загрузка данных: %d%% + + + Сохранение + + + Передача завершена! + + + Вы уверены, что хотите передать это сохранение и заменить текущее сохранение, хранящееся в области переноса сохранений? + + + Преобразование данных + + NOT USED - - Вы можете использовать сенсорный экран на системе PlayStation®Vita для навигации по меню! - - - На форуме Minecraft есть раздел, посвященный версии PlayStation®Vita Edition. - - - Самые свежие новости об игре можно узнать в твит-лентах @4JStudios и @Kappische! - - - Не смотрите заокраиннику в глаза! - - - Нам кажется, что студия 4J Studios удалила Геробрина из версии игры для системы PlayStation®Vita, но мы не уверены. - - - 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*} -Ваш сетевой идентификатор не будет отображен. + + NOT USED {*T3*}ОБУЧЕНИЕ: ТВОРЧЕСТВО{*ETW*}{*B*}{*B*} @@ -44,32 +133,79 @@ Minecraft на системе PlayStation®Vita по умолчанию явля Чтобы летать, быстро дважды нажмите{*CONTROLLER_ACTION_JUMP*}. Если нужно выйти из режима полета, повторите это действие. Чтобы ускориться в полете, быстро дважды наклоните вперед {*CONTROLLER_ACTION_MOVE*}. Во время полета наклоните вниз и удерживайте{*CONTROLLER_ACTION_JUMP*}, чтобы лететь вверх, {*CONTROLLER_ACTION_SNEAK*}, чтобы лететь вниз, или используйте кнопки направлений, чтобы лететь вверх, вниз, вправо или влево. - - NOT USED - - - NOT USED - "NOT USED" - - "NOT USED" - - - Пригласить друзей - Если создать, загрузить или сохранить мир в режиме "Творчество", призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить мир в режиме "Выживание". Продолжить? Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. Продолжить? - - Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. + + "NOT USED" - - Если создать, загрузить или сохранить мир со включенными привилегиями хоста, призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить игру, отключив эти параметры. Продолжить? + + Пригласить друзей + + + На форуме Minecraft есть раздел, посвященный версии PlayStation®Vita Edition. + + + Самые свежие новости об игре можно узнать в твит-лентах @4JStudios и @Kappische! + + + NOT USED + + + Вы можете использовать сенсорный экран на системе 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*} +Ваш сетевой идентификатор не будет отображен. + + + Нам кажется, что студия 4J Studios удалила Геробрина из версии игры для системы PlayStation®Vita, но мы не уверены. + + + Minecraft: PlayStation®Vita Edition побила множество рекордов! + + + Вы играли в пробную версию Minecraft: PlayStation®Vita Edition в течение максимально разрешенного времени. Хотите получить доступ к полной версии игры, чтобы продолжить веселье? + + + Не удалось загрузить игру "Minecraft: PlayStation®Vita Edition". Продолжить загрузку невозможно. + + + Создание зелья + + + Вы вернулись на главный экран, так как вышли из "PSN". + + + Не удалось присоединиться к игре, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. + + + Вам не разрешено присоединиться к этой игре, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. + + + Вам не разрешено создать эту игру, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. + + + Не удалось создать сетевую игру, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. + + + Вам не разрешено присоединиться к этой игре, так сетевые возможности вашей учетной записи Sony Entertainment Network отключены в силу ограничений чата. Соединение с "PSN" потеряно. Сейчас вы вернетесь в главное меню. @@ -77,11 +213,23 @@ Minecraft на системе PlayStation®Vita по умолчанию явля Соединение с "PSN" потеряно. + + Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. + + + Если создать, загрузить или сохранить мир со включенными привилегиями хоста, призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить игру, отключив эти параметры. Продолжить? + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили приз! Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". Получить доступ к полной версии игры? + + Игроки-гости не могут получить доступ к полной версии игры. Пожалуйста, зайдите под своей учетной записью в Sony Entertainment Network. + + + Сетевой идентификатор + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили тему! Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". @@ -91,154 +239,7 @@ Minecraft на системе PlayStation®Vita по умолчанию явля Это пробная версия игры Minecraft: PlayStation®Vita Edition. Если вы хотите принять это приглашение, необходимо получить доступ к полной версии. Получить доступ к полной версии игры? - - Игроки-гости не могут получить доступ к полной версии игры. Пожалуйста, зайдите под своей учетной записью в Sony Entertainment Network. - - - Сетевой идентификатор - - - Создание зелья - - - Вы вернулись на главный экран, так как вышли из "PSN". - - - - Вы играли в пробную версию Minecraft: PlayStation®Vita Edition в течение максимально разрешенного времени. Хотите получить доступ к полной версии игры, чтобы продолжить веселье? - - - Не удалось загрузить игру "Minecraft: PlayStation®Vita Edition". Продолжить загрузку невозможно. - - - Не удалось присоединиться к игре, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. - - - Не удалось создать сетевую игру, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. - - - Вам не разрешено присоединиться к этой игре, так сетевые возможности вашей учетной записи Sony Entertainment Network отключены в силу ограничений чата. - - - Вам не разрешено присоединиться к этой игре, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. - - - Вам не разрешено создать эту игру, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. - - - В игре имеется функция автосохранения уровня. Если на экране появляется этот значок, идет сохранение игры. -Пока вы его видите, не выключайте вашу систему PlayStation®Vita. - - - Если эта функция включена, хост может включить или отключить в главном меню полеты, усталость и невидимость. Включение этой функции отключает призы и обновления списков лидеров. - - - Сетевые идентификаторы на раздел. экране - - - Призы - - - Сетевые идентификаторы: - - - Сетевые идентификаторы - - - Взгляните на мое творение в Minecraft: PlayStation®Vita Edition! - - - Вы используете пробную версию набора текстур. У вас будет доступ ко всему содержимому набора, но не будет возможности сохранить свою игру. -При попытке сохранения с использованием пробной версии вам будет предложено купить полную версию набора. - - - - Версия 1.04 (обновление 14) - - - SELECT - - - Эта функция отключает обновление призов и списков лидеров для данного мира на время игры. Если эта функция включена во время сохранения, призы и списки лидеров будут отключены и после загрузки данного мира. - - - Вы хотите войти в "PSN"? - - - Данный пункт позволяет исключить игрока, система PlayStation®Vita которого отличается от системы хоста. Все остальные игроки, использующие его систему PlayStation®Vita, также будут отключены. Игрок не сможет присоединиться до тех пор, пока игра не будет запущена заново. - - - - система PlayStation®Vita - - - Изменить сетевой режим - - - Выбрать сетевой режим - - - Выберите подключение к сети в специальном режиме, чтобы установить соединение с другими системами PlayStation®Vita поблизости, или "PSN", чтобы играть с друзьями по всему миру. - - - Специальный режим - - - "PSN" - - - Загрузить сохранение с системы Playstation®3 - - - - Передать сохранение для система PlayStation®3/PlayStation®4 - - - Передача отменена - - - Вы отменили передачу сохраненного мира в область переноса сохранений. - - - Передача данных: %d%% - - - Загрузка данных: %d%% - - - Вы уверены, что хотите передать это сохранение и заменить текущее сохранение, хранящееся в области переноса сохранений? - - - Преобразование данных - - - Сохранение - - - Передача завершена! - - - Не удалось завершить передачу. Повторите попытку позже. - - - Загрузка завершена! - - - Не удалось завершить загрузку. Повторите попытку позже. - - - Не удалось присоединиться к игре из-за ограничений NAT. Пожалуйста, проверьте настройки сети. - - - - В настоящий момент в области переноса сохранений нет доступных сохранений. - Вы можете передать сохраненный мир в область переноса сохранений из игры Minecraft: PlayStation®3 Edition, а затем загрузить его в игру 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*} + {*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*} +{*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*}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*}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*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*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*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*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*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*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*}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*} - {*T1*}World Generation Options{*ETW*}{*B*} - When creating a new world there are some additional options.{*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*}Generate Structures{*ETW*}{*B*} - When enabled, structures such as Villages and Strongholds will generate in the world.{*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*}Superflat World{*ETW*}{*B*} - When enabled, a completely flat world will be generated in the Overworld and in the Nether.{*B*}{*B*} + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*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*} +{*T1*}World Generation Options{*ETW*}{*B*} +When creating a new world there are some additional options.{*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*} + {*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*} + {*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*} - {*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*} - {*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*} - {*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*} +{*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 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 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*}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*}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*}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*}Invisible{*ETW*}{*B*} + When this option is enabled, the player is not visible to other players and is invulnerable.{*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. - + {*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. - + + A compact way of storing Gold. + - + + A compact way of storing Iron. + + + Block of Iron - + - - A compact way of storing 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,6 +3649,374 @@ Can also be used for low-level lighting. Skull + + Command Block + + + + Beacon + + + + Trapped Chest + + + + Weighted Pressure Plate (Light) + + + + Weighted Pressure Plate (Heavy) + + + + Redstone Comparator + + + + Daylight Sensor + + + + Block of Redstone + + + + 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 @@ -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. @@ -4438,17 +4877,13 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -4472,9 +4907,7 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -4482,17 +4915,13 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -4568,9 +4997,7 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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! @@ -4591,7 +5018,7 @@ At night monsters come out, make sure to build a shelter before that happens. {*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. @@ -4603,17 +5030,233 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -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. - - - - Matchen avbröts för att du loggade ut från "PSN" - - - - Inte inloggad 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. - - - Ad hoc-nätverk offline. - - - 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 - - - Trophy-problem - - - Ett problem uppstod vid åtkomsten av ditt Sony Entertainment Network-konto. Din trophy kunde inte låsas upp för tillfället. + + Det gick inte att spara inställningar till ditt Sony Entertainment Network-konto. Problem med Sony Entertainment Network-kontot - - Det gick inte att spara inställningar till ditt Sony Entertainment Network-konto. + + 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 ä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? + + 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. + + + Ad hoc-nätverk offline. + + + Trophy-problem + + + Matchen avbröts för att du loggade ut från "PSN" + + + + Du loggades ut från "PSN" och återvände därför till titelskärmen. + + + + Ditt lagringsminne har inte tillräckligt med ledigt utrymme för att skapa en sparfil. + + + 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,250 +1,3758 @@  - - 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 + + + Rotera + + + Dölj + + + Töm alla platser + + + Vill du lämna det pågående spelet och ansluta till det nya? Osparade framsteg kommer att gå förlorade. + + + Vill du skriva över den befintliga sparfilen för den här världen med den nuvarande versionen av den här världen? + + + Vill du avsluta utan att spara? Du kommer att förlora alla framsteg i den här världen! + + + Starta spelet + + + Avsluta + + + Spara spelet + + + Avsluta utan att spara + + + Tryck START för att ansluta + + + 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 kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en nyare version av spelet. + + + Ny värld + + + Belöning upplåst! + + + 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änner + + + Min poäng + + + Totalt + + + Vänta + + + Inga resultat + + + Filter: + + + 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. + + + Anslutningen tappades + + + Anslutningen till servern bröts. Avslutar till huvudmenyn. + + + Kopplades ned av servern + + + Avslutar spelet + + + Ett fel uppstod. Avslutar till huvudmenyn. + + + Anslutningen misslyckades + + + Du sparkades från spelet + + + Värden har lämnat spelet. + + + Du kan inte ansluta till det här spelet. Ingen av spelarna är dina vänner. + + + Du kan inte ansluta till det här spelet. Värden har sparkat dig förut. + + + Du sparkades från spelet för att du flög + + + Anslutningsförsöket tog för lång tid + + + Servern är full + + + 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! + + + Teman + + + Utseendepaket + + + Tillåt vänners vänner + + + Sparka spelare + + + Vill du sparka den här spelaren från spelet? Spelaren kan inte ansluta på nytt förrän du startar om världen. + + + Spelarbildspaket + + + Du kan inte ansluta till det här spelet. Det har begränsats till spelare som är vänner till värden. + + + Korrupt nedladdningsbart innehåll + + + 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. + + + 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. + + + Kan inte ansluta till spelet + + + Valt + + + Valt utseende: + + + Skaffa fullversion + + + Lås upp texturpaket + + + 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? + + + Demonstration av texturpaket + + + Frö + + + Lås upp utseendepaket + + + 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? + + + 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? + + + Ladda ned fullversion + + + Den här världen använder ett kombinations- eller texturpaket som du inte har! +Vill du installera kombinations- eller texturpaketet nu? + + + Skaffa demoversion + + + Texturpaket saknas + + + Lås upp fullversion + + + Ladda ned demoversion + + + Ditt spelläge har ändrats + + + När det här alternativet är valt kan bara inbjudna spelare ansluta. + + + När det här alternativet är valt kan vänner till folk på din vänlista ansluta. + + + När det här alternativet är valt kan spelare skada andra spelare. Påverkar bara överlevnadsläget. + + + Normal + + + Platt + + + När det här alternativet är valt spelas spelet i onlineläge. + + + När det här alternativet är avstängt måste spelare godkännas innan de kan bygga eller bryta block. + + + När det här alternativet är valt kommer byar och fästningar att genereras i världen. + + + När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta. + + + När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats. + + + När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. + + + När det här alternativet är aktiverat exploderar dynamit när den aktiveras. + + + 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. + + + Av + + + Spelläge: Kreativt + + + Överlevnad + + + Kreativt + + + Döp om din värld + + + Ange världens nya namn + + + Spelläge: Överlevnad + + + Skapad i överlevnadsläget + + + Byt namn på sparfilen + + + Sparar automatiskt om %d ... + + + + + + Skapad i det kreativa läget + + + Visa moln + + + Vad vill du göra med den här sparfilen? + + + Gränssnittets storlek (delad skärm) + + + Ingrediens + + + Bränsle + + + Automat + + + Kista + + + Förtrolla + + + Ugn + + + Det finns inga erbjudanden på nedladdningsbart innehåll av den här typen för tillfället. + + + Vill du radera den här sparfilen? + + + Väntar på godkännande + + + Censurerad + + + %s har anslutit till spelet. + + + %s har lämnat spelet. + + + %s har sparkats från spelet. + + + Brygdställ + + + Ange skylttext + + + Skriv vad som ska stå på din skylt + + + Ange namn + + + Demotiden slut + + + Spelet är fullt + + + Kunde inte ansluta till spelet. Det finns inga lediga platser. + + + Ge din post ett namn + + + Ge din post en beskrivning + + + Inventarie + + + Ingredienser + + + Ange bildtext + + + Ge din post en bildtext + + + Ange beskrivning + + + Spelar: + + + Vill du lägga till den här världen på listan med blockerade världar? +Om du väljer OK avslutas spelet. + + + Häv blockering + + + Automatisk sparfrekvens + + + Blockerad värld + + + 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. + + + Blockera den här världen? + + + Automatisk sparfrekvens: AV + + + Gränssnittets opacitet + + + Förbereder automatisk sparning av världen + + + Gränssnittets storlek + + + Minuter + + + Kan inte placeras här! + + + 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ö. + + + Favoritutseenden + + + Spel skapat av %s + + + Okänd värds spel + + + Gästen loggade ut + + + Återställ inställningar + + + Vill du återställa alla inställningar till deras standardvärden? + + + Laddningsfel + + + En gästspelare har loggat ut, vilket har fått alla gäster att loggas ut från spelet. + + + Kunde inte skapa spel + + + Valt automatiskt + + + Inget paket: standardutseende + + + Logga in + + + Du är inte inloggad. För att spela det här spelet måste du vara inloggad. Vill du logga in nu? + + + Flera spelare tillåts inte + + + Drick + + + + 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. + + + + + {*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. + + + + 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. + + + Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna det kreativa lägets inventariegränssnitt. + + + Ta dig till andra sidan av det här hålet för att fortsätta. + + + Nu har du klarat det kreativa lägets övning. + + + 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. + + + 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*} + + + Svampar ska planteras i dunkla miljöer och sprider sig till närliggande block med dunkelt ljus.{*ICON*}39{*/ICON*} + + + 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*} + + + 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*} + + + 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. + + + 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*} + + + 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. + + + + 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. + + + + + I det här området finns en portal till Nedervärlden! + + + + + {*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. + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + Portaler skapas genom att bygga en ram som är fyra block bred och fem block hög av obsidianblock. Hörnblocken behövs inte. + + + + + 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. + + + + + Nu befinner du dig i det kreativa läget. + + + + + {*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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + Nu har du klarat övningen om hur man skördar. + + + Olika verktyg passar till olika material. Använd en yxa för att hugga trädstammar. + + + 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. + + + Vissa verktyg är bättre lämpade att anfalla fiender med. Du bör använda ett svärd när du anfaller. + + + Vissa byar har en järngolem som skyddar byborna. Om du anfaller dem går den till angrepp. + + + Du kan inte lämna det här området innan du är klar med övningen. + + + Olika verktyg passar till olika material. Använd en spade för att gräva i mjuka material som jord och sand. + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. + + + Håll in{*CONTROLLER_ACTION_JUMP*} för att simma upp. + + + 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. + + + 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. + + + 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. + + + 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. + + + Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter. + + + + I det här området finns en inhägnad med djur. Du kan avla djur för att skaffa bebisversioner av djuren. + + + + + {*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. + + + + För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga. + + + 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*} + + + + {*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. + + + + Du bygger en golem genom att placera en pumpa på en hög med block. + + + En snögolem består av en stapel med två snöblock och en pumpa ovanpå. De kastar snöbollar på dina fiender. + + + + 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. + + + + Nu har du klarat övningen om djur och avel. + + + + I det här området finns några pumpor och block som låter dig bygga en snö- eller järngolem. + + + + + 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. + + + + + Om kitteln blir tom kan du fylla den med en vattenhink. + + + + + Använd brygdstället för att brygga en brygd för eldmotstånd. Du behöver en vattenflaska, en nedervårta och magmasalva. + + + + + 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. + + + + {*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. + + + + + Första steget när man brygger en brygd är att skapa en vattenflaska. Ta en glasflaska från kistan. + + + + + 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*}. + + + + + Använd din brygd för eldmotstånd på dig själv. + + + + + 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. + + + + + När ett föremål har placerats i förtrollningsrutan kommer knapparna till höger att visa ett antal slumpmässiga förtrollningar. + + + + + 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. + + + + + 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. + + + + + Det här är förtrollningsgränssnittet. Du kan använda det för att förtrolla vapen, rustningsdelar och vissa verktyg. + + + + {*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. + + + + + I det här området finns ett brygdställ, en kittel och en kista full med brygdingredienser. + + + + + Träkol kan användas som bränsle, eller användas i kombination med en stav för att tillverka en fackla. + + + + + Om du använder sand som resurs kan du tillverka glas. Tillverka några glasblock att använda som fönster i ditt skydd. + + + + + Det här är bryggningsgränssnittet. Du kan använda det för att skapa brygder med många olika effekter. + + + + + 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. + + + + + 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. + + + + + 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. + + + + {*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. + + + + + 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. + + + + + Skapa en brygd för eldmotstånd genom att först tillsätta en nedervårta i en vattenflaska, och sedan tillsätta magmasalva. + + + + + Tryck på{*CONTROLLER_VK_B*} nu för att lämna brygdgränssnittet. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + Nu använder du ett fiskespö. Tryck på{*CONTROLLER_ACTION_USE*} för att använda det.{*FishingRodIcon*} + + + + + {*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. + + + + + 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*} + + + + + 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. + + + + + {*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. + + + + + 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. + + + + + {*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. + + + + + 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*} + + + + + Om du spelar tillsammans med andra spelare måste alla gå och lägga sig samtidigt för att kunna sova. + {*ICON*}355{*/ICON*} + + + + + {*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. + + + + + 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. + + + + + Om du ställer bokhyllor runt förtrollningsbordet får det mer kraft, och då kan du använda bättre förtrollningar. + + + + + 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. + + + + + 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. + + + + + 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. + + + + {*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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + + 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*} + + + + + 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. + + + + + 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*} + + + + {*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. + + + + 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. + + + Läs + + + Häng + + + Kasta + + + Öppna + + + Byt tonart + + + Detonera + + + Plantera + + + Lås upp fullständiga spelet + + + Radera sparfil + + + Radera + + + Plöj + + + Skörda + + + Fortsätt + + + Simma upp + + + Slå + + + Mjölka + + + Plocka upp + + + Töm + + + Rid + + + Placera + + + Ät + + + Rid + + + Segla + + + Odla + + + Sov + + + Vakna + + + Spela + + + Alternativ + + + Flytta rustningsdel + + + Flytta vapen + + + Välj + + + Flytta ingrediens + + + Flytta bränsle + + + Flytta verktyg + + + Dra + + + Sida upp + + + Sida ned + + + Brunstig + + + Släpp + + + Privilegier + + + Blockera + + + Kreativt + + + Blockera värld + + + Välj utseende + + + Antänd + + + Bjud in vänner + + + Acceptera + + + Klipp + + + Navigera + + + Ominstallera + + + Sparalt. + + + Verkställ kommando + + + Installera fullständiga versionen + + + Installera demo + + + Installera + + + Skjut ut + + + Uppdatera spellistan + + + Festspel + + + Alla spel + + + Stäng + + + Avbryt + + + Avbryt anslutningen + + + Byt grupp + + + Tillverkning + + + Tillverka + + + Plocka upp/placera + + + Visa inventariet + + + Visa beskrivning + + + Visa ingredienser + + + Tillbaka + + + Påminnelse: + + + + + + Nya funktioner har lagts till i den senaste versionen, bland annat nya områden i övningsvärlden. + + + 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. + + + + 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! + + + + {*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. + + + {*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. + + + + {*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. + + + + Välj + + + Använd + + + I det här området finns platser där du kan lära dig om fiske, båtar, kolvar och rödsten. + + + 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! + + + + Din hungermätare ligger på en nivå där du inte längre återfår hälsa. + + + + Plocka upp + + + Nästa + + + Föregående + + + Sparka spelare + + + Skicka vänförfrågan + + + Sida ned + + + Sida upp + + + Färga + + + Läk + + + Sitt + + + Följ mig + + + Bryt + + + Mata + + + Tämj + + + Byt filter + + + Placera alla + + + Placera en + + + Släpp + + + Plocka upp alla + + + Plocka upp hälften + + + Placera + + + Släpp alla + + + Rensa snabbval + + + Vad är det här? + + + Dela på Facebook + + + Släpp en + + + Byt grupp + + + Snabbval + + + Utseendepaket + + + Rödmålad glasruta + + + Grönmålad glasruta + + + Brunmålad glasruta + + + Vitmålat glas + + + Målad glasruta + + + Svartmålad glasruta + + + Blåmålad glasruta + + + Gråmålad glasruta + + + Rosamålad glasruta + + + Limemålad glasruta + + + Lilamålad glasruta + + + Cyanmålad glasruta + + + Ljusgråmålad glasruta + + + Orangemålat glas + + + Blåmålat glas + + + Lilamålat glas + + + Cyanmålat glas + + + Rödmålat glas + + + Grönmålat glas + + + Brunmålat glas + + + Ljusgråmålat glas + + + Gulmålat glas + + + Ljusblåmålat glas + + + Magentamålat glas + + + Gråmålat glas + + + Rosamålat glas + + + Limemålat glas + + + Gulmålad glasruta + + + Ljusgrått + + + Grått + + + Rosa + + + Blått + + + Lila + + + Cyanfärgat + + + Limefärgat + + + Orange + + + Vitt + + + Anpassat + + + Gult + + + Ljusblått + + + Magentafärgat + + + Brunt + + + Vitmålad glasruta + + + Liten boll + + + Stor boll + + + Ljusblåmålad glasruta + + + Magentamålad glasruta + + + Orangemålad glasruta + + + Stjärnformat + + + Svart + + + Rött + + + Grönt + + + Smygarformat + + + Explosion + + + Okänd form + + + Svartmålat glas + + + Hästrustning i järn + + + Hästrustning i guld + + + Hästrustning i diamant + + + Rödstensjämförare + + + Gruvvagn med dynamit + + + Gruvvagn med tratt + + + Koppel + + + Fyrljus + + + Kistfälla + + + Viktplatta (lätt) + + + Namnskylt + + + Träplankor (alla sorter) + + + Kommandoblock + + + Fyrverkeristjärna + + + De här djuren kan tämjas och sedan ridas. De kan utrustas med en kista. + + + Mula + + + 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. + + + Häst + + + De här djuren kan tämjas och sedan ridas. + + + Åsna + + + Zombiehäst + + + Tom karta + + + Nederstjärna + + + Fyrverkeriraket + + + Skeletthäst + + + Wither + + + De här tillverkas av witherskallar och själsand. De skjuter exploderande döskallar mot dig. + + + Viktplatta (tung) + + + Ljusgråfärgad lera + + + Gråfärgad lera + + + Rosafärgad lera + + + Blåfärgad lera + + + Lilafärgad lera + + + Cyanfärgad lera + + + Limefärgad lera + + + Orangefärgad lera + + + Vitfärgad lera + + + Målat glas + + + Gulfärgad lera + + + Ljusblåfärgad lera + + + Magentafärgad lera + + + Brunfärgad lera + + + Tratt + + + Aktiveringsräls + + + Utmatare + + + Rödstensjämförare + + + Dagsljussensor + + + Rödstensblock + + + Färgad lera + + + Svartfärgad lera + + + Rödfärgad lera + + + Grönfärgad lera + + + Höbal + + + Härdad lera + + + Kolblock + + + Tona till + + + 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. + + + När det här alternativet är aktiverat får spelare behålla allt i sin inventarie när de dör. + + + När det här alternativet är avstängt spawnar inga varelser naturligt. + + + Spelläge: Äventyr + + + Äventyr + + + Skriv in ett frö för att skapa samma terräng på nytt. Lämna tomt för en slumpmässig värld. + + + 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). + + + {*PLAYER*} föll av en stege + + + {*PLAYER*} föll av några vinrankor + + + {*PLAYER*} föll ut ur vattnet + + + 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). + + + När det här alternativet är avstängt kommer inte spelare att återställa hälsa automatiskt. + + + När det här alternativet är avstängt ändras inte tiden på dygnet. + + + Gruvvagn + + + Koppla + + + Släpp + + + Fäst + + + Kliv av + + + Fäst kista + + + Avfyra + + + Namnge + + + Fyrljus + + + Primär kraft + + + Sekundär kraft + + + Häst + + + Utmatare + + + Tratt + + + {*PLAYER*} föll från en hög plats + + + Du kan inte använda ägget för tillfället. Det maximala antalet fladdermöss har uppnåtts. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga hästar har uppnåtts. + + + Spelalternativ + + + {*PLAYER*} sveddes av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} mörbultades av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} dödades av {*SOURCE*} som använde {*ITEM*} + + + Destruktiva varelser + + + Föremål från block + + + Naturlig återställning + + + Dagsljuscykel + + + Behåll inventarie + + + Varelsespawn + + + Föremål från varelser + + + {*PLAYER*} sköts av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} föll för långt och dödades av {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av att {*SOURCE*} använde {*ITEM*} + + + {*PLAYER*} gick in i eld i strid mot {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av att {*SOURCE*} använde {*ITEM*} + + + {*PLAYER*} brändes till aska i strid mot {*SOURCE*} + + + {*PLAYER*} sprängdes av {*SOURCE*} + + + {*PLAYER*} förmultnade + + + {*PLAYER*} dödades av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} försökte att simma i lava för att fly från {*SOURCE*} + + + {*PLAYER*} drunknade i försöket att fly från {*SOURCE*} + + + {*PLAYER*} gick in i en kaktus i försöket att fly från {*SOURCE*} + + + Kliv på + + + +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. + + + + +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. + + + + +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ö. + + + + +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. + + + + +När den har tämjts dyker det upp hjärtan, och den försöker inte längre kasta av sig dig. + + + + +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å. + + + + +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å. + + + + +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. + + + + +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. + + + + Högst upp på pyramiden finns ett inaktivt fyrljus. + + + +Det här är gränssnittet för fyrljus, vilket du kan använda för att välja fyrljusets krafter. + + + + +{*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. + + + + +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. + + + + +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. + + + + +Det här är hästinventariets gränssnitt. + + + + +{*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. + + + + +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. + + + + Tindra + + + Svans + + + Flygtid: + + + +Sadla din häst genom att sätta en sadel i sadelrutan. Hästar kan ges rustning genom att placera hästrustning i rustningsrutan. + + + + Du har hittat en mula. + + + + {*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. + + + + +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. + + + + +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. + + + + Du har hittat en häst. + + + Du har hittat en åsna. + + + + {*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. + + + + +Fyrverkeristjärnor kan tillverkas genom att placera krut och färgämnen i tillverkningsrutorna. + + + + +Färgämnet bestämmer färgen på fyrverkeristjärnans explosion. + + + + +Fyrverkeristjärnans form kan bestämmas genom att lägga till en eldladdning, guldklimp, fjäder eller ett fiendehuvud. + + + + +Om du vill kan du placera flera fyrverkeristjärnor i tillverkningsrutorna för att lägga till dem i fyrverkerierna. + + + + +Ju fler rutor du fyller med krut, desto högre upp exploderar fyrverkeristjärnorna. + + + + +Du kan sedan ta de tillverkade fyrverkerierna ur resultatfacket. + + + + +Den kan tindra eller ges en svans genom att lägga till glödstensstoft eller diamanter. + + + + +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. + + + + +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. + + + + +Pröva att tillverka fyrverkerier vid arbetsbänken med hjälp av ingredienserna i kistorna. + + + + +När en fyrverkeristjärna har tillverkats kan den ges en toningsfärg genom att tillverkas tillsammans med ett färgämne. + + + + +I kistorna här finns diverse föremål som används vid tillverkningen av FYRVERKERIER! + + + + +{*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. + + + + +För att tillverka fyrverkerier, placera krut och papper i 3x3-tillverkningsrutorna ovanför din inventarie. + + + + Det här rummet innehåller trattar + + + + {*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. + + + + +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. + + + + +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. + + + + +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. + + + + +Pröva att använda fyrljuset för att ställa in vilka krafter det ger. Du kan använda järntackorna som betalning. + + + + +De kan användas med brygdställ, kistor, automater, gruvvagnar med kistor, gruvvagnar med trattar samt med andra trattar. + + + + +Det finns diverse praktiska trattlayouter i det här rummet som du kan experimentera med. + + + + +Det här är fyrverkerigränssnittet. Här kan du tillverka fyrverkerier och fyrverkeristjärnor. + + + + +{*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. + + + + +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. + + + + +Om en tratt drivs av rödsten blir den inaktiv och slutar med uppsamlingen och insättningen av föremål. + + + + +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. + + + + De här fienderna finns i träsk och attackerar genom att kasta brygder. De tappar brygder när de dödas. + + + Det maximala antalet tavlor/uppvisningsboxar i en värld har uppnåtts. + + + Du kan inte spawna fiender i det fridfulla läget. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga grisar, får, kor, katter och hästar har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet bläckfiskar i en värld har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet fiender i en värld har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet bybor i en värld har uppnåtts. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga vargar har uppnåtts. + + + Det maximala antalet varelsehuvuden i en värld har uppnåtts. + + + Omvänd Y-axel + + + Vänsterhänt + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga höns har uppnåtts. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga svampkor har uppnåtts. + + + Det maximala antalet båtar i en värld har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet höns i en värld har uppnåtts. + + + +{*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*} + + + + {*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*} + + + Återställ Nedervärlden + + + %s har nått världens ände + + + %s har lämnat världens ände + + + +{*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*} + + + 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? + + + Du kan inte använda ägget för tillfället. Det maximala antalet grisar, får, kor, katter och hästar har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet svampkor har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet vargar i en värld har uppnåtts. + + + Återställ Nedervärlden + + + Återställ inte Nedervärlden + + + 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. + + + Du dog! + + + Världsalternativ + + + Kan bygga och bryta block + + + Kan använda dörrar och kopplare + + + Generera strukturer + + + Platt värld + + + Bonuskista + + + Kan öppna behållare + + + Sparka spelare + + + Kan flyga + + + Stäng av utmattning + + + Kan anfalla spelare + + + Kan anfalla djur + + + Moderator + + + Värdprivilegier + + + Instruktioner + + + Kontrollinställningar + + + Inställningar + + + Spawna + + + Erbjudanden på nedladdningsbart innehåll + + + Ändra utseende + + + Medverkande + + + Dynamit exploderar + + + Spelare mot spelare + + + Lita på spelare + + + Installera om innehåll + + + Debuginställningar + + + Eld sprider sig + + + Enderdrake + + + {*PLAYER*} dödades av enderdrakens eld + + + {*PLAYER*} dödades av {*SOURCE*} + + + {*PLAYER*} dödades av {*SOURCE*} + + + {*PLAYER*} dog + + + {*PLAYER*} sprängdes + + + {*PLAYER*} dödades av magi + + + {*PLAYER*} sköts av {*SOURCE*} + + + Berggrundsdimma + + + Visa gränssnittet + + + Visa handen + + + {*PLAYER*} träffades av ett eldklot från {*SOURCE*} + + + {*PLAYER*} mörbultades av {*SOURCE*} + + + {*PLAYER*} dödades av {*SOURCE*} som använde magi + + + {*PLAYER*} föll av världen + + + Texturpaket + + + Kombinationspaket + + + {*PLAYER*} brann upp + + + Teman + + + Spelarbilder + + + Avatarföremål + + + {*PLAYER*} brann ihjäl + + + {*PLAYER*} svalt ihjäl + + + {*PLAYER*} stacks ihjäl + + + {*PLAYER*} träffade backen för hårt + + + {*PLAYER*} försökte sig på att simma i lava + + + {*PLAYER*} kvävdes i en vägg + + + {*PLAYER*} drunknade + + + Dödsmeddelanden + + + Du är inte längre moderator + + + Du kan flyga + + + Du kan inte längre flyga + + + Du kan inte längre anfalla djur + + + Nu kan du anfalla djur + + + Du har blivit till moderator + + + Du blir inte längre utmattad + + + Nu är du odödlig + + + Du är inte längre odödlig + + + %d MSP + + + Nu kan du bli utmattad + + + Nu är du osynlig + + + Du är inte längre osynlig + + + Nu kan du anfalla spelare + + + Nu kan du bryta block och använda föremål + + + Du kan inte längre placera block + + + Nu kan du placera block + + + Animerad spelfigur + + + Anpassad utseendeanimation + + + Du kan inte längre bryta block eller använda föremål + + + Nu kan du använda dörrar och kopplare + + + Du kan inte längre anfalla varelser + + + Nu kan du anfalla varelser + + + Du kan inte längre anfalla spelare + + + Du kan inte längre använda dörrar eller kopplare + + + Nu kan du använda behållare (exempelvis kistor) + + + Du kan inte längre använda behållare (exempelvis kistor) + + + Osynlig + + + 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*} + + + + 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*} + + + + {*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. + + + + {*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. + + + + När den används blir den till en karta över världen du befinner dig i, och fylls i när du utforskar. + + + Tappas av Wither, används vid tillverkning av fyrljus. + + + Trattar + + + {*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*} + + + + Utmatare + + + NOT USED + + + Hälsa direkt + + + Skada direkt + + + Högre hopp + + + Lathet + + + Styrka + + + Svaghet + + + Illamående + + + NOT USED + + + NOT USED + + + NOT USED + + + Regenerering + + + Motstånd + + + Söker frö till världsgeneratorn + + + 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. + + + En sorts räls som kan aktivera eller inaktivera gruvvagnar med trattar och aktivera gruvvagnar med dynamit. + + + 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. + + + Färggranna block som tillverkas genom att färga härdad lera. + + + 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. + + + Används som rödstenskraftkälla. Kan göras om till rödsten igen. + + + Används för att fånga upp föremål eller för att skicka föremål mellan behållare. + + + 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. + + + Fladdermus + + + De här flygande varelserna finns i grottor och i andra stora omslutna områden. + + + Häxa + + + Tillverkas genom att härda lera i en ugn. + + + Tillverkas av glas och färgämne. + + + Tillverkas av målat glas + + + Skickar en rödstenssignal. Signalen blir starkare ju fler föremål står på plattan. + + + Ett block som skickar en rödstenssignal baserad på solljus (eller bristen på solljus). + + + 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. + + + En särskild sorts rustning som kan ges till hästar. Ger 5 rustning. + + + Använd för att bestämma färg, effekt och form på en fyrverkeripjäs. + + + 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. + + + En sorts gruvvagn som fungerar som ett rörligt dynamitblock. + + + En särskild sorts rustning som kan ges till hästar. Ger 7 rustning. + + + Används för att köra kommandon. + + + Skickar upp en stråle av ljus i himlen och kan ge spelare i närheten statuseffekter. + + + 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. + + + En särskild sorts rustning som kan ges till hästar. Ger 11 rustning. + + + Används för att koppla varelser till spelare eller stolpar + + + Används för att namnge varelser i världen. + + + Flitighet + + + Lås upp fullversion + + + Återgå till spelet + + + Spara + + + Spela + + + Rankningslistor + + + Hjälp och alternativ + + + Svårighetsgrad: + + + Spelare mot spelare: + + + Lita på spelare: + + + Dynamit: + + + Speltyp: + + + Strukturer: + + + Nivåtyp: + + + Inga spel hittades + + + Endast inbjudan + + + Fler alternativ + + + Ladda + + + Värdalternativ + + + Spelare/bjud in + + + Onlinespel + + + Ny värld + + + Spelare + + + Anslut till spel + + + Starta + + + Världens namn + + + Frö till världsskaparen + + + Lämna blankt för ett slumpmässigt frö + + + Eld sprider sig: + + + Redigera skylttext: + + + Fyll i uppgifterna som följer med din skärmbild + + + Bildtext + + + Verktygstips + + + Lodrät skärmdelning för 2 spelare + + + Färdig + + + 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*} @@ -281,6 +3789,23 @@ Basingredienserna är:{*B*}{*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*} @@ -291,26 +3816,6 @@ Den faktiska förtrollningen som används väljs slumpmässigt baserat på kostn 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: 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: BLOCKERA VÄRLDAR{*ETW*}{*B*}{*B*} @@ -322,7 +3827,7 @@ Om du försöker att ansluta till den världen i framtiden kommer du att meddela {*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*} + 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*} @@ -339,6 +3844,27 @@ När du laddar eller skapar en värld kan du trycka på knappen "Fler alternativ {*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*} @@ -354,7 +3880,7 @@ Det finns några extraalternativ att välja mellan när nya världar skapas.{*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*} + {*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*} @@ -403,60 +3929,90 @@ Om "Värdprivilegier" är aktiverat kan värdspelaren modifiera vissa privilegie 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. + + + Visste du att det finns en Minecraftwiki? + + + Försök att ignorera buggarna. + + + Smygare är resultatet av en bugg i koden. + + + Är det en höna eller en anka? + + + Mojangs nya kontor är coolt! + + + {*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. + + + {*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. + + + {*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. + + + Minecon 2013 hölls i Orlando, Florida i USA! + + + .party() var grymt! + + + Utgå alltid ifrån att rykten är falska, inte att de är sanna! + Föregående sida - - Grunderna - - - Gränssnittet - - - Inventariet - - - Kistor - - - Tillverkning - - - Ugnar - - - Automater - - - Boskap - - - Avla djur - - - Bryggning - - - Förtrollning - - - Nederportaler - - - Flera spelare - - - Dela skärmbilder - - - Blockera världar - - - Kreativa läget - - - Värd- och spelaralternativ - Byteshandel @@ -466,20 +4022,44 @@ Om "Värdprivilegier" är aktiverat kan värdspelaren modifiera vissa privilegie Världens ände + + Blockera världar + + + Kreativa läget + + + Värd- och spelaralternativ + {*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. +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. +så det är lätt för dem att följa med dig. + + + + {*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*} + + + Gör mer skada än nävarna. + + + 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. Springa @@ -488,304 +4068,240 @@ så det är lätt för dem att följa med dig. Nyheter - {*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*} - + {*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*} - - {*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*} - + + Dela skärmbilder - - Gör mer skada än nävarna. + + Kistor - - 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. + + Tillverkning + + + Ugnar + + + Grunderna + + + Gränssnittet + + + Inventariet + + + Automater + + + Förtrollning + + + Nederportaler + + + Flera spelare + + + Boskap + + + Avla djur + + + Bryggning + + + deadmau5 gillar Minecraft! + + + Grismän anfaller inte dig så länge du inte anfaller dem. + + + Du kan ändra din spawnplats i spelet och hoppa till nästa gryning genom att sova i en säng. + + + Slå tillbaka eldbollarna på spöket! + + + Tillverka facklor för att lysa upp områden när det är mörkt. Monster undviker facklorna. + + + Ta dig till platser snabbare med en gruvvagn och räls! + + + Plantera skott så växer de till träd. + + + Om du bygger en portal kan du resa till en annan dimension: Nedervärlden. + + + Det är aldrig smart att gräva rakt upp eller rakt ned. + + + Benmjöl (som kan tillverkas av skelettben) kan användas som gödningsmedel för att få saker att växa omedelbart! + + + Smygare exploderar när de kommer nära dig! + + + Tryck på{*CONTROLLER_VK_B*} för att släppa vad du håller i! + + + Använd rätt verktyg till jobbet! + + + Om du har svårt att hitta kol till dina facklor kan du tillverka träkol genom att elda träd i en ugn. + + + Du återfår mer hälsa av att äta tillagade fläskkotletter än av råa. + + + Om du spelar på svårighetsgraden "Fridfullt" kommer du automatiskt att återfå hälsa, och inga monster kommer ut på nätterna! + + + 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. + + + Släpp föremål ur inventariet genom att flytta markören utanför menyn och trycka på{*CONTROLLER_VK_A*}. + + + Det finns nytt nedladdningsbart innehåll! Du hittar det i Minecraftbutiken via huvudmenyn. + + + 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. + + + Ändra ljusinställningarna för att göra spelet ljusare eller mörkare. + + + 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. + + + Använd en skyffel för att förbereda marken för grödor. + + + Spindlar anfaller inte under dagen - så länge du inte anfaller dem. + + + Det går snabbare att gräva i jord eller sand med en spade än med händerna! + + + Skaffa fläskkotletter från grisar, tillaga och ät dem sedan för att återfå hälsa. + + + Skaffa läder från kor och använd det för att tillverka rustningar. + + + Om du har en tom hink kan du fylla den med mjölk från en ko, vatten eller lava! + + + Obsidian skapas när vatten nuddar ett lavablock. + + + Nu kan staket byggas ovanpå staket! + + + Vissa djur följer efter dig om du håller vete i handen. + + + Om ett djur inte kan röra sig mer än 20 rutor i någon riktning kommer det inte att laddas ur minnet. + + + Tamvargar visar hur mycket hälsa de har med svansen. Mata dem med kött för att läka dem. + + + Tillaga kaktus i en ugn för att få grön färg. + + + Läs sektionen "Nyheter" i instruktionsmenyn för att se den senaste informationen om spelet. + + + Musik av C418! + + + Vem är Notch? + + + Mojang har fler utmärkelser än anställda! + + + Vissa kändisar spelar Minecraft! + + + Notch har över en miljon följare på Twitter! + + + Det finns faktiskt svenskar som inte är blonda. Vissa, som Jens på Mojang, har till och med rött hår! + + + Förr eller senare kommer spelet att uppdateras! + + + Om du placerar två kistor bredvid varandra skapas en stor kista. + + + Var försiktig om du bygger strukturer av ull ute i det öppna - blixtar kan antända ull. + + + En hink med lava kan användas i en ugn för att smälta hundra block. + + + Vilket instrument ett musikblock spelar avgörs av materialet under blocket. + + + Det kan ta flera minuter innan lava försvinner helt och hållet efter att källblocket har tagits bort. + + + Kullersten står emot spökens eldbollar, vilket gör det användbart som skydd nära portaler. + + + Block som fungerar som ljuskällor (bland annat facklor, glödsten och pumpalyktor) smälter snö och is. + + + Zombier och skelett överlever i dagsljus om de står i vatten. + + + Höns lägger ägg med 5-10 minuters mellanrum. + + + Obsidian kan bara brytas med en diamanthacka. + + + Smygare fungerar som den mest lättillgängliga krutkällan. + + + Om du anfaller en varg kommer alla vargar i närheten att gå till attack mot dig. Zombiefierade grismän beter sig likadant. + + + Vargar kan inte färdas till Nedervärlden. + + + Vargar anfaller inte smygare. Krävs för att bryta stenrelaterade block och malmblock. - - Används för att hugga trärelaterade block snabbare än för hand. - - - Används för att ploga jord- och gräsblock så att man kan plantera grödor i dem. - - - Trädörrar kan öppnas och stängas genom att slå dem, använda dem eller med hjälp av rödsten. - - - Järndörrar kan öppnas och stängas med hjälp av rödsten, knappar och kopplare. - - - NOT USED - - - NOT USED - - - NOT USED - - - NOT USED - - - Ger bäraren 1 i skydd när den bärs. - - - Ger bäraren 3 i skydd när den bärs. - - - Ger bäraren 2 i skydd när den bärs. - - - Ger bäraren 1 i skydd när den bärs. - - - Ger bäraren 2 i skydd när den bärs. - - - Ger bäraren 5 i skydd när den bärs. - - - Ger bäraren 4 i skydd när den bärs. - - - Ger bäraren 1 i skydd när den bärs. - - - Ger bäraren 2 i skydd när den bärs. - - - Ger bäraren 6 i skydd när den bärs. - - - Ger bäraren 5 i skydd när den bärs. - - - Ger bäraren 2 i skydd när den bärs. - - - Ger bäraren 2 i skydd när den bärs. - - - Ger bäraren 5 i skydd när den bärs. - - - Ger bäraren 3 i skydd när den bärs. - - - Ger bäraren 1 i skydd när den bärs. - - - Ger bäraren 3 i skydd när den bärs. - - - Ger bäraren 8 i skydd när den bärs. - - - Ger bäraren 6 i skydd när den bärs. - - - Ger bäraren 3 i skydd när den bärs. - - - 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. - - - 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. - - - 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. - - - Används för kompakta trappor. - - - Används för att göra långa trappor. Två plattor som placeras ovanpå varandra bildar en normalstor dubbelplatta. - - - Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. - - - Används för att skapa och sprida ljus. Facklor smälter även snö och is. - - - Används som byggmaterial och kan användas för att tillverka många olika saker. Kan tillverkas från alla sorters trä. - - - Används som byggmaterial. Påverkas inte av gravitationen, till skillnad från vanlig sand. - - - Används som byggmaterial. - - - Används för att tillverka facklor, pilar, skyltar, stegar, staket och som handtag till verktyg och vapen. - - - 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. - - - Möjliggör tillverkning av fler föremål än vid vanlig tillverkning. - - - Låter dig smälta malm, skapa träkol och glas, samt tillaga fisk och fläskkotletter. - - - Lagrar block och föremål. Placera två kistor bredvid varandra för att skapa en stor kista med dubbelt så mycket utrymme. - - - 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. - - - Används för att klättra upp eller ned. - - - 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. - - - Visar text som du eller andra spelare har skrivit. - - - Används för att skapa starkare ljus än vad facklor producerar. Smälter snö/is och kan användas under vattnet. - - - 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. - - - Används för att hålla en svampstuvning. Du får behålla skålen när du har ätit upp stuvningen. - - - Används för att hålla och transportera vatten, lava och mjölk. - - - Används för att hålla och transportera vatten. - - - Används för att hålla och transportera lava. - - - Används för att hålla och transportera mjölk. - - - Används för att tända eldar och dynamit, och för att öppna färdigbyggda portaler. - - - Används för att fånga fisk. - - - Visar solens och månens position. - - - Pekar mot din startpunkt. - - - 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. - - - Låter dig skjuta pilar för att anfalla på avstånd. - - - Används som ammunition till pilbågar. - - - Återställer 2,5{*ICON_SHANK_01*}. - - - Återställer 1{*ICON_SHANK_01*}. Kan användas sex gånger. - - - Återställer 1{*ICON_SHANK_01*}. - - - Återställer 1{*ICON_SHANK_01*}. - - - Återställer 3{*ICON_SHANK_01*}. - - - Återställer 1{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. Du kan bli sjuk av att äta den. - - - Återställer 3{*ICON_SHANK_01*}. Skapad genom att tillaga en rå kyckling i en ugn. - - - Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. - - - Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en rå biff i en ugn. - - - Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. - - - Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en fläskkotlett i en ugn. - - - Å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. - - - Återställer 2,5{*ICON_SHANK_01*}. Skapad genom att tillaga en rå fisk i en ugn. - - - Återställer 2{*ICON_SHANK_01*}, och kan även göras om till ett guldäpple. - - - Återställer 2{*ICON_SHANK_01*}, och regenererar hälsa i 4 sekunder. Tillverkad med ett äpple och guldtackor. - - - Återställer 2{*ICON_SHANK_01*}. Du kan bli sjuk av att äta det. - Används för att baka tårta och som en ingrediens vid bryggning. @@ -796,18 +4312,18 @@ pumpapaj, brygd för mörkerseende, brygd för osynlighet, nederkvarts, nederkva 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. + + Återställer 2{*ICON_SHANK_01*}, och kan även göras om till ett guldäpple. + + + Återställer 2{*ICON_SHANK_01*}, och regenererar hälsa i 4 sekunder. Tillverkad med ett äpple och guldtackor. + + + Återställer 2{*ICON_SHANK_01*}. Du kan bli sjuk av att äta det. + Används i rödstenskretsar som en förstärkare, fördröjare och/eller som en diod. - - 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. - - - 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. - - - 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. - Används för att leda gruvvagnar. @@ -817,60 +4333,60 @@ Kan även användas för att ge ett svagt ljus. Fungerar som en tryckplatta (skickar en rödstenssignal när den aktiveras) men kan bara aktiveras av en gruvvagn. + + 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. + + + 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. + + + 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. + + + Återställer 2,5{*ICON_SHANK_01*}. Skapad genom att tillaga en rå fisk i en ugn. + + + Återställer 1{*ICON_SHANK_01*}. + + + Återställer 1{*ICON_SHANK_01*}. + + + Återställer 3{*ICON_SHANK_01*}. + + + Används som ammunition till pilbågar. + + + Återställer 2,5{*ICON_SHANK_01*}. + + + Återställer 1{*ICON_SHANK_01*}. Kan användas sex gånger. + + + Återställer 1{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. Du kan bli sjuk av att äta den. + + + Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. + + + Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en fläskkotlett i en ugn. + + + Å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. + + + Återställer 3{*ICON_SHANK_01*}. Skapad genom att tillaga en rå kyckling i en ugn. + + + Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. + + + Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en rå biff i en ugn. + Används för att transportera dig, ett djur eller monster via rälsen. - - Används för att transportera saker via rälsen. - - - Åker på rälsen och kan knuffa andra gruvvagnar när den är laddad med kol. - - - Används för att ta sig fram i vatten snabbare än genom att simma. - - - Skaffas från får och kan färgas med färgämnen. - - - 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. - - - Används för att skapa svart ull. - - - Används för att skapa grön ull. - - - Används för att skapa brun ull, som en ingrediens i kakor och för att odla kakaobönor. - - - Används för att skapa silverfärgad ull. - - - Används för att skapa gul ull. - - - Används för att skapa röd ull. - - - 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. - - - Används för att skapa rosa ull. - - - Används för att skapa orangefärgad ull. - - - Används för att skapa limegrön ull. - - - Används för att skapa grå ull. - - - 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.) - Används för att skapa ljusblå ull. @@ -880,18 +4396,18 @@ Kan även användas för att ge ett svagt ljus. Används för att skapa lila ull. + + Används för att skapa limegrön ull. + + + Används för att skapa grå ull. + + + 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.) + Används för att skapa magentafärgad ull. - - Används för att skapa blå ull. - - - Spelar musikskivor. - - - Används för att tillverka väldigt starka verktyg, vapen och rustningsdelar. - Används för att skapa lyktor som lyser starkare än facklor. Smälter snö/is och kan användas under vatten. @@ -901,1220 +4417,677 @@ Kan även användas för att ge ett svagt ljus. Kan användas för att skapa bokhyllor, eller förtrollas för att skapa förtrollade böcker. - - Kan placeras runtomkring ett förtrollningsbord för att möjliggöra mer kraftfulla förtrollningar. + + Används för att skapa blå ull. - - Används som dekoration. + + Spelar musikskivor. - - Kan brytas med järnhackor eller bättre, och sedan smältas i en ugn för att skapa guldtackor. + + Används för att tillverka väldigt starka verktyg, vapen och rustningsdelar. - - Kan brytas med stenhackor eller bättre, sedan smältas i en ugn för att skapa järntackor. + + Används för att skapa orangefärgad ull. - - Kan brytas med en hacka för att få kol. + + Skaffas från får och kan färgas med färgämnen. - - Kan brytas med en stenhacka eller bättre för att få lasursten. + + 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. - - Kan brytas med en järnhacka eller bättre för att få diamanter. + + Används för att skapa svart ull. - - Kan brytas med en järnhacka eller bättre för att få rödstensstoft. + + Används för att transportera saker via rälsen. - - Kan brytas med en hacka för att få kullersten. + + Åker på rälsen och kan knuffa andra gruvvagnar när den är laddad med kol. - - Grävs med spade. Kan användas som byggmaterial. + + Används för att ta sig fram i vatten snabbare än genom att simma. - - Kan planteras och växer efter en tid till ett träd. + + Används för att skapa grön ull. - - Kan inte brytas. + + Används för att skapa röd ull. - - Antänder allt det vidrör. Kan plockas upp med en hink. + + 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. - - Grävs med spade. Kan smältas till glas i en ugn. Påverkas av gravitation om det inte finns någonting under den. + + Används för att skapa rosa ull. - - 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. + + Används för att skapa brun ull, som en ingrediens i kakor och för att odla kakaobönor. - - Huggs med yxa och kan göras till plankor, eller användas som bränsle. + + Används för att skapa silverfärgad ull. - - 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. + + Används för att skapa gul ull. - - Bryts från sten med en hacka. Kan användas för att bygga en ugn eller stenverktyg. + + Låter dig skjuta pilar för att anfalla på avstånd. - - Bakas med lera i en ugn. + + Ger bäraren 5 i skydd när den bärs. - - Kan härdas till tegelsten i en ugn. + + Ger bäraren 3 i skydd när den bärs. - - Bryts ned till lerbollar som kan härdas till tegelsten i en ugn. + + Ger bäraren 1 i skydd när den bärs. - - Ett kompakt sätt att förvara snöbollar. + + Ger bäraren 5 i skydd när den bärs. - - Kan grävas med spade för att skapa snöbollar. + + Ger bäraren 2 i skydd när den bärs. - - Lämnar ibland efter sig veteax när det slås sönder. + + Ger bäraren 2 i skydd när den bärs. - - Kan göras till ett färgämne. + + Ger bäraren 3 i skydd när den bärs. - - Kan kombineras med en skål för att göra en stuvning. + + 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. - - Kan endast brytas med en diamanthacka. Uppstår när vatten kolliderar med lava, och används vid portalbyggen. + + 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. - - Spawnar monster i världen. + + 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. - - 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. + + Ger bäraren 8 i skydd när den bärs. - - Vete kan skördas från fullvuxna grödor. + + Ger bäraren 6 i skydd när den bärs. - - Mark som har förberetts för frön. + + Ger bäraren 3 i skydd när den bärs. - - Kan tillagas i en ugn för att skapa ett grönt färgämne. + + Ger bäraren 6 i skydd när den bärs. - - Kan göras om till socker. + + Järndörrar kan öppnas och stängas med hjälp av rödsten, knappar och kopplare. - - 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. + + Ger bäraren 1 i skydd när den bärs. - - Brinner i all evighet om den antänds. + + Ger bäraren 3 i skydd när den bärs. - - Gör den, eller det, som går på den långsammare. + + Används för att hugga trärelaterade block snabbare än för hand. - - Att stå i portalen låter dig passera mellan den vanliga världen och Nedervärlden. + + Används för att ploga jord- och gräsblock så att man kan plantera grödor i dem. - - Används som bränsle i ugnar och för att skapa facklor. + + Trädörrar kan öppnas och stängas genom att slå dem, använda dem eller med hjälp av rödsten. - - 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. + + Ger bäraren 2 i skydd när den bärs. - - Hittas genom att döda höns, och kan användas för att tillverka pilar. + + Ger bäraren 4 i skydd när den bärs. - - Hittas genom att döda smygare, och kan användas för att tillverka dynamit. Fungerar även som ingrediens vid bryggning. + + Ger bäraren 1 i skydd när den bärs. - - Kan planteras på åkrar för att odla grödor. Se till att det finns tillräckligt med ljus! + + Ger bäraren 2 i skydd när den bärs. - - Skördas från grödor, och kan användas för att laga vissa maträtter. + + Ger bäraren 1 i skydd när den bärs. - - Hittas genom att gräva i grus, och kan användas för att tillverka tändstål. + + Ger bäraren 2 i skydd när den bärs. - - 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. + + Ger bäraren 5 i skydd när den bärs. - - Skaffas genom att gräva i snö, och kan kastas. + + Används för kompakta trappor. - - Hittas genom att döda kor, och kan bearbetas till rustningsdelar eller användas för att tillverka böcker. + + Används för att hålla en svampstuvning. Du får behålla skålen när du har ätit upp stuvningen. - - Hittas genom att döda slemkuber, och kan användas vid bryggning eller för att tillverka klibbiga kolvar. + + Används för att hålla och transportera vatten, lava och mjölk. - - Läggs slumpmässigt av höns, och kan användas för att laga vissa maträtter. + + Används för att hålla och transportera vatten. - - 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. + + Visar text som du eller andra spelare har skrivit. - - Hittas genom att döda skelett. Kan göras om till benmjöl. Kan ges till en varg för att tämja den. + + Används för att skapa starkare ljus än vad facklor producerar. Smälter snö/is och kan användas under vattnet. - - Skaffas genom att få ett skelett att döda en smygare. Kan spelas i en jukebox. + + 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. - - Släcker eldar och gör att grödor växer snabbare. Kan plockas upp i en hink. + + Används för att hålla och transportera lava. - - Släpper ibland skott när de går sönder. Skotten kan planteras om för att odla nya träd. + + Visar solens och månens position. - - Hittas i grottor, och kan användas som byggmaterial eller dekoration. + + Pekar mot din startpunkt. - - Används för att klippa ull från får och för att skörda lövblock. + + 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. - - 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. + + Används för att hålla och transportera mjölk. - - 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. + + Används för att tända eldar och dynamit, och för att öppna färdigbyggda portaler. - - Tillverkas med stenblock och återfinns ofta i fästningar. + + Används för att fånga fisk. - - Används som en barriär, precis som staket. + + 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. - - Liknar en dörr, men används primärt tillsammans med staket. + + Används som byggmaterial och kan användas för att tillverka många olika saker. Kan tillverkas från alla sorters trä. - - Kan tillverkas med melonskivor. + + Används som byggmaterial. Påverkas inte av gravitationen, till skillnad från vanlig sand. - - Genomskinliga block som kan användas som ett alternativ till glasblock. + + Används som byggmaterial. - - Kan planteras för att odla pumpor. + + Används för att göra långa trappor. Två plattor som placeras ovanpå varandra bildar en normalstor dubbelplatta. - - 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 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. - - - Växer med tiden när de placeras ut. Kan klippas med sax. Kan klättras, precis som en stege. - - - 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. - - - 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. - - - Har olika effekter beroende på vad den används på. - - - 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. - - - 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 regnvatten eller med en hink, och kan sedan användas för att fylla glasflaskor med vatten. - - - 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å. - - - 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. - - - Hittas i fästningar i Nedervärlden. Släpper nedervårtor när de går sönder. - - - 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. - - - 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. - - - 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å. - - - 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. - - Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + Används för att skapa och sprida ljus. Facklor smälter även snö och is. - - Skapas genom att smälta nedersten i en ugn. Kan användas för att tillverka nedermursten. + + Används för att tillverka facklor, pilar, skyltar, stegar, staket och som handtag till verktyg och vapen. - - Lyser när de får ström. + + Lagrar block och föremål. Placera två kistor bredvid varandra för att skapa en stor kista med dubbelt så mycket utrymme. - - Kan odlas för att få kakaobönor. + + 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. - - Varelsehuvuden kan placeras som dekorationer eller bäras som masker genom att bära dem som hjälmar. + + Används för att klättra upp eller ned. - - Bläckfisk + + 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. - - Släpper en bläcksäck när den dödas. + + Möjliggör tillverkning av fler föremål än vid vanlig tillverkning. - - Ko - - - Släpper läder när den dödas. Kan mjölkas med en hink. - - - Får - - - 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. - - - Höna - - - Släpper fjädrar när den dödas, kan även lägga ägg slumpmässigt. - - - Gris - - - 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. - - - Smygare - - - Exploderar om du kommer för nära! - - - Skelett - - - Skjuter pilar på dig. Släpper pilar när det dödas. - - - 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 - - - Anfaller om du kommer nära. - - - Zombiefierad grisman - - - Vanligtvis fridfull, men anfaller i grupp om du anfaller en av dem. - - - Spöke - - - Skjuter eldklot som exploderar vid kontakt. - - - Slemkub - - - Delas upp i mindre slemkuber när den skadas. - - - Enderman - - - 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. - - - Grottspindel - - - Har ett giftigt bett. - - - Svampko - - - Producerar en svampstuvning om du använder en skål på den. Släpper svampar och blir till en normal ko om den klipps. - - - 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 - - - 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. - - - Magmakub - - - Finns i Nedervärlden. De bryts ned till mindre versioner när de angrips, precis som slemkuber. - - - Bybo - - - Ozelot - - - 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. - - - Explosives Animator - - - Concept Artist - - - Number Crunching and Statistics - - - Bully Coordinator - - - Original Design and Code by - - - Project Manager/Producer - - - Rest of Mojang Office - - - Lead Game Programmer Minecraft PC - - - Ninja Coder - - - CEO - - - White Collar Worker - - - Customer Support - - - Office DJ - - - Designer/Programmer Minecraft - Pocket Edition - - - Developer - - - Chief Architect - - - Art Developer - - - Game Crafter - - - Director of Fun - - - Music and Sounds - - - Programming - - - Art - - - QA - - - Executive Producer - - - Lead Producer - - - Producer - - - Test Lead - - - Lead Tester - - - Design Team - - - Development Team - - - Release Management - - - Director, XBLA Publishing - - - Business Development - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Träsvärd - - - Stensvärd - - - Järnsvärd - - - Diamantsvärd - - - Guldsvärd - - - Träspade - - - Stenspade - - - Järnspade - - - Diamantspade - - - Guldspade - - - Trähacka - - - Stenhacka - - - Järnhacka - - - Diamanthacka - - - Guldhacka - - - Träyxa - - - Stenyxa + + Låter dig smälta malm, skapa träkol och glas, samt tillaga fisk och fläskkotletter. Järnyxa - - Diamantyxa + + Rödstensbelysning - - Guldyxa + + Djungelträtrappor - - Träskyffel + + Björktrappor - - Stenskyffel + + Nuvarande kontrollinställningar - - Järnskyffel - - - Diamantskyffel - - - Guldskyffel - - - Trädörr - - - Järndörr - - - Ringbrynjehuva - - - Ringbrynja - - - Ringbrynjebyxor - - - Ringbrynjestövlar - - - Läderhuva - - - Järnhjälm - - - Diamanthjälm - - - Guldhjälm - - - Lädertunika - - - Järnharnesk - - - Diamantharnesk - - - Guldharnesk - - - Läderbyxor - - - Järnskenor - - - Diamantskenor - - - Guldskenor - - - Läderstövlar - - - Järnstövlar - - - Diamantstövlar - - - Guldstövlar - - - Järntacka - - - Guldtacka - - - Hink - - - Vattenhink - - - Lavahink - - - Tändstål - - - Äpple - - - Pilbåge - - - Pil - - - Kol - - - Träkol - - - Diamant - - - Stav - - - Skål - - - Svampstuvning - - - Tråd - - - Fjäder - - - Krut - - - Veteax - - - Vete - - - Bröd - - - Flintsten - - - Rå fläskkotlett - - - Tillagad fläskkotlett - - - Tavla - - - Guldäpple - - - Skylt - - - Gruvvagn - - - Sadel - - - Rödsten - - - Snöboll - - - Båt - - - Läder - - - Mjölkhink - - - Tegelsten - - - Lera - - - Sockerrör - - - Papper - - - Bok - - - Slemklump - - - Gruvvagn med kista - - - Gruvvagn med ugn - - - Ägg - - - Kompass - - - Fiskespö - - - Klocka - - - Glödstensstoft - - - Rå fisk - - - Tillagad fisk - - - Färgämne - - - Bläcksäck - - - Rosenröd - - - Kaktusgrön - - - Kakaobönor - - - Lasursten - - - Lila färg - - - Cyanfärg - - - Ljusgrå färg - - - Grå färg - - - Rosa färg - - - Limegrön färg - - - Maskrosgul färg - - - Ljusblå färg - - - Magentafärg - - - Orange färg - - - Benmjöl - - - Ben - - - Socker - - - Tårta - - - Säng - - - Rödstensförstärkare - - - Kaka - - - Karta - - - Musikskiva - "13" - - - Musikskiva - "cat" - - - Musikskiva - "blocks" - - - Musikskiva - "chirp" - - - Musikskiva - "far" - - - Musikskiva - "mall" - - - Musikskiva - "mellohi" - - - Musikskiva - "stal" - - - Musikskiva - "strad" - - - Musikskiva - "ward" - - - Musikskiva - "11" - - - Musikskiva - "where are we now" - - - Sax - - - Pumpafrön - - - Melonfrön - - - Rå kyckling - - - Tillagad kyckling - - - Rått nötkött - - - Biffstek - - - Ruttet kött - - - Enderpärla - - - Melonskiva - - - Brännstav - - - Spöktår - - - Guldklimp - - - Nedervårta - - - {*prefix*}Brygd{*postfix*}{*splash*} - - - Glasflaska - - - Vattenflaska - - - Spindelöga - - - Fermenterat spindelöga - - - Brännpulver - - - Magmasalva - - - Brygdställ - - - Kittel - - - Enderöga - - - Glimmande melon - - - Förtrollningsflaska - - - Eldladdning - - - Eldladdning (träkol) - - - Eldladdning (kol) - - - Uppvisningsbox - - - Spawna {*CREATURE*} - - - Nedermursten - - + Dödskalle - - Skelettskalle + + Kakao - - Witherskelettskalle + + Grantrappor - - Zombiehuvud + + Drakägg - - Huvud + + Endersten - - Huvud från %s + + Ram för portal till världens ände - - Smygarhuvud + + Sandstenstrappor - - Sten + + Ormbunke - - Gräsblock + + Buske - - Jord + + Layout - - Kullersten + + Tillverkning - - Ekträplankor + + Använd - - Granträplankor + + Handling - - Björkträplankor + + Smyg/flyg gned - - Djungelträplankor + + Smyg - - Skott + + Släpp - - Ekskott + + Byt föremål i handen - - Granskott + + Pausa - - Björkskott + + Titta - - Djungelträdskott + + Gå/spring - - Berggrund + + Inventarie - - Vatten + + Hoppa/flyg upp - - Lava + + Hoppa - - Sand + + Portal till världens ände - - Sandsten + + Pumpastjälk - - Grus + + Melon - - Guldmalm + + Glasskiva - - Järnmalm + + Grind - - Kolmalm + + Rankor - - Trä + + Melonstjälk - - Ekträ + + Järnstänger - - Granträ + + Sprucken mursten - - Björkträ + + Mossig mursten - - Djungelträ + + Mursten + + + Svamp + + + Svamp + + + Mejslad mursten + + + Tegeltrappor + + + Nedervårta + + + Nedertrappor + + + Nederstängsel + + + Kittel + + + Brygdställ + + + Förtrollningsbord + + + Nedermursten + + + Silverfiskkullersten + + + Silverfisksten + + + Murstenstrappor + + + Näckros + + + Mycel + + + Silverfiskmursten + + + Byt kameraläge + + + 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. + + + 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. + + + Förr eller senare kommer du att fylla ditt inventarie.{*B*} + Tryck på{*CONTROLLER_ACTION_INVENTORY*} för att öppna inventariet. + + + Det trä som du har samlat in kan göras till plankor. Öppna tillverkningsgränssnittet för att tillverka dem.{*PlanksIcon*} + + + 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*} + + + 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. + + + Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet. + + + 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. + + + Använd{*CONTROLLER_ACTION_MOVE*} för att röra dig. + + + Använd{*CONTROLLER_ACTION_LOOK*} för att se dig omkring. + + + 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. + + + 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. + + + Tryck på{*CONTROLLER_ACTION_JUMP*} för att hoppa. + + + 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*} + + + + 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. + + + + Öppna behållaren. + + + 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*} + + + 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 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. + + + + + I närheten finns en gruvarbetares övergivna skydd. Du kan reparera det för att vara trygg hela natten. + + + + 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*} + + + 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. + + + Använd{*CONTROLLER_ACTION_LEFT_SCROLL*} och{*CONTROLLER_ACTION_RIGHT_SCROLL*} för att byta vad du håller i. + + + 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*} + + + 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*} + + + Peka hårkorset på arbetsbänken och tryck på{*CONTROLLER_ACTION_USE*} för att använda den. + + + 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. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + Layout 1 + + + Förflyttning (när du flyger) + + + Spelare/bjud in + + + + + + Layout 3 + + + Layout 2 + + + + + + + + + + + + + + + {*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. + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. + + + + + + + + + + + + + + + + + + + + + + + + + + + Silverfiskblock + + + Stenplatta + + + Ett kompakt sätt att förvara järn. + + + Järnblock + + + Ekplatta + + + Sandstensplatta + + + Stenplatta + + + Ett kompakt sätt att förvara guld. + + + Blomma + + + Vit ull + + + Orange ull + + + Guldblock + + + Svamp + + + Ros + + + Kullerstensplatta + + + Bokhylla + + + Dynamit + + + Tegelsten + + + Fackla + + + Obsidian + + + Mossten + + + Nedermurstensplatta + + + Ekplatta + + + Murstensplatta + + + Tegelstensplatta + + + Djungelträplatta + + + Björkplatta + + + Granplatta + + + Magentafärgad ull + + + Björklöv + + + Granbarr + + + Eklöv + + + Glas + + + Svamp + + + Djungellöv + + + Löv Ek @@ -2125,690 +5098,697 @@ Kan även användas för att ge ett svagt ljus. Björk - - Löv + + Granträ - - Eklöv + + Björkträ - - Granbarr - - - Björklöv - - - Djungellöv - - - Svamp - - - Glas + + Djungelträ Ull - - Svart ull - - - Röd ull - - - Grön ull - - - Brun ull - - - Blå ull - - - Lila ull - - - Cyanfärgad ull - - - Ljusgrå ull + + Rosa ull Grå ull - - Rosa ull - - - Limegrön ull - - - Gul ull + + Ljusgrå ull Ljusblå ull - - Magentafärgad ull + + Gul ull - - Orange ull + + Limegrön ull - - Vit ull + + Cyanfärgad ull - - Blomma + + Grön ull - - Ros + + Röd ull - - Svamp + + Svart ull - - Guldblock + + Lila ull - - Ett kompakt sätt att förvara guld. + + Blå ull - - Järnblock - - - Ett kompakt sätt att förvara järn. - - - Stenplatta - - - Stenplatta - - - Sandstensplatta - - - Ekplatta - - - Kullerstensplatta - - - Tegelstensplatta - - - Murstensplatta - - - Ekplatta - - - Granplatta - - - Björkplatta - - - Djungelträplatta - - - Nedermurstensplatta - - - Tegelsten - - - Dynamit - - - Bokhylla - - - Mossten - - - Obsidian - - - Fackla + + Brun ull Fackla (kol) - - Fackla (träkol) - - - Eld - - - Monsterspawnare - - - Ektrappor - - - Kista - - - Rödstensstoft - - - Diamantmalm - - - Diamantblock - - - Ett kompakt sätt att förvara diamanter. - - - Arbetsbänk - - - Grödor - - - Åkermark - - - Ugn - - - Skylt - - - Trädörr - - - Stege - - - Räls - - - Rödstensräls - - - Sensorräls - - - Stentrappor - - - Spak - - - Tryckplatta - - - Järndörr - - - Rödstensmalm - - - Rödstensfackla - - - Knapp - - - Snö - - - Is - - - Kaktus - - - Lera - - - Sockerrör - - - Jukebox - - - Staket - - - Pumpa - - - Pumpalykta - - - Nedersten + + Glödsten Själsand - - Glödsten - - - Portal - - - Lasurstensmalm + + Nedersten Lasurstensblock + + Lasurstensmalm + + + Portal + + + Pumpalykta + + + Sockerrör + + + Lera + + + Kaktus + + + Pumpa + + + Staket + + + Jukebox + Ett kompakt sätt att förvara lasursten. - - Automat - - - Musikblock - - - Tårta - - - Säng - - - Nät - - - Högt gräs - - - Död buske - - - Diod - - - Låst kista - Fallucka - - Ull (vilken färg som helst) + + Låst kista - - Kolv + + Diod Klibbig kolv - - Silverfiskblock + + Kolv - - Mursten + + Ull (vilken färg som helst) - - Mossig mursten + + Död buske - - Sprucken mursten + + Tårta - - Mejslad mursten + + Musikblock - - Svamp + + Automat - - Svamp + + Högt gräs - - Järnstänger + + Nät - - Glasskiva + + Säng - - Melon + + Is - - Pumpastjälk + + Arbetsbänk - - Melonstjälk + + Ett kompakt sätt att förvara diamanter. - - Rankor + + Diamantblock - - Grind + + Ugn - - Tegeltrappor + + Åkermark - - Murstenstrappor + + Grödor - - Silverfisksten + + Diamantmalm - - Silverfiskkullersten + + Monsterspawnare - - Silverfiskmursten + + Eld - - Mycel + + Fackla (träkol) - - Näckros + + Rödstensstoft - - Nedermursten + + Kista - - Nederstängsel + + Ektrappor - - Nedertrappor + + Skylt - - Nedervårta + + Rödstensmalm - - Förtrollningsbord + + Järndörr - - Brygdställ + + Tryckplatta - - Kittel + + Snö - - Portal till världens ände + + Knapp - - Ram för portal till världens ände + + Rödstensfackla - - Endersten + + Spak - - Drakägg + + Räls - - Buske + + Stege - - Ormbunke + + Trädörr - - Sandstenstrappor + + Stentrappor - - Grantrappor + + Sensorräls - - Björktrappor - - - Djungelträtrappor - - - Rödstensbelysning - - - Kakao - - - Dödskalle - - - Nuvarande kontrollinställningar - - - Layout - - - Gå/spring - - - Titta - - - Pausa - - - Hoppa - - - Hoppa/flyg upp - - - Inventarie - - - Byt föremål i handen - - - Handling - - - Använd - - - Tillverkning - - - Släpp - - - Smyg - - - Smyg/flyg gned - - - Byt kameraläge - - - Spelare/bjud in - - - Förflyttning (när du flyger) - - - Layout 1 - - - Layout 2 - - - Layout 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;]]> - - - <![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*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. - - - {*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. - - - 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. - - - Använd{*CONTROLLER_ACTION_LOOK*} för att se dig omkring. - - - Använd{*CONTROLLER_ACTION_MOVE*} för att röra dig. - - - 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. - - - Tryck på{*CONTROLLER_ACTION_JUMP*} för att hoppa. - - - 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. - - - 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 på{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet. - - - Förr eller senare kommer du att fylla ditt inventarie.{*B*} - Tryck på{*CONTROLLER_ACTION_INVENTORY*} för att öppna inventariet. - - - 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. - - - 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. - - - 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. - - - 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*} - - - Det trä som du har samlat in kan göras till plankor. Öppna tillverkningsgränssnittet för att tillverka dem.{*PlanksIcon*} - - - 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*} - - - 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änd{*CONTROLLER_ACTION_LEFT_SCROLL*} och{*CONTROLLER_ACTION_RIGHT_SCROLL*} för att byta vad du håller i. - - - 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. - - - 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. - - - Peka hårkorset på arbetsbänken och tryck på{*CONTROLLER_ACTION_USE*} för att använda den. - - - 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*} - - - 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*} - - - 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*} - - - Öppna behållaren. - - - - 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. - - - - - I närheten finns en gruvarbetares övergivna skydd. Du kan reparera det för att vara trygg hela natten. - - - - - 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. - - - - 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*} + + Rödstensräls Du har samlat tillräckligt mycket kullersten för att bygga en ugn. Använd din arbetsbänk för att bygga en. - - Använd{*CONTROLLER_ACTION_USE*} för att placera ut ugnen i världen, öppna den sedan. + + Fiskespö - - 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. + + Klocka - - 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. + + Glödstensstoft - - 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*} + + Gruvvagn med ugn - - 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. + + Ägg - - 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*} + + Kompass - + + Rå fisk + + + Rosenröd + + + Kaktusgrön + + + Kakaobönor + + + Tillagad fisk + + + Färgämne + + + Bläcksäck + + + Gruvvagn med kista + + + Snöboll + + + Båt + + + Läder + + + Gruvvagn + + + Sadel + + + Rödsten + + + Mjölkhink + + + Papper + + + Bok + + + Slemklump + + + Tegelsten + + + Lera + + + Sockerrör + + + Lasursten + + + Karta + + + Musikskiva - "13" + + + Musikskiva - "cat" + + + Säng + + + Rödstensförstärkare + + + Kaka + + + Musikskiva - "blocks" + + + Musikskiva - "mellohi" + + + Musikskiva - "stal" + + + Musikskiva - "strad" + + + Musikskiva - "chirp" + + + Musikskiva - "far" + + + Musikskiva - "mall" + + + Tårta + + + Grå färg + + + Rosa färg + + + Limegrön färg + + + Lila färg + + + Cyanfärg + + + Ljusgrå färg + + + Maskrosgul färg + + + Benmjöl + + + Ben + + + Socker + + + Ljusblå färg + + + Magentafärg + + + Orange färg + + + Skylt + + + Lädertunika + + + Järnharnesk + + + Diamantharnesk + + + Järnhjälm + + + Diamanthjälm + + + Guldhjälm + + + Guldharnesk + + + Guldskenor + + + Läderstövlar + + + Järnstövlar + + + Läderbyxor + + + Järnskenor + + + Diamantskenor + + + Läderhuva + + + Stenskyffel + + + Järnskyffel + + + Diamantskyffel + + + Diamantyxa + + + Guldyxa + + + Träskyffel + + + Guldskyffel + + + Ringbrynja + + + Ringbrynjebyxor + + + Ringbrynjestövlar + + + Trädörr + + + Järndörr + + + Ringbrynjehuva + + + Diamantstövlar + + + Fjäder + + + Krut + + + Veteax + + + Skål + + + Svampstuvning + + + Tråd + + + Vete + + + Tillagad fläskkotlett + + + Tavla + + + Guldäpple + + + Bröd + + + Flintsten + + + Rå fläskkotlett + + + Stav + + + Hink + + + Vattenhink + + + Lavahink + + + Guldstövlar + + + Järntacka + + + Guldtacka + + + Tändstål + + + Kol + + + Träkol + + + Diamant + + + Äpple + + + Pilbåge + + + Pil + + + Musikskiva - "ward" + + - Du har klarat av den första delen av övningen. + 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*} + + + + + 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*} + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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*} + + + + 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*} + + + + 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. + + + + + 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. + + + + + 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. + + + + + Resurserna som krävs för att tillverka föremålet listas nu. + + + + + Beskrivningen av det valda föremålet visas nu. Beskrivningen kan ge dig tips om hur föremålet kan användas. + + + + + 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. + + + + + Vissa saker kan inte tillverkas på en arbetsbänk, utan kräver en ugn. Tillverka en ugn nu.{*FurnaceIcon*} + + + + Grus + + + Guldmalm + + + Järnmalm + + + Lava + + + Sand + + + Sandsten + + + Kolmalm + + + {*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. + + + + + 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. + + + + + 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. + + + + Trä + + + Ekträ + + + + 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. + + + + {*B*} + Tryck på{*CONTROLLER_VK_X*} för att visa inventariet igen. + + + + {*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. + + + + + 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. @@ -2818,21 +5798,9 @@ På natten kommer monster ut - se till att bygga skydd innan det händer. - + - 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. - - - - {*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. - - - - - 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. + 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. @@ -2841,56 +5809,43 @@ På natten kommer monster ut - se till att bygga skydd innan det händer. - + - 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. + 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. + + + Du har klarat av den första delen av övningen. + + + + 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. + + + 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. + + + Använd{*CONTROLLER_ACTION_USE*} för att placera ut ugnen i världen, öppna den sedan. + + + 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*} + + + 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. + + + 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*} + - 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*}. + 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*}. - + - Tryck på{*CONTROLLER_VK_B*} nu för att stänga inventariet. - - - - - 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. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - För mer information om ett föremål, för markören över det och tryck på{*CONTROLLER_VK_BACK*}. + Det här är tillverkningsgränssnittet. Det låter dig kombinera dina resurser för att tillverka nya saker. @@ -2898,9 +5853,19 @@ På natten kommer monster ut - se till att bygga skydd innan det händer. - + - Det här är tillverkningsgränssnittet. Det låter dig kombinera dina resurser för att tillverka nya saker. + För mer information om ett föremål, för markören över det och tryck på{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + {*B*} + Tryck på{*CONTROLLER_VK_X*} för att visa vad som behövs för att tillverka det markerade föremålet. + + + + {*B*} + Tryck på{*CONTROLLER_VK_X*} för att visa en beskrivning. @@ -2909,2292 +5874,243 @@ På natten kommer monster ut - se till att bygga skydd innan det händer. - - {*B*} - Tryck på{*CONTROLLER_VK_X*} för att visa en beskrivning. - - - - {*B*} - Tryck på{*CONTROLLER_VK_X*} för att visa vad som behövs för att tillverka det markerade föremålet. - - - - {*B*} - Tryck på{*CONTROLLER_VK_X*} för att visa inventariet igen. - - - + - 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. + 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. - - - 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. - - - - - 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. - - - - - 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. - - - - - Beskrivningen av det valda föremålet visas nu. Beskrivningen kan ge dig tips om hur föremålet kan användas. - - - - - Resurserna som krävs för att tillverka föremålet listas nu. - - - - 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*} - - - - 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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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. - - - - - Vissa saker kan inte tillverkas på en arbetsbänk, utan kräver en ugn. Tillverka en ugn nu.{*FurnaceIcon*} - - - - - 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. - - - - - 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. - - - + {*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. + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder det kreativa lägets inventarie. - + - 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. + 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. - + - 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. + Tryck på{*CONTROLLER_VK_B*} nu för att stänga inventariet. - + - 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. + 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. - + - 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. + 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. - + - Träkol kan användas som bränsle, eller användas i kombination med en stav för att tillverka en fackla. + 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. - - - Om du använder sand som resurs kan du tillverka glas. Tillverka några glasblock att använda som fönster i ditt skydd. - - - - - Det här är bryggningsgränssnittet. Du kan använda det för att skapa brygder med många olika effekter. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Skapa en brygd för eldmotstånd genom att först tillsätta en nedervårta i en vattenflaska, och sedan tillsätta magmasalva. - - - - - Tryck på{*CONTROLLER_VK_B*} nu för att lämna brygdgränssnittet. - - - - - I det här området finns ett brygdställ, en kittel och en kista full med brygdingredienser. - - - - {*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. - - - - - Första steget när man brygger en brygd är att skapa en vattenflaska. Ta en glasflaska från kistan. - - - - - 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*}. - - - - - Om kitteln blir tom kan du fylla den med en vattenhink. - - - - - Använd brygdstället för att brygga en brygd för eldmotstånd. Du behöver en vattenflaska, en nedervårta och magmasalva. - - - - - 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. - - - - - Använd din brygd för eldmotstånd på dig själv. - - - - - 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. - - - - - Det här är förtrollningsgränssnittet. Du kan använda det för att förtrolla vapen, rustningsdelar och vissa verktyg. - - - - {*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. - - - - - 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. - - - - - När ett föremål har placerats i förtrollningsrutan kommer knapparna till höger att visa ett antal slumpmässiga förtrollningar. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - {*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. - - - - - 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. - - - - - Om du ställer bokhyllor runt förtrollningsbordet får det mer kraft, och då kan du använda bättre förtrollningar. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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*} - - - - {*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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - {*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. - - - - - 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*} - - - - - Nu använder du ett fiskespö. Tryck på{*CONTROLLER_ACTION_USE*} för att använda det.{*FishingRodIcon*} - - - - - {*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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - {*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. - - - - - 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*} - - - - - Om du spelar tillsammans med andra spelare måste alla gå och lägga sig samtidigt för att kunna sova. - {*ICON*}355{*/ICON*} - - - - - 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. - - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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*} - - - - - 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*} - - - - - 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*} - - - - - 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. - - - - - I det här området finns en portal till Nedervärlden! - - - - - {*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. - - - - - Portaler skapas genom att bygga en ram som är fyra block bred och fem block hög av obsidianblock. Hörnblocken behövs inte. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Nu befinner du dig i det kreativa läget. - - - - - {*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. - - - - 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. - - - Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna det kreativa lägets inventariegränssnitt. - - - Ta dig till andra sidan av det här hålet för att fortsätta. - - - Nu har du klarat det kreativa lägets övning. - - - - 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. - - - - - {*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. - - - - 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. - - - 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. - - - 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*} - - - 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. - - - 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*} - - - 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*} - - - Svampar ska planteras i dunkla miljöer och sprider sig till närliggande block med dunkelt ljus.{*ICON*}39{*/ICON*} - - - 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*} - - - Nu har du klarat övningen om hur man skördar. - - - - I det här området finns en inhägnad med djur. Du kan avla djur för att skaffa bebisversioner av djuren. - - - - - {*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. - - - - För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga. - - - 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. - - - 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. - - - Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter. - - - 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*} - - - - 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. - - - - Nu har du klarat övningen om djur och avel. - - - - I det här området finns några pumpor och block som låter dig bygga en snö- eller järngolem. - - - - - {*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. - - - - Du bygger en golem genom att placera en pumpa på en hög med block. - - - En snögolem består av en stapel med två snöblock och en pumpa ovanpå. De kastar snöbollar på dina fiender. - - - 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. - - - Vissa byar har en järngolem som skyddar byborna. Om du anfaller dem går den till angrepp. - - - Du kan inte lämna det här området innan du är klar med övningen. - - - Olika verktyg passar till olika material. Använd en spade för att gräva i mjuka material som jord och sand. - - - Olika verktyg passar till olika material. Använd en yxa för att hugga trädstammar. - - - 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. - - - Vissa verktyg är bättre lämpade att anfalla fiender med. Du bör använda ett svärd när du anfaller. - - - 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. - - - 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. - - - Håll in{*CONTROLLER_ACTION_JUMP*} för att simma upp. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - - 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! - - - - {*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. - - - Påminnelse: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Nya funktioner har lagts till i den senaste versionen, bland annat nya områden i övningsvärlden. - - - {*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. - - - I det här området finns platser där du kan lära dig om fiske, båtar, kolvar och rödsten. - - - 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! - - - - Din hungermätare ligger på en nivå där du inte längre återfår hälsa. - - - - - {*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. - - - - Välj - - - Använd - - - Tillbaka - - - Stäng - - - Avbryt - - - Avbryt anslutningen - - - Uppdatera spellistan - - - Festspel - - - Alla spel - - - Byt grupp - - - Visa inventariet - - - Visa beskrivning - - - Visa ingredienser - - - Tillverkning - - - Tillverka - - - Plocka upp/placera - - - Plocka upp - - - Plocka upp alla - - - Plocka upp hälften - - - Placera - - - Placera alla - - - Placera en - - - Släpp - - - Släpp alla - - - Släpp en - - - Byt grupp - - - Snabbval - - - Rensa snabbval - - - Vad är det här? - - - Dela på Facebook - - - Byt filter - - - Skicka vänförfrågan - - - Sida ned - - - Sida upp - - - Nästa - - - Föregående - - - Sparka spelare - - - Färga - - - Bryt - - - Mata - - - Tämj - - - Läk - - - Sitt - - - Följ mig - - - Skjut ut - - - Töm - - - Rid - - - Placera - - - Slå - - - Mjölka - - - Plocka upp - - - Ät - - - Sov - - - Vakna - - - Spela - - - Rid - - - Segla - - - Odla - - - Simma upp - - - Öppna - - - Byt tonart - - - Detonera - - - Läs - - - Häng - - - Kasta - - - Plantera - - - Plöj - - - Skörda - - - Fortsätt - - - Lås upp fullständiga spelet - - - Radera sparfil - - - Radera - - - Alternativ - - - Bjud in vänner - - - Acceptera - - - Klipp - - - Blockera värld - - - Välj utseende - - - Antänd - - - Navigera - - - Installera fullständiga versionen - - - Installera demo - - - Installera - - - Ominstallera - - - Sparalt. - - - Verkställ kommando - - - Kreativt - - - Flytta ingrediens - - - Flytta bränsle - - - Flytta verktyg - - - Flytta rustningsdel - - - Flytta vapen - - - Välj - - - Dra - - - Släpp - - - Privilegier - - - Blockera - - - Sida upp - - - Sida ned - - - Brunstig - - - Drick - - - Rotera - - - Dölj - - - Töm alla platser - - - OK - - - Avbryt - - - Minecraftbutiken - - - Vill du lämna det pågående spelet och ansluta till det nya? Osparade framsteg kommer att gå förlorade. - - - Avsluta - - - Spara spelet - - - Avsluta utan att spara - - - Vill du skriva över den befintliga sparfilen för den här världen med den nuvarande versionen av den här världen? - - - Vill du avsluta utan att spara? Du kommer att förlora alla framsteg i den här världen! - - - Starta spelet - - - Skadad sparfil - - - Den här sparfilen är korrupt eller skadad. Vill du radera den? - - - Vill du avsluta till huvudmenyn och koppla ifrån alla spelare från spelet? Alla osparade framsteg kommer att gå förlorade. - - - Avsluta och spara - - - Avsluta utan att spara - - - Vill du avsluta till huvudmenyn? Alla osparade framsteg kommer att gå förlorade. - - - Vill du avsluta till huvudmenyn? Dina framsteg kommer att gå förlorade! - - - Skapa ny värld - - - Spela övningen - - - Övning - - - Döp din värld - - - Ge din värld ett namn - - - Ange ett frö som lägger grunden för din värld - - - Ladda sparad värld - - - Tryck START för att ansluta - - - Avslutar spelet - - - Ett fel uppstod. Avslutar till huvudmenyn. - - - Anslutningen misslyckades - - - Anslutningen tappades - - - Anslutningen till servern bröts. Avslutar till huvudmenyn. - - - Kopplades ned av servern - - - Du sparkades från spelet - - - Du sparkades från spelet för att du flög - - - Anslutningsförsöket tog för lång tid - - - Servern är full - - - Värden har lämnat spelet. - - - Du kan inte ansluta till det här spelet. Ingen av spelarna är dina vänner. - - - Du kan inte ansluta till det här spelet. Värden har sparkat dig förut. - - - 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. - - - 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. - - - Ny värld - - - 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: - - - Vänner - - - Min poäng - - - Totalt - - - Poster: - - - Rang - - - Förbereder att spara världen - - - Förbereder segment ... - - - Slutställer ... - - - Genererar terräng - - - Simulerar världen lite grand - - - Startar server - - - 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 - - - Laddar ned terräng - - - Växlar till offlinespel - - - Vänta medan värden sparar spelet - - - Färdas till världens ände - - - Lämnar världens ände - - - Den här sängen används redan - - - Du kan bara sova på natten - - - %s sover i en säng. För att hoppa till nästa morgon måste alla spelare sova i sängar samtidigt. - - - Din säng saknades eller blockerades - - - Du kan inte sova nu, det finns monster i närheten - - - Du sover i en säng. För att hoppa till nästa morgon måste alla spelare sova i sängar samtidigt. - - - Verktyg och vapen - - - Vapen - - - Mat - - - Strukturer - - - Rustningsdelar - - - Mekanismer - - - Färdmedel - - - Dekorationer - - - Byggblock - - - Rödsten och transport - - - Diverse - - - Bryggning - - - Verktyg, vapen och rustningsdelar - - - Material - - - Loggade ut - - - Svårighetsgrad - - - Musik - - - Ljud - - - Ljusstyrka - - - Känslighet - spelet - - - Känslighet - gränssnittet - - - Fridfullt - - - Lätt - - - Normalt - - - Svårt - - - I det här läget återfår spelaren hälsa med tiden, och det finns inga fiender i vä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. - - - I det här läget finns det monster i världen, och de gör normal skada. - - - 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! - - - Demotiden slut + + Vatten - - Spelet är fullt + + Glasflaska - - Kunde inte ansluta till spelet. Det finns inga lediga platser. + + Vattenflaska - - Ange skylttext + + Spindelöga - - Skriv vad som ska stå på din skylt + + Guldklimp - - Ange namn + + Nedervårta - - Ge din post ett namn + + {*prefix*}Brygd{*postfix*}{*splash*} - - Ange bildtext + + Fermenterat spindelöga - - Ge din post en bildtext + + Kittel - - Ange beskrivning + + Enderöga - - Ge din post en beskrivning + + Glimmande melon - - Inventarie + + Brännpulver - - Ingredienser + + Magmasalva - + Brygdställ - - Kista + + Spöktår - - Förtrolla + + Pumpafrön - - Ugn + + Melonfrön - - Ingrediens + + Rå kyckling - - Bränsle + + Musikskiva - "11" - - Automat + + Musikskiva - "where are we now" - - Det finns inga erbjudanden på nedladdningsbart innehåll av den här typen för tillfället. + + Sax - - %s har anslutit till spelet. + + Tillagad kyckling - - %s har lämnat spelet. + + Enderpärla - - %s har sparkats från spelet. + + Melonskiva - - Vill du radera den här sparfilen? + + Brännstav - - Väntar på godkännande + + Rått nötkött - - Censurerad + + Biffstek - - Spelar: + + Ruttet kött - - Återställ inställningar + + Förtrollningsflaska - - Vill du återställa alla inställningar till deras standardvärden? + + Ekträplankor - - Laddningsfel + + Granträplankor - - Spel skapat av %s + + Björkträplankor - - Okänd värds spel + + Gräsblock - - Gästen loggade ut + + Jord - - En gästspelare har loggat ut, vilket har fått alla gäster att loggas ut från spelet. + + Kullersten - - Logga in + + Djungelträplankor - - Du är inte inloggad. För att spela det här spelet måste du vara inloggad. Vill du logga in nu? + + Björkskott - - Flera spelare tillåts inte + + Djungelträdskott - - Kunde inte skapa spel + + Berggrund - - Valt automatiskt + + Skott - - Inget paket: standardutseende + + Ekskott - - Favoritutseenden + + Granskott - - Blockerad värld + + Sten - - 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. + + Uppvisningsbox - - Blockera den här världen? + + Spawna {*CREATURE*} - - Vill du lägga till den här världen på listan med blockerade världar? -Om du väljer OK avslutas spelet. + + Nedermursten - - Häv blockering + + Eldladdning - - Automatisk sparfrekvens + + Eldladdning (träkol) - - Automatisk sparfrekvens: AV + + Eldladdning (kol) - - Minuter + + Dödskalle - - Kan inte placeras här! + + Huvud - - 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ö. + + Huvud från %s - - Gränssnittets opacitet + + Smygarhuvud - - Förbereder automatisk sparning av världen + + Skelettskalle - - Gränssnittets storlek + + Witherskelettskalle - - Gränssnittets storlek (delad skärm) + + Zombiehuvud - - Frö - - - Lås upp utseendepaket - - - 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? - - - Lås upp texturpaket - - - 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? - - - Demonstration av texturpaket - - - 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? - - - Texturpaket saknas - - - Lås upp fullversion - - - Ladda ned demoversion - - - Ladda ned fullversion - - - Den här världen använder ett kombinations- eller texturpaket som du inte har! -Vill du installera kombinations- eller texturpaketet nu? - - - Skaffa demoversion - - - Skaffa fullversion - - - Sparka spelare - - - Vill du sparka den här spelaren från spelet? Spelaren kan inte ansluta på nytt förrän du startar om världen. - - - Spelarbildspaket - - - Teman - - - Utseendepaket - - - Tillåt vänners vänner - - - Du kan inte ansluta till det här spelet. Det har begränsats till spelare som är vänner till värden. - - - Kan inte ansluta till spelet - - - Valt - - - Valt utseende: - - - Korrupt nedladdningsbart innehåll - - - 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. - - - 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. - - - Ditt spelläge har ändrats - - - Döp om din värld - - - Ange världens nya namn - - - Spelläge: Överlevnad - - - Spelläge: Kreativt - - - Överlevnad - - - Kreativt - - - Skapad i överlevnadsläget - - - Skapad i det kreativa läget - - - Visa moln - - - Vad vill du göra med den här sparfilen? - - - Byt namn på sparfilen - - - Sparar automatiskt om %d ... - - - - - - Av - - - Normal - - - Platt - - - När det här alternativet är valt spelas spelet i onlineläge. - - - När det här alternativet är valt kan bara inbjudna spelare ansluta. - - - När det här alternativet är valt kan vänner till folk på din vänlista ansluta. - - - När det här alternativet är valt kan spelare skada andra spelare. Påverkar bara överlevnadsläget. - - - När det här alternativet är avstängt måste spelare godkännas innan de kan bygga eller bryta block. - - - När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. - - - När det här alternativet är aktiverat exploderar dynamit när den aktiveras. - - - 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. - - - När det här alternativet är valt kommer byar och fästningar att genereras i världen. - - - När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta. - - - När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats. - - - Utseendepaket - - - Teman - - - Spelarbilder - - - Avatarföremål - - - Texturpaket - - - Kombinationspaket - - - {*PLAYER*} brann upp - - - {*PLAYER*} brann ihjäl - - - {*PLAYER*} försökte sig på att simma i lava - - - {*PLAYER*} kvävdes i en vägg - - - {*PLAYER*} drunknade - - - {*PLAYER*} svalt ihjäl - - - {*PLAYER*} stacks ihjäl - - - {*PLAYER*} träffade backen för hårt - - - {*PLAYER*} föll av världen - - - {*PLAYER*} dog - - - {*PLAYER*} sprängdes - - - {*PLAYER*} dödades av magi - - - {*PLAYER*} dödades av enderdrakens eld - - - {*PLAYER*} dödades av {*SOURCE*} - - - {*PLAYER*} dödades av {*SOURCE*} - - - {*PLAYER*} sköts av {*SOURCE*} - - - {*PLAYER*} träffades av ett eldklot från {*SOURCE*} - - - {*PLAYER*} mörbultades av {*SOURCE*} - - - {*PLAYER*} dödades av {*SOURCE*} - - - Berggrundsdimma - - - Visa gränssnittet - - - Visa handen - - - Dödsmeddelanden - - - Animerad spelfigur - - - Anpassad utseendeanimation - - - Du kan inte längre bryta block eller använda föremål - - - Nu kan du bryta block och använda föremål - - - Du kan inte längre placera block - - - Nu kan du placera block - - - Nu kan du använda dörrar och kopplare - - - Du kan inte längre använda dörrar eller kopplare - - - Nu kan du använda behållare (exempelvis kistor) - - - Du kan inte längre använda behållare (exempelvis kistor) - - - Du kan inte längre anfalla varelser - - - Nu kan du anfalla varelser - - - Du kan inte längre anfalla spelare - - - Nu kan du anfalla spelare - - - Du kan inte längre anfalla djur - - - Nu kan du anfalla djur - - - Du har blivit till moderator - - - Du är inte längre moderator - - - Du kan flyga - - - Du kan inte längre flyga - - - Du blir inte längre utmattad - - - Nu kan du bli utmattad - - - Nu är du osynlig - - - Du är inte längre osynlig - - - Nu är du odödlig - - - Du är inte längre odödlig - - - %d MSP - - - Enderdrake - - - %s har nått världens ände - - - %s har lämnat världens ände - - - -{*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*} - - - -{*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*} - - - - {*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*} - - - Återställ Nedervärlden - - - 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? - - - Återställ Nedervärlden - - - Återställ inte Nedervärlden - - - Du kan inte klippa den här svampkon för tillfället. Det maximala antalet grisar, får, kor och katter har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet grisar, får, kor och katter har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet svampkor har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet vargar i en värld har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet höns i en värld har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet bläckfiskar i en värld har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet fiender i en värld har uppnåtts. - - - Du kan inte använda ägget för tillfället. Det maximala antalet bybor i en värld har uppnåtts. - - - Det maximala antalet tavlor/uppvisningsboxar i en värld har uppnåtts. - - - Du kan inte spawna fiender i det fridfulla läget. - - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga grisar, får, kor och katter har uppnåtts. - - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga vargar har uppnåtts. - - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga höns har uppnåtts. - - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga svampkor har uppnåtts. - - - Det maximala antalet båtar i en värld har uppnåtts. - - - Det maximala antalet varelsehuvuden i en värld har uppnåtts. - - - Omvänd Y-axel - - - Vänsterhänt - - - Du dog! - - - Spawna - - - Erbjudanden på nedladdningsbart innehåll - - - Ändra utseende - - - Instruktioner - - - Kontrollinställningar - - - Inställningar - - - Medverkande - - - Installera om innehåll - - - Debuginställningar - - - Eld sprider sig - - - Dynamit exploderar - - - Spelare mot spelare - - - Lita på spelare - - - Värdprivilegier - - - Generera strukturer - - - Platt värld - - - Bonuskista - - - Världsalternativ - - - Kan bygga och bryta block - - - Kan använda dörrar och kopplare - - - Kan öppna behållare - - - Kan anfalla spelare - - - Kan anfalla djur - - - Moderator - - - Sparka spelare - - - Kan flyga - - - Stäng av utmattning - - - Osynlig - - - Värdalternativ - - - Spelare/bjud in - - - Onlinespel - - - Endast inbjudan - - - Fler alternativ - - - Ladda - - - Ny värld - - - Världens namn - - - Frö till världsskaparen - - - Lämna blankt för ett slumpmässigt frö - - - Spelare - - - Anslut till spel - - - Starta - - - Inga spel hittades - - - Spela - - - Rankningslistor - - - Hjälp och alternativ - - - Lås upp fullversion - - - Återgå till spelet - - - Spara - - - Svårighetsgrad: - - - Speltyp: - - - Strukturer: - - - Nivåtyp: - - - Spelare mot spelare: - - - Lita på spelare: - - - Dynamit: - - - Eld sprider sig: - - - Installera om tema - - - Installera om spelarbild 1 - - - Installera om spelarbild 2 - - - Installera om avatarföremål 1 - - - Installera om avatarföremål 2 - - - Installera om avatarföremål 3 - - - Alternativ - - - Ljud - - - Känslighet - - - Bild - - - Gränssnitt - - - Återställ standardvärden - - - Guppande kamera - - - Tips - - - Verktygstips - - - Lodrät skärmdelning för 2 spelare - - - Färdig - - - Redigera skylttext: - - - Fyll i uppgifterna som följer med din skärmbild - - - Bildtext - - - Skärmbild från spelet - - - Redigera skylttext: - - - Minecrafts klassiska texturer, ikoner och gränssnitt! - - - Visa alla kombinationsvärldar - - - Inga effekter - - - Snabbhet - - - Slöhet - - - Flitighet - - - Lathet - - - Styrka - - - Svaghet - - - Hälsa direkt - - - Skada direkt - - - Högre hopp - - - Illamående - - - Regenerering - - - Motstånd - - - Eldmotstånd - - - Vattenandning - - - Osynlighet - - - Blindhet - - - Mörkersyn - - - 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 lathet + + + för flitighet + + + för svaghet + + + för styrka + + + Eldmotstånd + + + Mättnad + för motstånd - - för eldmotstånd + + för högre hopp - - för vattenandning + + Wither - - för osynlighet + + Hälsobonus - - för blindhet - - - för mörkersyn - - - för hunger - - - som förgiftar + + Absorbering @@ -5235,9 +6160,78 @@ Vill du installera kombinations- eller texturpaketet nu? III + + för osynlighet + IV + + för vattenandning + + + för eldmotstånd + + + för mörkersyn + + + som förgiftar + + + för hunger + + + för absorbering + + + för mättnad + + + för hälsobonus + + + för blindhet + + + som förmultnar + + + Medioker + + + Tunn + + + Grumlig + + + Klar + + + Mjölkig + + + Basal + + + Smörig + + + Len + + + Inkompetent + + + Avslagen + + + Klumpig + + + Mild + (Explosiv) @@ -5247,50 +6241,14 @@ Vill du installera kombinations- eller texturpaketet nu? Ointressant - - Mild + + Ståtlig - - Klar + + Hjärtlig - - Mjölkig - - - Grumlig - - - Medioker - - - Tunn - - - Basal - - - Avslagen - - - Klumpig - - - Inkompetent - - - Smörig - - - Len - - - Fin - - - Lyxig - - - Tjock + + Charmig Elegant @@ -5298,149 +6256,152 @@ Vill du installera kombinations- eller texturpaketet nu? Utsökt - - Charmig - - - Ståtlig - - - Raffinerad - - - Hjärtlig - Bubblig - - Potent - - - Äcklig - - - Doftlös - Stinkande Sträv + + Doftlös + + + Potent + + + Äcklig + + + Fin + + + Raffinerad + + + Tjock + + + Lyxig + + + Återställer hälsa över tiden för påverkade spelare, djur och monster. + + + Tar hälsa på en gång från påverkade spelare, djur och monster. + + + 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. + 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. + + + Används som grund till alla brygder. Använd i ett brygdställ för att tillverka brygder. + Vidrig Illaluktande - - Används som grund till alla brygder. Använd i ett brygdställ för att tillverka brygder. - - - 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. - - - 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 och monster åsamkar mer skada när de anfaller. - - - 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. - - - Tar hälsa på en gång från påverkade spelare, djur och monster. - - - Återställer hälsa över tiden för påverkade spelare, djur och monster. - - - Gör påverkade spelare, djur och monster immuna mot skada från eld, lava och brännares avståndsattacker. - - - Åsamkar skada över tiden för påverkade spelare, djur och monster. + + Heligt Skärpa - - Heligt + + Åsamkar skada över tiden för påverkade spelare, djur och monster. - - Leddjurens bane + + Attackskada Knuff - - Eldkraft + + Leddjurens bane - - Skydd + + Snabbhet - - Eldskydd + + Zombieförstärkningar - - Fallskydd + + Hästars hoppstyrka - - Explosionsskydd + + Vid användning: - - Projektilskydd + + Knuffmotstånd - - Andning + + Varelserevir - - Vattuman - - - Effektivitet + + Maximal hälsa Silkesvante - - Oförstörbar + + Effektivitet - - Plundring + + Vattuman Rikedom - - Kraft + + Plundring - - Flamma + + Oförstörbar - - Slag + + Eldskydd - - Oändlig + + Skydd - - I + + Eldkraft - - II + + Fallskydd - - III + + Andning + + + Projektilskydd + + + Explosionsskydd IV @@ -5451,23 +6412,29 @@ Vill du installera kombinations- eller texturpaketet nu? VI + + Slag + VII - - VIII + + III - - IX + + Flamma - - X + + Kraft - - Kan brytas med en järnhacka eller bättre för att få smaragder. + + Oändlig - - 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. + + II + + + I Aktiveras när en varelse vidrör den anslutna snubbeltråden. @@ -5478,44 +6445,59 @@ Vill du installera kombinations- eller texturpaketet nu? Ett kompakt sätt att förvara smaragder. - - En vägg gjord av kullersten. + + 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. - - Kan användas för att reparera vapen, verktyg och rustningsdelar. + + IX - - Smälts i en ugn för att producera nederkvarts. + + VIII - - Används som dekoration. + + Kan brytas med en järnhacka eller bättre för att få smaragder. - - Kan användas vid byteshandel med bybor. - - - Används som dekoration. Blommor, skott, kaktusar och svampar kan planteras i den. + + X Återställer 2{*ICON_SHANK_01*} och kan göras om till en gyllene morot. Kan planteras på åkermark. + + Används som dekoration. Blommor, skott, kaktusar och svampar kan planteras i den. + + + En vägg gjord av kullersten. + Återställer 0,5{*ICON_SHANK_01*}, eller så kan den bakas i en ugn. Kan planteras i åkermark. - - Återställer 3{*ICON_SHANK_01*}. Skapad genom att baka en potatis i en ugn. + + Smälts i en ugn för att producera nederkvarts. + + + Kan användas för att reparera vapen, verktyg och rustningsdelar. + + + Kan användas vid byteshandel med bybor. + + + Används som dekoration. + + + Återställer 4{*ICON_SHANK_01*}. - Å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. + Å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 4{*ICON_SHANK_01*}. + + Återställer 3{*ICON_SHANK_01*}. Skapad genom att baka en potatis i en ugn. + + + Återställer 3{*ICON_SHANK_01*}. Tillverkas med en morot och guldtackor. Används med städ för att förtrolla vapen, verktyg och rustningsdelar. @@ -5523,6 +6505,15 @@ Vill du installera kombinations- eller texturpaketet nu? 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 + + Pumpapaj - - Potatis - - - 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,72 +6652,77 @@ 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. + + + + Färga halsband + + + + Börja bearbeta ett föremål genom att placera det på den första platsen. @@ -5745,9 +6732,9 @@ Vill du installera kombinations- eller texturpaketet nu? Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder städets gränssnitt. - + - Börja bearbeta ett föremål genom att placera det på den första platsen. + Det går även att placera ett identiskt föremål på den andra platsen för att kombinera de två föremålen. @@ -5755,24 +6742,14 @@ Vill du installera kombinations- eller texturpaketet nu? 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. - + - Det går även att placera ett identiskt föremål på den andra platsen för att kombinera de två föremålen. + 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. Du kan förtrolla föremål på städet genom att placera en förtrollad bok på den andra platsen. - - - - - 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. @@ -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,14 +6831,24 @@ 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. I det här området finns en bybo och en kista med papper att köpa saker för. + + + + + Tryck på{*CONTROLLER_VK_A*} för att byta de saker som bybon kräver mot det som erbjuds. + + + + + Spelare kan byta saker ur inventariet med bybor. @@ -5871,19 +6858,14 @@ Vill du installera kombinations- eller texturpaketet nu? Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man byteshandlar. - + - Spelare kan byta saker ur inventariet med bybor. + Genom att utföra diverse byten kommer bybons möjliga byten att uppdateras slumpmässigt. Bybornas yrke avgör vilka saker de vill byteshandla. - - - - - Genom att utföra diverse byten kommer bybons möjliga byten att uppdateras slumpmässigt. @@ -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,37 +1,123 @@  - - 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 + + + Online-ID:n vid delad skärm + + + Trophies + + + 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. + + + 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. + + + Online-ID:n + + + 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. + + + + Patch 1.04 (Titeluppdatering 14) + + + Online-ID:n i spelet + + + Titta vad jag har gjort i Minecraft: PlayStation®Vita Edition! + + + Nedladdningen misslyckades. Försök igen senare. + + + Kunde inte gå med i spelet på grund av restriktiv NAT-typ. Kontrollera dina nätverksinställningar. + + + Uppladdningen misslyckades. Försök igen senare. + + + Nedladdningen slutfördes! + + + +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. + + + + Kunde inte spara + + + 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. + + + Uppladdning avbruten + + + Du har avbrutit uppladdningen av den här sparfilen till överföringsutrymmet för sparfiler. + + + Ladda upp sparfil till PS3™/PS4™ + + + Laddar upp data: %d%% + + + "PSN" + + + Ladda ned PS3™-sparfil + + + Laddar ned data: %d%% + + + Sparar + + + Uppladdningen slutfördes! + + + Vill du ladda upp den här sparfilen och skriva över en eventuell befintlig sparfil som finns i överföringsutrymmet för sparfiler? + + + Konverterar data + + + ANVÄNDS INTE + + + ANVÄNDS INTE {*T3*}INSTRUKTIONER: KREATIVA LÄGET{*ETW*}{*B*}{*B*} @@ -46,32 +132,80 @@ När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt 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. - - ANVÄNDS INTE - - - ANVÄNDS INTE - "ANVÄNDS INTE" - - "ANVÄNDS INTE" - - - Bjud in vänner - 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? Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. Vill du fortsätta? - - Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. + + "ANVÄNDS INTE" - - 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? + + Bjud in vänner + + + minecraftforum har en sektion som bara riktar in sig på PlayStation®Vita Edition. + + + Du får den senaste informationen om det här spelet från @4JStudios och @Kappische på Twitter! + + + NOT USED + + + Du kan använda PlayStation®Vita-systemets pekskärm för att navigera i menyer! + + + Titta aldrig en enderman i ögonen! + + + {*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. + + + {*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. + + + Vi tror att 4J Studios har tagit bort Herobrine från PlayStation®Vita-systemets version av spelet, men vi är inte säkra. + + + Minecraft: PlayStation®Vita Edition har slagit många rekord! + + + 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? + + + Minecraft: PlayStation®Vita Edition kunde inte laddas och kan inte fortsätta. + + + Bryggning + + + Du loggades ut från "PSN" och återvände därför till titelskärmen. + + + Kunde inte ansluta till spelet. En eller flera spelare kan inte spela online på grund av deras Sony Entertainment Network-kontons chattrestriktioner. + + + 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. + + + 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. + + + 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. + + + Du kan inte ansluta till den här spelsessionen. Onlinespel är avstängt för ditt Sony Entertainment Network-konto på grund av chattrestriktioner. Anslutningen till "PSN" tappades. Avslutar till huvudmenyn. @@ -79,11 +213,23 @@ När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt Anslutningen till "PSN" tappades. + + Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. + + + 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? + 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? + + Gästspelare kan inte låsa upp fullversionen. Logga in med ett Sony Entertainment Network-konto. + + + Online-ID + 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". @@ -93,148 +239,7 @@ Vill du låsa upp fullversionen? 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? - - Gästspelare kan inte låsa upp fullversionen. Logga in med ett Sony Entertainment Network-konto. - - - Online-ID - - - Bryggning - - - Du loggades ut från "PSN" och återvände därför till titelskärmen. - - - 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? - - - Minecraft: PlayStation®Vita Edition kunde inte laddas och kan inte fortsätta. - - - Kunde inte ansluta till spelet. En eller flera spelare kan inte spela online på grund av deras Sony Entertainment Network-kontons chattrestriktioner. - - - 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. - - - Du kan inte ansluta till den här spelsessionen. Onlinespel är avstängt för ditt Sony Entertainment Network-konto på grund av chattrestriktioner. - - - 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. - - - 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. - - - 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. - - - 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. - - - Online-ID:n vid delad skärm - - - Trophies - - - Online-ID:n - - - Online-ID:n i spelet - - - Titta vad jag har gjort i Minecraft: PlayStation®Vita Edition! - - - 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. - - - - Patch 1.04 (Titeluppdatering 14) - - - SELECT - - - 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. - - - Vill du logga in på "PSN"? - - - 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. - - - PlayStation®Vita-system - - - Byt nätverksläge - - - Välj nätverksläge - - - 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. - - - Ad hoc-nätverk - - - "PSN" - - - Ladda ned PlayStation®3-system sparfil - - - Ladda upp sparfil till PlayStation®3/PlayStation®4-system - - - Uppladdning avbruten - - - Du har avbrutit uppladdningen av den här sparfilen till överföringsutrymmet för sparfiler. - - - Laddar upp data: %d%% - - - Laddar ned data: %d%% - - - Vill du ladda upp den här sparfilen och skriva över en eventuell befintlig sparfil som finns i överföringsutrymmet för sparfiler? - - - Konverterar data - - - Sparar - - - Uppladdningen slutfördes! - - - Uppladdningen misslyckades. Försök igen senare. - - - Nedladdningen slutfördes! - - - Nedladdningen misslyckades. Försök igen senare. - - - Kunde inte gå med i spelet på grund av restriktiv NAT-typ. Kontrollera dina nätverksinställningar. - - - 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. - - - - Kunde inte spara - - - 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. + + 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. - - - "PSN" hesabından çıktığın için maç sona erdi - - - Şu an giriş yapılmadı. - - - Bu oyunda "PSN" hesabına bağlı olmanı gerektiren bazı özellikler var ancak şu anda çevrimdışısın. - - - Ad Hoc Ağı çevrimdışı. - - - 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 - - - Kupa Sorunu - - - Sony Entertainment Network hesabına giriş yapmakta sorun çıktı. Kupanı bu sefer alamayacaksın. + + Ayarları Sony Entertainment Network hesabına kaydetme başarısız oldu. Sony Entertainment Network hesabı sorunu - - Ayarları Sony Entertainment Network hesabına kaydetme başarısız oldu. + + Sony Entertainment Network hesabına giriş yapmakta sorun çıktı. Kupanı bu sefer alamayacaksı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ğına Bağlan + + + Bu oyunun Ad Hoc ağ bağlantısı gerektiren bazı özellikleri var ancak siz şu an çevrimdışısınız. + + + Ad Hoc Ağı çevrimdışı. + + + Kupa Sorunu + + + "PSN" hesabından çıktığın için maç sona erdi + + + Ana ekrana döndün çünkü "PSN" hesabından çıktın. + + + Sistem belleği depolama alanınızda oyunu kaydedecek kadar boş alanı yok. + + + Ş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,3111 +1,907 @@  - - 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? - - - Mojang'ta hiç kimse daha önce Junkboy'un yüzünü görmedi. - - - Bir Minecraft Viki'sinin olduğunu biliyor muydun? - - - Mojang'ın yeni ofisi oldukça havalı! - - - Minecon 2013, Orlando, Florida, ABD'de gerçekleştirildi! - - - .party() mükemmeldi! - - - Söylentilere her zaman yalan oldukları gözüyle bakın, doğru oldukları değil! - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - {*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. - - - - {*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. - - - - {*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 : 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. - - - - {*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. - - - - {*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. - - - - - {*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 : Çİ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 kayıt bozulmuş ya da hasar görmüş. Silmek ister misin? + + + 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. + + + Kaydet ve çık + + + Yeni Dünya Oluştur + + + Dünyan için bir ad gir + + + Dünya üretimin için bir oluşum girişi yap + + + Kayıtlı Dünya Yükle + + + Eğitim Bölümünü Oyna + + + Eğitim Bölümü + + + Dünyanın Adını Belirle + + + Hasarlı Kayıt + + + Tamam + + + İptal + + + Minecraft Mağazası + + + Döndür + + + Gizle + + + Tüm Yuvaları Temizle + + + Şu anki oyunundan ayrılıp yeni bir oyuna katılmak istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. + + + Bu dünyanın geçerli versiyonunu bu dünyaya ait önceki kayıtların üzerine yazmak istediğinden emin misin? + + + Kaydetmeden çıkmak istediğinden emin misin? Bu dünyadaki bütün ilerlemen kaybolacak! + + + Oyunu Başlat + + + Oyundan Çık + + + Oyunu Kaydet + + + Kaydetmeden Çık + + + Katılmak için START düğmesine bas + + + İşte bu! Minecraft'tan Steve'in bulunduğu bir oyuncu resmiyle ödüllendirildin! + + + İşte bu! Ürpertenin bulundugu bir oyuncu resmiyle ödüllendirildin! - - {*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. + + Tam Oyunun Kilidini Aç - - {*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. + + Yanına katılmaya çalıştığın oyuncu, oyunun yeni bir sürümünü kullandığından dolayı bu oyuna katılamazsın. - - {*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. + + Yeni Dünya - - {*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. + + Ödül Kilidi Açıldı! - - Sonraki Sayfa + + Deneme oyununu oynuyorsun ancak oyunu kaydedebilmen için tam oyuna sahip olmalısın. +Tam oyunun kilidini şimdi açmak ister misin? - - Önceki Sayfa + + Arkadaşlar - - Temel Öğeler + + Skorum - - Gösterge + + Genel - - Envanter + + Lütfen bekle - - Sandıklar + + Sonuç bulunamadı - - Üretim + + Filtre: - - Ocak + + Yanına katılmaya çalıştığın oyuncu, oyunun eski bir sürümünü kullandığından dolayı bu oyuna katılamazsın. - + + Bağlantı kesildi + + + Sunucuyla olan bağlantı kesildi. Ana menüye dönülüyor. + + + Sunucu tarafından bağlantı kesildi + + + Oyundan çıkılıyor + + + Bir hata meydana geldi. Ana menüye dönülüyor. + + + Bağlantı kurulamadı + + + Oyundan atıldın + + + Kurucu oyundan çıktı. + + + Oyunda bulunan kimseyle arkadaş olmadığından dolayı bu oyuna katılamazsın. + + + Önceden kurucu tarafından atıldığın için bu oyuna katılamazsın. + + + Uçmaktan dolayı oyundan atıldın + + + Bağlanma girişimi çok uzun sürdü + + + Sunucu dolu + + + 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. + + + Temalar + + + Görünüm Paketleri + + + Arkadaşımın arkadaşına izin ver + + + Oyuncuyu at + + + Bu oyuncuyu oyundan atmak istediğinden emin misin? Dünyayı yeniden başlatana kadar oyuna katılamayacak. + + + Oyuncu Resmi Paketleri + + + Kurucunun arkadaşı olan oyuncular için kısıtlandığından dolayı bu oyuna katılamazsın. + + + Bozuk İndirilebilir İçerik + + + 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. + + + İ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. + + + Oyuna Katılınamıyor + + + Seçilen + + + Seçilen görünüm: + + + Tam Sürümü Edin + + + Kaplama Paketinin Kildini Aç + + + Dünyanda bu kaplama paketini kullanmak için kilidini açmalısın. +Kilidini şimdi açmak ister misin? + + + Deneme Kaplama Paketi + + + Oluşum + + + Görünüm Paketinin Kilidini Aç + + + 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? + + + + 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? + + + Tam Sürümü İndir + + + 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? + + + Denenme Sürümünü Edin + + + Kaplama Paketi Mevcut Değil + + + Tam Sürümün Kilidini Aç + + + Denenme Sürümünü İndir + + + Oyun modun değiştirildi + + + Etkinleştirildiğinde, sadece davet edilen oyuncular katılabilir. + + + Etkinleştirildiğinde, Arkadaş Listendeki kişilerin arkadaşları oyuna katılabilir. + + + Etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Sadece Sağ Kalma modunda etki eder. + + + Normal + + + Aşırı Düz + + + Etkinleştirildiğinde, oyun çevrimiçi hale gelir. + + + Etkinsizleştirildiğinde, oyuna katılan oyuncular yetki verilene kadar inşa edemez ya da kazamaz. + + + Etkinleştirildiğinde, dünyada Köy ve Kale gibi yapılar oluşturulacaktır. + + + Etkinleştirildiğinde, Üstdünya'da ve Dip Alem'de tamamen düz bir dünya oluşturulur. + + + 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. + + + Etkinleştirildiğinde, ateş yakındaki alev alabilen bloklara yayılabilir. + + + Etkinleştirildiğinde, TNT harekete geçirildiğinde patlar. + + + Etkinleştirildiğinde, Dip Alem dünyası yeniden oluşturulur. Dip Alem Kalelerinin olmadığı eski bir kayda sahipsen bu seçenek yararlı olacaktır. + + + Kapalı + + + Oyun Modu: Yaratıcılık + + + Sağ Kalma + + + Yaratıcılık + + + Dünyanı Yeniden Adlandır + + + Dünyanın yeni adını gir + + + Oyun Modu: Sağ Kalma + + + Sağ Kalma Modunda Oluşturuldu + + + Kaydı Yeniden Adlandır + + + %d sn. sonra otomatik kaydediliyor... + + + Açık + + + Sağ Kalma Modunda Oluşturuldu + + + Bulutları Göster + + + Bu kayıtlı oyunla ne yapmak istersin? + + + Gösterge Boyutu (Bölünmüş Ekran) + + + Bileşen + + + Yakacak + + Fırlatıcı - - Çiftlik Hayvanları - - - Damızlık Hayvanlar - - - İksir Yapımı - - - Efsun - - - Dip Alem Portalı - - - Çok Oyunculu - - - Ekran Görüntüsü Paylaşmak - - - Bölüm Yasaklamak - - - Yaratıcılık Modu - - - Kurucu ve Oyuncu Seçenekleri - - - Ticaret - - - Örs - - - Son - - - {*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. - - - - Koşma - - - Yeni Ne Var - - - {*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*} - - - {*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*} - - - - Ele göre daha fazla hasar verir. - - - 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. - - - Taş blokları ve cevherleri kazmak için gereklidir. - - - Odun blokları, ele göre daha hızlı bir şekilde kesmek için kullanılır. - - - Ekinler için hazırlamak üzere toprak ve çim blokları sürmek için kullanılır. - - - Ahşap kapılar, kullanarak, üzerlerine vurarak veya Kızıltaş ile açılır. - - - Demir kapılar sadece Kızıltaş, düğmeler veya devre anahtarları ile açılabilir. - - - KULLANILMADI - - - KULLANILMADI - - - KULLANILMADI - - - KULLANILMADI - - - Giyildiği zaman giyen kişiye 1 Zırh verir. - - - Giyildiği zaman giyen kişiye 3 Zırh verir. - - - Giyildiği zaman giyen kişiye 2 Zırh verir. - - - Giyildiği zaman giyen kişiye 1 Zırh verir. - - - Giyildiği zaman giyen kişiye 2 Zırh verir. - - - Giyildiği zaman giyen kişiye 5 Zırh verir. - - - Giyildiği zaman giyen kişiye 4 Zırh verir. - - - Giyildiği zaman giyen kişiye 1 Zırh verir. - - - Giyildiği zaman giyen kişiye 2 Zırh verir. - - - Giyildiği zaman giyen kişiye 6 Zırh verir. - - - Giyildiği zaman giyen kişiye 5 Zırh verir. - - - Giyildiği zaman giyen kişiye 2 Zırh verir. - - - Giyildiği zaman giyen kişiye 2 Zırh verir. - - - Giyildiği zaman giyen kişiye 5 Zırh verir. - - - Giyildiği zaman giyen kişiye 3 Zırh verir. - - - Giyildiği zaman giyen kişiye 1 Zırh verir. - - - Giyildiği zaman giyen kişiye 3 Zırh verir. - - - Giyildiği zaman giyen kişiye 8 Zırh verir. - - - Giyildiği zaman giyen kişiye 6 Zırh verir. - - - Giyildiği zaman giyen kişiye 3 Zırh verir. - - - Bu malzemeden yapılmış araçlar üretmek için kullanılabilen, parlak bir külçe. Ocakta cevherin eritilmesiyle üretilmiş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. - - - 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. - - - Kompakt merdivenler yapmak için kullanılır. - - - Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. - - - Uzun merdivenler yapmak için kullanılır. Birbirinin üstüne yerleştirilen iki levha, normal boyutta ikili levha bloğu oluşturur. - - - Işık çıkarmak için kullanılır. Meşaleler ayrıca karı ve buzu eritir. - - - İnşaat malzemesi olarak kullanılır ve birçok şeyin üretiminde de kullanılabilir. Herhangi bir tip odundan üretilebilir. - - - İnşaat malzemesi olarak kullanılır. Normal kum gibi yer çekiminden etkilenmez. - - - İnşaat malzemesi olarak kullanılır. - - - Meşale, ok, tabela, merdiven, çit üretmek amacıyla ve araçlar ile silahlar için de sap olarak kullanılır. - - - Haritadaki herkes yataktaysa, gecenin herhangi bir anından zamanı gündüze çevirmek için kullanılır ve oyuncunun canlanma noktasını değiştirir. -Kullanılan yünün rengi ne olursa olsun yatak her zaman aynı renktir. - - - Normal üretime göre daha fazla eşya üretebilmene imkan tanır. - - - Cevher eritmeni, odun kömürü ve cam yapmanı, balık ve pirzola pişirmeni sağlar. - - - İç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. - - - Üzerinden atlanamayan bir duvar olarak kullanılır. Oyuncular, hayvanlar ve canavarlar için 1.5, diğer bloklar için 1 blok uzundur. - - - Dikine tırmanmak için kullanılır. - - - 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. - - - Senin veya diğer oyuncular tarafından yazılan metni gösterir. - - - Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. - - - 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. - - - Mantar yahnisi koymak için kullanılır. Yahni yenildiği zaman kase kaybolmaz. - - - Su, lav ve süt koymak ve taşımak için kullanılır. - - - Su koymak ve taşımak için kullanılır. - - - Lav koymak ve taşımak için kullanılır. - - - Süt koymak ve taşımak için kullanılır. - - - Ateş yakmak, TNT'yi tutuşturmak ve inşa edildiği zaman portalı açmak için kullanılır. - - - Balık yakalamak için kullanılır. - - - Güneş'in ve Ay'ın konumlarını gösterir. - - - Başlangıç noktanı gösterir. - - - Elindeyken keşfedilen bölgenin resmini oluşturur. Bu, yol bulmak için kullanılabilir. - - - Ok ile mesafeli saldırılara imkan tanır. - - - Yay için cephane olarak kullanılır. - - - 2.5 {*ICON_SHANK_01*} yeniler. - - - 1 {*ICON_SHANK_01*} yeniler. 6 defa kullanılabilir. - - - 1 {*ICON_SHANK_01*} yeniler. - - - 1 {*ICON_SHANK_01*} yeniler. - - - 3 {*ICON_SHANK_01*} yeniler. - - - 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Bunu yemek zehirlenmene neden olabilir. - - - 3 {*ICON_SHANK_01*} yeniler. Çiğ tavuğun ocakta pişirilmesiyle yapılır. - - - 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. - - - 4 {*ICON_SHANK_01*} yeniler. Çiğ etin ocakta pişirilmesiyle yapılır. - - - 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. - - - 4 {*ICON_SHANK_01*} yeniler. Çiğ domuz pirzolasının ocakta pişirilmesiyle yapılır. - - - 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Evcilleştirmek için bir Oseloya da verilebilir. - - - 2.5 {*ICON_SHANK_01*} yeniler. Ocakta çiğ balığın pişirilmesiyle yapılır. - - - 2 {*ICON_SHANK_01*} yeniler ve altından bir elma yapılabilir. - - - 2 {*ICON_SHANK_01*} yeniler ve 4 saniye boyunca sağlık verir. Bir elmadan veya altın külçelerinden üretilir. - - - 2 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. - - - Kek tarifinde ve iksir yapımında malzeme olarak kullanılır. - - - 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. - - - 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. - - - Kızıltaş devrelerinde yineleyici, geciktirici ve/veya diyot olarak kullanılır. - - - 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. - - - Kızıltaş yükü verildiği zaman eşyaları rastgele fırlatmak için kullanılır. - - - 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. - - - Maden arabalarını yönlendirmek için kullanılır. - - - 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. - - - 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. - - - Raylar boyunca seni, bir hayvanı veya bir canavarı taşımak için kullanılır. - - - Raylar boyunca mal taşımak için kullanılır. - - - İçine kömür konulduğunda raylar boyunca hareket eder ve diğer maden arabalarını iter. - - - Suda, yüzmekten daha hızlı hareket edebilmek için kullanılır. - - - Koyunlardan toplanır ve boyalar ile renklendirilebilir. - - - İnşaat malzemesi olarak kullanılabilir ve boyanabilir. Bu tarif tavsiye edilmez çünkü Yün, Koyunlardan kolayca elde edilebilmektedir. - - - Siyah yün yapmak için boya olarak kullanılır. - - - Yeşil yün yapmak için boya olarak kullanılır. - - - Kahverengi yün yapmak için boya olarak, kurabiyede malzeme olarak veya Kakao Tohumları yetiştirmek için kullanılır. - - - Gümüş rengi yün yapmak için boya olarak kullanılır. - - - Sarı yün yapmak için boya olarak kullanılır. - - - Kırmızı yün yapmak için boya olarak kullanılır. - - - 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. - - - Pembe yün yapmak için boya olarak kullanılır. - - - Turuncu yün yapmak için boya olarak kullanılır. - - - Açık yeşil yün yapmak için boya olarak kullanılır. - - - Gri yün yapmak için boya olarak kullanılır. - - - 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.) - - - Açık mavi yün yapmak için boya olarak kullanılır. - - - Camgöbeği yün yapmak için boya olarak kullanılır. - - - Mor yün yapmak için boya olarak kullanılır. - - - Galibarda yün yapmak için boya olarak kullanılır. - - - Mavi yün yapmak için boya olarak kullanılır. - - - Müzik CDleri çalar. - - - Dayanıklı araçlar, silahlar veya zırh yapmak için bunları kullan. - - - Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. - - - Kitaplar ve haritalar yapmak için kullanılır. - - - Kitap rafı oluşturmak veya efsunlanarak Efsunlu Kitap yapmak için kullanılabilir. - - - Efsun Masasının etrafına yerleştirildiği zaman daha güçlü efsunların yaratılmasına imkan tanır. - - - 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ö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. - - - Kızıltaş tozu toplamak için demir kazma veya daha iyisi ile kazılabilir. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - Kartoplarını saklamanın kompakt yolu. - - - Kartopu yapmak için bir kürekle kazılabilir. - - - Kırıldığı zaman bazen buğday tohumu üretir. - - - Bir boya üretiminde kullanılabilir. - - - 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. - - - Elektrik yükü taşıması için toprağa yerleştirilir. İksirle kaynatıldığı zaman etki süresini artırır. - - - 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. - - - Ş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. - - - Üzerinden geçen her şeyin hareketini yavaşlatır. - - - 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. - - - 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. - - - Mahsullerden hasat edilir ve gıda eşyaları 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. - - - İ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. - - - 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. - - - İ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. - - - 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. - - - (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. - - - (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. - - - Kapıya benzer ancak esasen çitlerle kullanılır. - - - Kavun Dilimlerinden elde edilebilir. - - - Cam Bloklarına alternatif olarak kullanılabilecek saydam bloklar. - - - Bal kabağı yetiştirmek için ekilebilir. - - - 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. - - - İ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. - - - Yerleştirildiğinde zamanla büyür. Makas kullanarak toplanabilir. Merdiven gibi tırmanılabilir. - - - Ü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. - - - İ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. - - - Kullanıldığında, ne üzerinde kullanıldığına bağlı olarak, çeşitli etkiler gösterebilir. - - - 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. - - - İ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. - - - Su kovası kullanılarak ya da yağmur yağınca suyla doldurulabilir ve ardından Cam Şişeleri suyla doldurmak için kullanılabilir. - - - 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. - - - 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. - - - Dip Alem Kalelerinde bulunur ve kırıldığında Dip Alem Yumrusu düşer. - - - 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. - - - 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. - - - Nesneleri tutuşturmak veya Fırlatıcıdan atılarak rastgele ateş yakmak için kullanılabilir. - - - 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. - - - 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. - - - Kakao Çekirdekleri toplamak için ekilebilir. - - - 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. - - - İnek - - - Öldürüldüğünde deri bırakır. Ayrıca kovayla süt sağılabilir. - - - Koyun - - - 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. - - - Tavuk - - - Öldürüldüğünde tüy bırakır ve ayrıca rasgele olarak yumurtlar. - - - Domuz - - - Ö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. - - - Ürperten - - - Çok yaklaşırsan patlar! - - - İskelet - - - Sana ok atar. Öldürüldüğünde oklar bırakır. - - - Örümcek - - - Yakınında olduğunda saldırır. Duvarlara tırmanabilir. Öldürüldüğünde ip bırakır. - - - Zombi - - - Yakınında olduğunda saldırır. - - - Zombi Domuzadam - - - Başlangıçta uysaldır ancak birine saldırırsan grup olarak saldırırlar. - - - Fersiz - - - Çarptığında patlayan alevli toplar atarlar. - - - Balçık - - - Hasar aldığında daha ufak Balçıklara bölünür. - - - Sonveren Adam - - - 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. - - - Mağara Örümceği - - - Isırığı zehirlidir. - - - Möntar - - - Kaseyle kullanıldığında mantar yahnisi meydana getirir. Mantar bırakır ve kırpıldığında normal inek haline gelir. - - - Kar Golemi - - - 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. - - - Sonveren Ejderha - - - Son'da bulunan büyük siyah bir ejderhadır. - - - Alaz - - - Dip Alem'de bulunan bu düşmanlar çoğunlukla Dip Alem Kalelerinin içindedir. Öldürüldüklerinde Alaz Çubukları bırakırlar. - - - Magma Küpü - - - Dip Alem'de bulunur. Balçığa benzer şekilde öldürüldüğünde daha ufak türlerine ayrılır. - - - Köylü - - - Oselo - - - 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. - - - Demir Golem - - - Koruma amacıyla Köyde ortaya çıkar ve Demir Bloklar ile Bal Kabakları kullanılarak oluşturulabilir. - - - Patlayıcı Animatörü - - - Konsept Sanatçısı - - - Hesaplamalar ve İstatistikler - - - Zalim Koordinatör - - - Orijinal Tasarım ve Kodlama - - - Proje Müdürü/Yapımcısı - - - Mojang Ofisinin Kalanı - - - Baş Oyun Programcısı Minecraft PC - - - Ninja Kodlayıcı - - - CEO - - - Beyaz Yakalı İşçi - - - Müşteri Desteği - - - Ofis DJ'i - - - Tasarımcı/Programcı Minecraft - Cep Sürümü - - - Geliştirici - - - Baş Mimar - - - Sanat Geliştiricisi - - - Oyun Zanaatkarı - - - Eğlence Yönetmeni - - - Müzik ve Sesler - - - Programlama - - - Sanat - - - Kalite Kontrol - - - Yönetici Yapımcı - - - Baş Yapımcı - - - Yapımcı - - - Test Yöneticisi - - - Baş Test Sorumlusu - - - Tasarım Ekibi - - - Geliştirme Ekibi - - - Oyun Çıkışı Yönetimi - - - Yönetmen, XBLA Yayıncılık - - - İş Geliştirme - - - Portföy Yöneticisi - - - Ürün Müdürü - - - Pazarlama - - - Topluluk Yöneticisi - - - Avrupa Yerelleştirme Ekibi - - - Redmond Yerelleştirme Ekibi - - - Asya Yerelleştirme Ekibi - - - Kullanıcı Araştırma Ekibi - - - MGS Central Ekipleri - - - Ara Hedef Kabulü Test Sorumlusu - - - Özel Teşekkürler - - - Test Müdürü - - - Yardımcı Test Yöneticisi - - - SDET - - - Proje STE - - - İlave STE - - - Test Ortakları - - - Jon Kågström - - - Tobias Möllstam - - - Risë Lugo - - - Ahşap Kılıç - - - Taş Kılıç - - - Demir Kılıç - - - Elmas Kılıç - - - Altın Kılıç - - - Ahşap Kürek - - - Taş Kürek - - - Demir Kürek - - - Elmas Kürek - - - Altın Kürek - - - Ahşap Kazma - - - Taş Kazma - - - Demir Kazma - - - Elmas Kazma - - - Altın Kazma - - - Ahşap Balta - - - Taş Balta - - - Demir Balta - - - Elmas Balta - - - Altın Balta - - - Ahşap Çapa - - - Taş Çapa - - - Demir Çapa - - - Elmas Çapa - - - Altın Çapa - - - Ahşap Kapı - - - Demir Kapı - - - Zincir Miğfer - - - Zincir Göğüs Zırhı - - - Zincir Pantolon - - - Zincir Çizmeler - - - Deri Başlık - - - Demir Miğfer - - - Elmas Miğfer - - - Altın Miğfer - - - Deri Tunik - - - Demir Göğüs Zırhı - - - Elmas Göğüs Zırhı - - - Altın Göğüs Zırhı - - - Deri Pantolon - - - Demir Pantolon - - - Elmas Pantolon - - - Altın Pantolon - - - Deri Çizmeler - - - Demir Çizmeler - - - Elmas Çizmeler - - - Altın Çizmeler - - - Demir Külçe - - - Altın Külçe - - - Kova - - - Su Kovası - - - Lav Kovası - - - Çakmak Taşı ve Çelik - - - Elma - - - Yay - - - Ok - - - Kömür - - - Odun Kömürü - - - Elmas - - - Sopa - - - Kase - - - Mantar Yahnisi - - - İp - - - Tüy - - - Barut - - - Buğday Tohumu - - - Buğday - - - Ekmek - - - Çakmak Taşı - - - Çiğ Domuz Pirzolası - - - Pişmiş Domuz Pirzolası - - - Tablo - - - Altın Elma - - - Tabela - - - Maden Arabası - - - Eyer - - - Kızıltaş - - - Kartopu - - - Kayık - - - Deri - - - Süt Kovası - - - Tuğla - - - Kil - - - Şeker Kamışları - - - Kağıt - - - Kitap - - - Balçık Topu - - - Sandıklı Maden Arabası - - - Ocaklı Maden Arabası - - - Yumurta - - - Pusula - - - Olta - - - Saat - - - Parıltı Taşı Tozu - - - Çiğ Balık - - - Pişmiş Balık - - - Boya Tozu - - - Mürekkep Kesesi - - - Gül Kırmızısı - - - Kaktüs Yeşili - - - Kakao Çekirdekleri - - - Laciverttaş - - - Mor Boya - - - Camgöbeği Boya - - - Açık Gri Boya - - - Gri Boya - - - Pembe Boya - - - Limon Yeşili Boya - - - Karahindiba Sarısı - - - Açık Mavi Boya - - - Galibarda Boya - - - Turuncu Boya - - - Kemik Tozu - - - Kemik - - - Şeker - - - Pasta - - - Yatak - - - Kızıltaş Yineleyici - - - Kurabiye - - - Harita - - - Müzik Plağı - "13" - - - Müzik Plağı - "kedi" - - - Müzik Plağı - "bloklar" - - - Müzik Plağı - "cıvıltı" - - - Müzik Plağı - "uzak" - - - Müzik Plağı - "AVM" - - - Müzik Plağı - "mellohi" - - - Müzik Plağı - "stal" - - - Müzik Plağı - "strad" - - - Müzik Plağı - "koruma" - - - Müzik Plağı - "11" - - - Müzik Plağı - "neredeyiz şimdi" - - - Makas - - - Bal Kabağı Çekirdekleri - - - Kavun Çekirdekleri - - - Çiğ Tavuk Eti - - - Pişmiş Tavuk Eti - - - Çiğ Sığır Eti - - - Biftek - - - Çürümüş Et - - - Sonveren İncisi - - - Kavun Dilimi - - - Alaz Çubuğu - - - Fersiz Gözyaşı - - - Altın Keseği - - - Dip Alem Yumrusu - - - {*splash*}{*prefix*}{*postfix*}İksiri - - - Cam Şişe - - - Su Şişesi - - - Örümcek Gözü - - - Mayalı Örümcek Gözü - - - Alaz Tozu - - - Magma Özü - - - Simya Standı - - - Kazan - - - Sonveren Gözü - - - Parıldayan Kavun - - - Efsunlu Şişe - - - Kor - - - Kor (Odun Kömürü) - - - Kor (Kömür) - - - Eşya Çerçevesi - - - {*CREATURE*} Canlandır - - - Dip Alem Tuğlası - - - Kafatası - - - İskelet Kafatası - - - Soluk İskelet Kafatası - - - Zombi Kafası - - - Kafa - - - %s Kafası - - - Ürperten Kafası - - - Taş - - - Çimen Bloğu - - - Toprak - - - Parke Taşı - - - Meşe Kerestesi - - - Ladin Kerestesi - - - Huş Kerestesi - - - Orman Kerestesi - - - Fidan - - - Meşe Fidanı - - - Ladin Fidanı - - - Huş Fidanı - - - Orman Ağacı Fidanı - - - Taban Kayası - - - Su - - - Lav - - - Kum - - - Kum Taşı - - - Çakıl Taşı - - - Altın Cevheri - - - Demir Cevheri - - - Kömür Cevheri - - - Odun - - - Meşe Odunu - - - Ladin Odunu - - - Huş Odunu - - - Orman Odunu - - - Meşe - - - Ladin - - - Huş - - - Yapraklar - - - Meşe Yaprakları - - - Ladin Yaprakları - - - Huş Yaprakları - - - Orman Yaprakları - - - Sünger - - - Cam - - - Yün - - - Siyah Yün - - - Kırmızı Yün - - - Yeşil Yün - - - Kahverengi Yün - - - Mavi Yün - - - Mor Yün - - - Camgöbeği Yün - - - Açık Gri Yün - - - Gri Yün - - - Pembe Yün - - - Limon Yeşili Yün - - - Sarı Yün - - - Açık Mavi Yün - - - Galibarda Yün - - - Turuncu Yün - - - Beyaz Yün - - - Çiçek - - - Gül - - - Mantar - - - Altın Bloğu - - - Altın depolamanın kompakt bir yolu. - - - Demir Bloğu - - - Demir depolamanın kompakt bir yolu. - - - Taş Levha - - - Taş Levha - - - Kum Taşı Levha - - - Meşe Odunu Levha - - - Parke Taşı Levha - - - Tuğla Levha - - - Taş Tuğla Levha - - - Meşe Odunu Levha - - - Ladin Odunu Levha - - - Huş Odunu Levha - - - Orman Odunu Levha - - - Dip Alem Tuğlası Levha - - - Tuğlalar - - - TNT - - - Kitap Rafı - - - Yosunlu Taş - - - Obsidiyen - - - Meşale - - - Meşale (Kömür) - - - Meşale (Odun Kömürü) - - - Ateş - - - Canavar Canlandırıcı - - - Meşe Odunu Basamak - - + Sandık - - Kızıltaş Tozu + + Büyüle - - Elmas Cevheri - - - Elmas Bloğu - - - Elmas depolamanın kompakt bir yolu. - - - Üretim Masası - - - Mahsul - - - Ekim Toprağı - - + Ocak - - Tabela + + Şu an için bu başlıkta bu türe ait bir indirilebilir içerik sunumu bulunmuyor. - - Ahşap Kapı + + Bu kayıtlı oyunu silmek istediğinden emin misin? - - Merdiven + + Onay bekleniyor - - Ray + + Sansürlü - - Enerjili Ray + + %s oyuna katıldı. - - Dedektörlü Ray + + %s oyundan ayrıldı. - - Taş Basamak + + %s oyundan atıldı. - - Şalter - - - Basınç Plakası - - - Demir Kapı - - - Kızıltaş Cevheri - - - Kızıltaş Meşalesi - - - Düğme - - - Kar - - - Buz - - - Kaktüs - - - Kil - - - Şeker Kamışı - - - Müzik Kutusu - - - Çit - - - Bal Kabağı - - - Cadılar Bayramı Kabağı - - - Dip Alem Kütlesi - - - Ruh Kumu - - - Parıltı Taşı - - - Portal - - - Laciverttaş Cevheri - - - Laciverttaş Bloğu - - - Laciverttaş depolamanın kompakt bir yolu. - - - Fırlatıcı - - - Nota Bloğu - - - Pasta - - - Yatak - - - - - - Uzun Çimen - - - Ölü Çalı - - - Diyot - - - Kilitli Sandık - - - Yatay Kapı - - - Yün (herhangi bir renk) - - - Piston - - - Yapışkan Piston - - - Gümüşçün Bloğu - - - Taş Tuğlalar - - - Yosunlu Taş Tuğlalar - - - Çatlak Taş Tuğlalar - - - Yontma Taş Tuğlalar - - - Mantar - - - Mantar - - - Demir Parmaklık - - - İnce Cam - - - Kavun - - - Bal Kabağı Sapı - - - Kavun Sapı - - - Sarmaşık - - - Çit Kapısı - - - Tuğla Basamak - - - Taş Tuğla Basamak - - - Gümüşçün Taşı - - - Gümüşçün Parke Taşı - - - Gümüşçün Taşı Tuğlası - - - Miselyum - - - Nilüfer Yaprağı - - - Dip Alem Tuğlası - - - Dip Alem Tuğlası Çiti - - - Dip Alem Tuğlası Basamağı - - - Dip Alem Yumrusu - - - Efsun Masası - - + Simya Standı - - Kazan + + Tabela Yazısı Gir - - Son Portalı + + Tabelana bir bilgi ya da metin gir - - Son Portalı Çerçevesi + + Başlık Gir - - Son Taşı + + Deneme Süresi Doldu - - Ejderha Yumurtası + + Oyun dolu - - Çalı + + Yer olmadığından dolayı oyuna katılım başarısız - - Eğrelti Otu + + Mesajına bir başlık gir - - Kum Taşı Basamak + + Mesajına bir açıklama gir - - Ladin Odunu Basamak - - - Huş Odunu Basamak - - - Orman Odunu Basamak - - - Kızıltaş Lambası - - - Kakao - - - Kafatası - - - Geçerli Kontroller - - - Dizilim - - - Hareket Et/Koş - - - Bak - - - Duraklat - - - Zıpla - - - Zıpla/Yüksel - - + Envanter - - Elindeki Eşyayı Değiştir + + Bileşenler - - Eylem + + Alt Başlık Gir - - Kullan + + Mesajına bir alt başlık gir - - Üretim + + Açıklama Gir - - Bırak + + Şu an oynanan: - - Sessizce İlerle + + Bu seviyeyi yasaklanan seviye listene eklemek istediğinden emin misin? +'Tamam'ı seçtiğinde bu oyundan ayrılacaksın. - - Sessizce İlerle/Alçal + + Yasaklanan Listesinden Çıkart - - Kamera Modunu Değiştir + + Otomatik Kayıt Arası - - Oyuncular/Davet Et + + Yasaklanan Seviye - - Hareket (Uçarken) + + Katıldığın oyun yasaklanan seviye listende yer alıyor. +Bu oyuna katılmayı seçersen, bu seviye yasaklanan seviye listenden çıkartılacak. - - 1. Dizilim + + Bu Seviye Yasaklansın Mı? - - 2. Dizilim + + Otomatik Kayıt Arası: Kapalı - - 3. Dizilim + + Arabirim Saydamlığı - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Seviyeyi Otomatik Kaydetmeye Hazırlanılıyor - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Gösterge Boyutu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Dk. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Buraya Yerleştirilemez! - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + 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. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Favori Görünümler - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + %s Oyunu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Bilinmeyen kurucu oyunu - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Misafir çıkış yaptı - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Ayarları Sıfırla - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Ayarlarını sıfırlayarak başlangıç değerlerine döndürmek istediğinden emin misin? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Yükleme Hatası - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Misafir bir oyuncu oyundan çıktığından dolayı bütün misafir oyuncular oyundan çıkarıldı. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Oyun oluşturulamadı - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Otomatik Seçilen - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Paketsiz: Başlangıç Görünümleri - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Giriş yap - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Giriş yapmadın. Bu oyunu oynamak için giriş yapman gerekiyor. Şimdi giriş yapmak istiyor musun? - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Çok oyunculu oyuna izin verilmedi - - <![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*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. - - - {*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. - - - 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. - - - Yukarıya, aşağıya ve etrafa bakmak için{*CONTROLLER_ACTION_LOOK*} çubuğu kullan. - - - Hareket etmek için{*CONTROLLER_ACTION_MOVE*} çubuğu kullan. - - - 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. - - - Zıplamak için{*CONTROLLER_ACTION_JUMP*} düğmesine bas. - - - 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... - - - 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. - - - Üretim arabirimini açmak için{*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. - - - Daha çok eşya toplayıp ürettikçe envanterin dolacaktır.{*B*} - Envanterini açmak için{*CONTROLLER_ACTION_INVENTORY*} düğmesine bas. - - - 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. - - - 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. - - - 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. - - - 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*} - - - Topladığın odundan keresteler üretilebilir. Bunun için üretim arabirimini aç.{*PlanksIcon*} - - - 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*} - - - 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*} - - - Elinde tuttuğun eşyayı değiştirmek için{*CONTROLLER_ACTION_LEFT_SCROLL*} ile{*CONTROLLER_ACTION_RIGHT_SCROLL*} düğmelerini kullan. - - - 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. - - - Üretim masası seçiliyken, artı imlecini istediğin yere doğrult ve{*CONTROLLER_ACTION_USE*} düğmesini kullanarak üretim masasını yerleştir. - - - Artı imlecini üretim masasına doğrultup{*CONTROLLER_ACTION_USE*} düğmesine basarak aç. - - - 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*} - - - 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*} - - - 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*} - - - Konteyneri aç - - + - Ç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. + Bu bölgede bir çiftlik kurulmuş. Çiftçilik sayesinde yiyecek kaynakları ve başka eşyalar edinebilirsin. - - - Yakınlarda geceyi güvenli şekilde geçirmen için tamamlayabileceğin terk edilmiş bir Madenci barınağı var. - - - - - 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. - - - - 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*} - - - Ocak yapmaya yetecek kadar parke taşı topladın. Şimdi üretim masanı kullanarak bir ocak üret. - - - Dünya üzerinde bir yere ocağı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullanıp ardından da ocağı aç. - - - 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? - - - Cam yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? - - - İ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*} - - - 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. - - - 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*} - - - Eğitimin ilk aşamasını tamamladın. - - - + {*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. + Ç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. - + + 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. + + + Yaratıcılık envanter arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. + + + Devam etmek için bu deliğin öbür tarafına git. + + + Yaratıcılık modu eğitimini tamamladın. + + + 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. + + + 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*} + + + Mantarlar az ışığın olduğu bir alana dikilmelidir, böylece ışıklandırması az olan diğer alanlara da yayılırlar.{*ICON*}39{*/ICON*} + + + Kemik Tozu ekinleri tam olarak büyütmek veya Mantarları Dev Mantarlar haline getirmek için kullanılabilir.{*ICON*}351:15{*/ICON*} + + + Buğday büyürken birkaç aşamadan geçer ve kararmaya başladığında hasat edilebilir.{*ICON*}59:7{*/ICON*} + + + 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. + + + Ş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*} + + + 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. + + - 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. + 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. - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Envanteri nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - - - + - İ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. + Bu bölgede Dip Aleme açılan bir Portal var! - + - 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. + {*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. - + - İmleçte bir eşya varken imleci arabirimin dışına çıkarırsan, eşyayı bırakabilirsin. + 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*} - + - Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_VK_BACK*} düğmesine bas. + Kızıltaş yineleyicileri enerjinin taşınacağı mesafeyi artırmak veya devreye bir geciktirici eklemek için kullanılabilir. + {*ICON*}356{*/ICON*} - + - Envanterden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + 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*} - + - 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. + 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. - - {*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. - - - + - İ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. + 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. - + - İ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. + Şu an Yaratıcılık modundasın. - + - İ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. + {*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. - + - {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} ile Grup Tipi sekmeleri arasından almak istediğin eşyanın grup tipini seç. + 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 eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_VK_BACK*} düğmesine bas. + 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. - + - Yaratıcılık modu envanterinden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + 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. - + + Çiftçilik eğitimini tamamladın. + + + Bazı aletler bazı malzemeler için daha uygundur. Ağaç gövdelerini kesmek için bir balta kullanmalısın. + + + 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. + + + Bazı aletler düşmanlara saldırmak için daha uygundur. Saldırmak için bir kılıç kullanmayı dene. + + + Demir Golemler kasabaları korumak için doğal olarak ortaya çıkar ve kasabalılara saldıracak olursan sana karşılık verirler. + + + Eğitimi tamamlayana kadar bu bölgeden çıkamazsın. + + + Bazı aletler bazı malzemeler için daha uygundur. Toprak ve kum gibi yumuşak malzemeleri çıkarırken bir kürek kullanmalısın. + + + İ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... + + + 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. + + + 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. + + + 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. + + + 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. + + + Yukarı yüzmek için {*CONTROLLER_ACTION_JUMP*} düğmesine basılı tut. + + + 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. + + + 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. + + + İ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. + + + 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. + + + Aşk Moduna bir kere girdikten sonra hayvan 5 dakika kadar tekrar giremeyecektir. + + - Burası üretim arabirimidir. Bu arabirim topladığın eşyaları birleştirip yeni eşyalar üretebilmeni sağlar. + Bu bölgede hayvanlar ağıla kapatılmış. Hayvanları yavrulatarak kendilerinin yavru versiyonlarından üretebilirsin. - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Üretimi nasıl yapacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - - - - {*B*} - Eşya açıklamasını göstermek için {*CONTROLLER_VK_X*} düğmesine bas. - - - - {*B*} - Geçerli eşyayı yapmak için gereken bileşenleri görmek için {*CONTROLLER_VK_X*} düğmesine bas. - - - - {*B*} - Envanteri tekrar görmek için {*CONTROLLER_VK_X*} 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ç. + {*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. - + + Hayvanları yavrulatabilmek için onlara doğru yiyecekleri yedirip 'Aşk Moduna' sokmalısın. + + + 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*} + + - Ü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. + {*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. - + + Golemler bir blok yığını üzerine bal kabağı koyarak yapılır. + + + 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 ü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. + 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. - + + Hayvanlar ve hayvan üretme eğitimini tamamladın. + + - Ü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. + Bu bölgede bir Kar Golemi ve bir Demir Golem yapmak için gereken bal kabağı ve bloklar var. - + - 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. - - - - - Seçili eşyayı üretmek için gerekli bileşenler gösteriliyor. - - - - Topladığın odunlardan kalas üretilebilir. Kalas simgesini seç ve {*CONTROLLER_VK_A*} düğmesine basarak üret.{*PlanksIcon*} - - - - 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. - - - - - Ü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*} - - - - - Ü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*} - - - - - Ü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*} - - - - - 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*} - - - - - 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. - - - - - Bazı eşyalar üretim masası kullanılarak üretilemez, bunlar için ocak gerekir. Şimdi bir ocak yapın.{*FurnaceIcon*} - - - - - Ü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. - - - - - Burası ocak arabirimi. Ocak sayesinde eşyaları eriterek değiştirebilirsin. Örneğin, ocakta demir cevheri eritip onları demir külçelerine çevirebilirsin. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Kömür yakacak olarak kullanılabilir veya bir sopa ile birleştirilerek meşale yapılabilir. - - - - - Bileşen yuvasına kum yerleştirerek cam üretebilirsin. Sığınağına pencere eklemek için biraz cam bloğu üret. - - - - - Burası simya arabirimi. Burayı kullanarak çeşitli etkileri olan farklı iksirler üretebilirsin. - - - - {*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. - - - - - Ü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. - - - - - 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. - - - - - İ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. - - - - - İ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. - - - - - Dip Alem Yumrusunu bir Su Şişesine ekleyerek, ardından da Magma Özü katarak bir Ateş Direnci İksiri üret. - - - - - Simya arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. - - - - - Bu bölgede bir Simya Standı, bir Kazan ve iksir üretmek için eşyalarla dolu olan bir sandık var. - - - - {*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. - - - - - İksir üretmenin ilk adımı bir Su Şişesi yapmaktır. Sandıktan bir Cam Şişe al. - - - - - İç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. + 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. @@ -3122,11 +918,42 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. 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. + + + + {*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. + + + + + İksir üretmenin ilk adımı bir Su Şişesi yapmaktır. Sandıktan bir Cam Şişe al. + + + + + İç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. Ateş Direnci İksirini kendinde kullan. + + + + + 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. + + + + + Bir eşya efsun yuvasına yerleştirildiğinde, sağdaki düğmeler değişerek rastgele efsunlardan bir kısmını gösterecektir. + + + + + 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. @@ -3145,118 +972,80 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. Efsun arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + - 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. + Bu bölgede bir Simya Standı, bir Kazan ve iksir üretmek için eşyalarla dolu olan bir sandık var. - + - Bir eşya efsun yuvasına yerleştirildiğinde, sağdaki düğmeler değişerek rastgele efsunlardan bir kısmını gösterecektir. + Kömür yakacak olarak kullanılabilir veya bir sopa ile birleştirilerek meşale yapılabilir. - + - 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. + Bileşen yuvasına kum yerleştirerek cam üretebilirsin. Sığınağına pencere eklemek için biraz cam bloğu üret. + + + + + Burası simya arabirimi. Burayı kullanarak çeşitli etkileri olan farklı iksirler üretebilirsin. + + + + + 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. + + + + + 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. + + + + + 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. + + + + {*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. + + + + + İ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. + + + + + Dip Alem Yumrusunu bir Su Şişesine ekleyerek, ardından da Magma Özü katarak bir Ateş Direnci İksiri üret. + + + + + Simya arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Ü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. + + + + + 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. + + + + + İ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. Bir efsun seç ve {*CONTROLLER_VK_A*} düğmesine basarak eşyayı efsunla. Eşyayı efsunlayınca tecrübe seviyen azalacak. - - - - - 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. - - - - - Bu bölgede bir Efsun Masası ve efsunlamayı öğrenmene yardımcı olacak bazı eşyalar var. - - - - {*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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - Ş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*} - - - - {*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. - - - - - Maden arabası raylar üzerinde hareket eder. Ocakla çalışan ve sandığı olan bir maden arabası da yapabilirsin. - {*RailIcon*} - - - - - 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*} - - - - - Şu an bir tekne kullanıyorsun. Tekneden çıkmak için imleci tekneye doğrult ve {*CONTROLLER_ACTION_USE*} düğmesine bas.{*BoatIcon*} - - - - - {*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. - - - - - Tekneler su üzerinde daha hızlı hareket etmeni sağlar. {*CONTROLLER_ACTION_MOVE*} ve {*CONTROLLER_ACTION_LOOK*} kullanarak yön verebilirsin. - {*BoatIcon*} - - - - - Şu an bir olta kullanıyorsun. Kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*FishingRodIcon*} - - - - - {*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. @@ -3275,11 +1064,46 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. 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*} + + + + + Tekneler su üzerinde daha hızlı hareket etmeni sağlar. {*CONTROLLER_ACTION_MOVE*} ve {*CONTROLLER_ACTION_LOOK*} kullanarak yön verebilirsin. + {*BoatIcon*} + + + + + Şu an bir olta kullanıyorsun. Kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*FishingRodIcon*} + + + + + {*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. Bu bir yatak. Geceleyin ona bakarken {*CONTROLLER_ACTION_USE*} düğmesine basarak geceyi uyuyarak geçir ve sabah olunca uyan.{*ICON*}355{*/ICON*} + + + + + 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. + + + + + {*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. + + + + + Ş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. @@ -3301,249 +1125,304 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. {*ICON*}355{*/ICON*} - - - 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. - - - + {*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. + 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. - + - Ş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. + 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. - + - 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. + 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. - + - 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*} + 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. - + - Kızıltaş yineleyicileri enerjinin taşınacağı mesafeyi artırmak veya devreye bir geciktirici eklemek için kullanılabilir. - {*ICON*}356{*/ICON*} + 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. - + - 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*} + Bu bölgede bir Efsun Masası ve efsunlamayı öğrenmene yardımcı olacak bazı eşyalar var. - + + {*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. + + + - 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. + 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. - + - Bu bölgede Dip Aleme açılan bir Portal var! + Maden arabası raylar üzerinde hareket eder. Ocakla çalışan ve sandığı olan bir maden arabası da yapabilirsin. + {*RailIcon*} - + - {*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. + 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*} - + - 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. + Şu an bir tekne kullanıyorsun. Tekneden çıkmak için imleci tekneye doğrult ve {*CONTROLLER_ACTION_USE*} düğmesine bas.{*BoatIcon*} - + - 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. + 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 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. + Ş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*} - - - 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. + + {*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. - - - 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. - - - - - Şu an Yaratıcılık modundasın. - - - - - {*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. - - - - 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. - - - Yaratıcılık envanter arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. - - - Devam etmek için bu deliğin öbür tarafına git. - - - Yaratıcılık modu eğitimini tamamladın. - - - - Bu bölgede bir çiftlik kurulmuş. Çiftçilik sayesinde yiyecek kaynakları ve başka eşyalar edinebilirsin. - - - - - {*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. - - - - 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. - - - 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. - - - Buğday büyürken birkaç aşamadan geçer ve kararmaya başladığında hasat edilebilir.{*ICON*}59:7{*/ICON*} - - - 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. - - - Ş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*} - - - 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*} - - - Mantarlar az ışığın olduğu bir alana dikilmelidir, böylece ışıklandırması az olan diğer alanlara da yayılırlar.{*ICON*}39{*/ICON*} - - - Kemik Tozu ekinleri tam olarak büyütmek veya Mantarları Dev Mantarlar haline getirmek için kullanılabilir.{*ICON*}351:15{*/ICON*} - - - Çiftçilik eğitimini tamamladın. - - - - Bu bölgede hayvanlar ağıla kapatılmış. Hayvanları yavrulatarak kendilerinin yavru versiyonlarından üretebilirsin. - - - - - {*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. - - - - Hayvanları yavrulatabilmek için onlara doğru yiyecekleri yedirip 'Aşk Moduna' sokmalısın. - - - İ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. - - - 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. - - - Aşk Moduna bir kere girdikten sonra hayvan 5 dakika kadar tekrar giremeyecektir. - - - 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*} - - - - 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. - - - - Hayvanlar ve hayvan üretme eğitimini tamamladın. - - - - Bu bölgede bir Kar Golemi ve bir Demir Golem yapmak için gereken bal kabağı ve bloklar var. - - - - - {*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. - - - - Golemler bir blok yığını üzerine bal kabağı koyarak yapılır. - - - 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. - - - 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. - - - Demir Golemler kasabaları korumak için doğal olarak ortaya çıkar ve kasabalılara saldıracak olursan sana karşılık verirler. - - - Eğitimi tamamlayana kadar bu bölgeden çıkamazsın. - - - Bazı aletler bazı malzemeler için daha uygundur. Toprak ve kum gibi yumuşak malzemeleri çıkarırken bir kürek kullanmalısın. - - - Bazı aletler bazı malzemeler için daha uygundur. Ağaç gövdelerini kesmek için bir balta kullanmalısın. - - - 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. - - - Bazı aletler düşmanlara saldırmak için daha uygundur. Saldırmak için bir kılıç kullanmayı dene. - - - İ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... - - - 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. - - - Yukarı yüzmek için {*CONTROLLER_ACTION_JUMP*} düğmesine basılı tut. - - - 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. - - - 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. - - - 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. - - - 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. - Bir eşyayı taşırken imleci arabirimin dışına götürürsen o eşyayı bırakabilirsin. + + Oku + + + Tutun + + + Fırlat + + + + + + Ses Perdesini Değiştir + + + Patlat + + + Ek + + + Tam Oyunun Kilidini Aç + + + Kaydı Sil + + + Sil + + + Toprağı Sür + + + Hasat Et + + + Devam Et + + + Yukarı Yüz + + + Vur + + + Süt Sağ + + + Topla + + + Boşalt + + + Eyerle + + + Yerleştir + + + Ye + + + Bin + + + Kayık Kullan + + + Yetiştir + + + Uyu + + + Uyan + + + Oynat + + + Seçenekler + + + Zırh Taşı + + + Silah Taşı + + + Kuşan + + + Bileşen Taşı + + + Yakacak Taşı + + + Alet Taşı + + + Çek + + + Üst Sayfa + + + Alt Sayfa + + + Aşk Modu + + + Bırak + + + Ayrıcalıklar + + + Engelle + + + Yaratıcılık + + + Seviyeyi Yasakla + + + Görünüm Seç + + + Tutuştur + + + Arkadaş Davet Et + + + Kabul Et + + + Kırp + + + Dolaş + + + Yeniden Yükle + + + Seçenekleri Kaydet + + + Komut Çalıştır + + + Tam Sürümü Yükle + + + Deneme Sürümünü Yükle + + + Yükle + + + Çıkar + + + Çevrimiçi Oyunlar Listesini Yenile + + + Parti Oyunları + + + Tüm Oyunlar + + + Çıkış + + + İptal + + + Katılmayı İptal Et + + + Grup Değiştir + + + Üretim + + + Oluştur + + + Al/Yerleştir + + + Envanteri Göster + + + Açıklamayı Göster + + + Bileşenleri Göster + + + Geri + + + Hatırlatma: + + + + + + Son sürümde oyuna eğitim dünyasındaki yeni alanlar gibi yeni özellikler eklendi. + 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. @@ -3555,29 +1434,9 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. {*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. - - Hatırlatma: - - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> - - - Son sürümde oyuna eğitim dünyasındaki yeni alanlar gibi yeni özellikler eklendi. - {*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. - - - 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. - - - 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! - - - - Yiyeceğin tükendiği için artık sağlık kazanamayacaksın. - @@ -3592,102 +1451,20 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. Kullan - - Geri + + 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. - - Çıkış + + 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! - - İptal - - - Katılmayı İptal Et - - - Çevrimiçi Oyunlar Listesini Yenile - - - Parti Oyunları - - - Tüm Oyunlar - - - Grup Değiştir - - - Envanteri Göster - - - Açıklamayı Göster - - - Bileşenleri Göster - - - Üretim - - - Oluştur - - - Al/Yerleştir + + + Yiyeceğin tükendiği için artık sağlık kazanamayacaksın. + Al - - Tümünü Al - - - Yarısını Al - - - Yerleştir - - - Tümünü Yerleştir - - - Birini Yerleştir - - - Bırak - - - Tümünü Bırak - - - Birini Bırak - - - Takas Et - - - Hızlı Taşı - - - Hızlı Seçimi Temizle - - - Bu Nedir? - - - Facebook'ta Paylaş - - - Filtreyi Değiştir - - - Arkadaşlık İsteği Gönder - - - Alt Sayfa - - - Üst Sayfa - Sonraki @@ -3697,18 +1474,18 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. Oyuncu At + + Arkadaşlık İsteği Gönder + + + Alt Sayfa + + + Üst Sayfa + Boya - - Kaz - - - Besle - - - Evcilleştir - İyileştir @@ -3718,1068 +1495,786 @@ Alt seviyelerdeki ışıklandırma için de kullanılabilir. Takip Et - - Çıkar + + Kaz - - Boşalt + + Besle - - Eyerle + + Evcilleştir - - Yerleştir + + Filtreyi Değiştir - - Vur + + Tümünü Yerleştir - - Süt Sağ + + Birini Yerleştir - - Topla - - - Ye - - - Uyu - - - Uyan - - - Oynat - - - Bin - - - Kayık Kullan - - - Yetiştir - - - Yukarı Yüz - - - - - - Ses Perdesini Değiştir - - - Patlat - - - Oku - - - Tutun - - - Fırlat - - - Ek - - - Toprağı Sür - - - Hasat Et - - - Devam Et - - - Tam Oyunun Kilidini Aç - - - Kaydı Sil - - - Sil - - - Seçenekler - - - Arkadaş Davet Et - - - Kabul Et - - - Kırp - - - Seviyeyi Yasakla - - - Görünüm Seç - - - Tutuştur - - - Dolaş - - - Tam Sürümü Yükle - - - Deneme Sürümünü Yükle - - - Yükle - - - Yeniden Yükle - - - Seçenekleri Kaydet - - - Komut Çalıştır - - - Yaratıcılık - - - Bileşen Taşı - - - Yakacak Taşı - - - Alet Taşı - - - Zırh Taşı - - - Silah Taşı - - - Kuşan - - - Çek - - + Bırak - - Ayrıcalıklar + + Tümünü Al - - Engelle + + Yarısını Al - - Üst Sayfa + + Yerleştir - - Alt Sayfa + + Tümünü Bırak - - Aşk Modu + + Hızlı Seçimi Temizle - - İç + + Bu Nedir? - - Döndür + + Facebook'ta Paylaş - - Gizle + + Birini Bırak - - Tüm Yuvaları Temizle + + Takas Et - - Tamam - - - İptal - - - Minecraft Mağazası - - - Şu anki oyunundan ayrılıp yeni bir oyuna katılmak istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. - - - Oyundan Çık - - - Oyunu Kaydet - - - Kaydetmeden Çık - - - Bu dünyanın geçerli versiyonunu bu dünyaya ait önceki kayıtların üzerine yazmak istediğinden emin misin? - - - Kaydetmeden çıkmak istediğinden emin misin? Bu dünyadaki bütün ilerlemen kaybolacak! - - - Oyunu Başlat - - - Hasarlı Kayıt - - - Bu kayıt bozulmuş ya da hasar görmüş. Silmek ister misin? - - - 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. - - - Kaydet ve çık - - - Kaydetmeden çık - - - Ana menüye dönmek istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. - - - Ana menüye dönmek istediğinden emin misin? İlerlemen kaybolacak! - - - Yeni Dünya Oluştur - - - Eğitim Bölümünü Oyna - - - Eğitim Bölümü - - - Dünyanın Adını Belirle - - - Dünyan için bir ad gir - - - Dünya üretimin için bir oluşum girişi yap - - - Kayıtlı Dünya Yükle - - - Katılmak için START düğmesine bas - - - Oyundan çıkılıyor - - - Bir hata meydana geldi. Ana menüye dönülüyor. - - - Bağlantı kurulamadı - - - Bağlantı kesildi - - - Sunucuyla olan bağlantı kesildi. Ana menüye dönülüyor. - - - Sunucu tarafından bağlantı kesildi - - - Oyundan atıldın - - - Uçmaktan dolayı oyundan atıldın - - - Bağlanma girişimi çok uzun sürdü - - - Sunucu dolu - - - Kurucu oyundan çıktı. - - - Oyunda bulunan kimseyle arkadaş olmadığından dolayı bu oyuna katılamazsın. - - - Önceden kurucu tarafından atıldığın için bu oyuna katılamazsın. - - - Yanına katılmaya çalıştığın oyuncu, oyunun eski bir sürümünü kullandığından dolayı bu oyuna katılamazsın. - - - Yanına katılmaya çalıştığın oyuncu, oyunun yeni bir sürümünü kullandığından dolayı bu oyuna katılamazsın. - - - Yeni Dünya - - - Ödül Kilidi Açıldı! - - - İş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 - - - Skorum - - - Genel - - - Kayıtlar: - - - Sıra - - - Seviye kaydedilmeye hazırlanıyor - - - Parçalar hazırlanıyor… - - - Sonuçlandırılıyor… - - - Arazi inşa ediliyor - - - Dünya simüle ediliyor - - - Sunucu başlatılıyor - - - Canlanma bölgesi oluşturuluyor - - - 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 - - - Çevrimdışı oyuna geçiliyor - - - Kurucu oyunu kaydederken beklemede kal - - - SON'a giriliyor - - - SON terk ediliyor - - - Bu yatak dolu - - - Sadece gece uyuyabilirsin - - - %s bir yatakta uyuyor. Şafak vaktine geçilmesi için tüm oyuncuların aynı anda yataklarında uyumaları gerek. - - - Ev yatağın kayıp ya da engellenmiş durumda - - - Şu an dinlenemezsin, yakınlarda canavarlar var - - - Bir yatakta uyuyorsun. Şafak vaktine geçilmesi için tüm oyuncuların aynı anda yataklarında uyumaları gerek. - - - Aletler ve Silahlar - - - Silahlar - - - Gıda - - - Yapılar - - - Zırh - - - Düzenekler - - - Nakliye - - - Dekorasyonlar - - - İnşa Blokları - - - Kızıltaş ve Nakliyat - - - Çeşitli - - - Simya - - - Aletler, Silahlar ve Zırhlar - - - Malzemeler - - - Çıkış yapıldı - - - Zorluk - - - Müzik - - - Ses - - - Gama - - - Oyun Duyarlılığı - - - Arabirim Duyarlılığı - - - Huzurlu - - - Kolay - - - Normal - - - Zor - - - Bu modda, oyuncu zamanla sağlığını geri kazanır ve çevrede hiç düşman bulunmaz. - - - Bu modda, düşmanlar çevrede canlanır ancak Normal moda göre oyuncuya daha az hasar verirler. - - - Bu modda, düşmanlar çevrede canlanır ve oyuncuya standart miktarda hasar verirler. - - - 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. - - - Deneme Süresi Doldu - - - Oyun dolu - - - Yer olmadığından dolayı oyuna katılım başarısız - - - Tabela Yazısı Gir - - - Tabelana bir bilgi ya da metin gir - - - Başlık Gir - - - Mesajına bir başlık gir - - - Alt Başlık Gir - - - Mesajına bir alt başlık gir - - - Açıklama Gir - - - Mesajına bir açıklama gir - - - Envanter - - - Bileşenler - - - Simya Standı - - - Sandık - - - Büyüle - - - Ocak - - - Bileşen - - - Yakacak - - - Fırlatıcı - - - Şu an için bu başlıkta bu türe ait bir indirilebilir içerik sunumu bulunmuyor. - - - %s oyuna katıldı. - - - %s oyundan ayrıldı. - - - %s oyundan atıldı. - - - Bu kayıtlı oyunu silmek istediğinden emin misin? - - - Onay bekleniyor - - - Sansürlü - - - Şu an oynanan: - - - Ayarları Sıfırla - - - Ayarlarını sıfırlayarak başlangıç değerlerine döndürmek istediğinden emin misin? - - - Yükleme Hatası - - - %s Oyunu - - - Bilinmeyen kurucu oyunu - - - Misafir çıkış yaptı - - - Misafir bir oyuncu oyundan çıktığından dolayı bütün misafir oyuncular oyundan çıkarıldı. - - - Giriş yap - - - Giriş yapmadın. Bu oyunu oynamak için giriş yapman gerekiyor. Şimdi giriş yapmak istiyor musun? - - - Çok oyunculu oyuna izin verilmedi - - - Oyun oluşturulamadı - - - Otomatik Seçilen - - - Paketsiz: Başlangıç Görünümleri - - - Favori Görünümler - - - Yasaklanan Seviye - - - Katıldığın oyun yasaklanan seviye listende yer alıyor. -Bu oyuna katılmayı seçersen, bu seviye yasaklanan seviye listenden çıkartılacak. - - - Bu Seviye Yasaklansın Mı? - - - Bu seviyeyi yasaklanan seviye listene eklemek istediğinden emin misin? -'Tamam'ı seçtiğinde bu oyundan ayrılacaksın. - - - Yasaklanan Listesinden Çıkart - - - Otomatik Kayıt Arası - - - Otomatik Kayıt Arası: Kapalı - - - Dk. - - - Buraya Yerleştirilemez! - - - 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. - - - Arabirim Saydamlığı - - - Seviyeyi Otomatik Kaydetmeye Hazırlanılıyor - - - Gösterge Boyutu - - - Gösterge Boyutu (Bölünmüş Ekran) - - - Oluşum - - - Görünüm Paketinin Kilidini Aç - - - 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? - - - - Kaplama Paketinin Kildini Aç - - - Dünyanda bu kaplama paketini kullanmak için kilidini açmalısın. -Kilidini şimdi açmak ister misin? - - - Deneme Kaplama Paketi - - - 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? - - - Kaplama Paketi Mevcut Değil - - - Tam Sürümün Kilidini Aç - - - Denenme Sürümünü İndir - - - Tam Sürümü İndir - - - 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? - - - Denenme Sürümünü Edin - - - Tam Sürümü Edin - - - Oyuncuyu at - - - Bu oyuncuyu oyundan atmak istediğinden emin misin? Dünyayı yeniden başlatana kadar oyuna katılamayacak. - - - Oyuncu Resmi Paketleri - - - Temalar - - - Görünüm Paketleri - - - Arkadaşımın arkadaşına izin ver - - - Kurucunun arkadaşı olan oyuncular için kısıtlandığından dolayı bu oyuna katılamazsın. - - - Oyuna Katılınamıyor - - - Seçilen - - - Seçilen görünüm: - - - Bozuk İndirilebilir İçerik - - - 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. - - - İ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. - - - Oyun modun değiştirildi - - - Dünyanı Yeniden Adlandır - - - Dünyanın yeni adını gir - - - Oyun Modu: Sağ Kalma - - - Oyun Modu: Yaratıcılık - - - Sağ Kalma - - - Yaratıcılık - - - Sağ Kalma Modunda Oluşturuldu - - - Sağ Kalma Modunda Oluşturuldu - - - Bulutları Göster - - - Bu kayıtlı oyunla ne yapmak istersin? - - - Kaydı Yeniden Adlandır - - - %d sn. sonra otomatik kaydediliyor... - - - Açık - - - Kapalı - - - Normal - - - Aşırı Düz - - - Etkinleştirildiğinde, oyun çevrimiçi hale gelir. - - - Etkinleştirildiğinde, sadece davet edilen oyuncular katılabilir. - - - Etkinleştirildiğinde, Arkadaş Listendeki kişilerin arkadaşları oyuna katılabilir. - - - Etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Sadece Sağ Kalma modunda etki eder. - - - Etkinsizleştirildiğinde, oyuna katılan oyuncular yetki verilene kadar inşa edemez ya da kazamaz. - - - Etkinleştirildiğinde, ateş yakındaki alev alabilen bloklara yayılabilir. - - - Etkinleştirildiğinde, TNT harekete geçirildiğinde patlar. - - - Etkinleştirildiğinde, Dip Alem dünyası yeniden oluşturulur. Dip Alem Kalelerinin olmadığı eski bir kayda sahipsen bu seçenek yararlı olacaktır. - - - Etkinleştirildiğinde, dünyada Köy ve Kale gibi yapılar oluşturulacaktır. - - - Etkinleştirildiğinde, Üstdünya'da ve Dip Alem'de tamamen düz bir dünya oluşturulur. - - - 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. + + Hızlı Taşı Görünüm Paketleri - - Temalar + + Kırmızı Lekeli İnce Cam - - Oyuncu Resimleri + + Yeşil Lekeli İnce Cam - - Avatar Eşyaları + + Kahverengi Lekeli İnce Cam - - Kaplama Paketleri + + Beyaz Lekeli İnce Cam - - Uyarlama Paketleri + + Lekeli İnce Cam - - {*PLAYER*} alevlere gömüldü + + Siyah Lekeli İnce Cam - - {*PLAYER*} yanarak öldü + + Mavi Lekeli İnce Cam - - {*PLAYER*} lavların içinde yüzmeye kalkıştı + + Gri Lekeli İnce Cam - - {*PLAYER*} bir duvarın içinde havasızlıktan boğuldu + + Pembe Lekeli İnce Cam - - {*PLAYER*} boğuldu + + Açık Yeşil Lekeli İnce Cam - - {*PLAYER*} açlıktan öldü + + Mor Lekeli İnce Cam - - {*PLAYER*} kaktüs iğnesiyle öldü + + Camgöbeği Lekeli İnce Cam - - {*PLAYER*} yere çok sert çarptı + + Açık Gri Lekeli İnce Cam - - {*PLAYER*} dünyanın dışına düştü + + Turuncu Lekeli İnce Cam - - {*PLAYER*} öldü + + Mavi Lekeli İnce Cam - - {*PLAYER*} havaya uçtu + + Mor Lekeli İnce Cam - - {*PLAYER*} büyüyle öldü + + Camgöbeği Lekeli İnce Cam - - {*PLAYER*} Sonveren Ejderha nefesiyle öldü + + Kırmızı Lekeli Cam - - {*PLAYER*}, {*SOURCE*} tarafından katledildi + + Yeşil Lekeli Cam - - {*PLAYER*}, {*SOURCE*} tarafından katledildi + + Kahverengi Lekeli Cam - - {*PLAYER*}, {*SOURCE*} tarafından vuruldu + + Açık Gri Lekeli İnce Cam - - {*PLAYER*}, {*SOURCE*} tarafından ateş topuyla vuruldu + + Sarı Lekeli İnce Cam - - {*PLAYER*}, {*SOURCE*} tarafından dövülerek öldürüldü + + Açık Mavi Lekeli İnce Cam - - {*PLAYER*}, {*SOURCE*} tarafından öldürüldü + + Galibarda Lekeli İnce Cam - - Taban Sisi + + Gri Lekeli İnce Cam - - Göstergeleri Göster + + Pembe Lekeli İnce Cam - - Eli Göster + + Açık Yeşil Lekeli İnce Cam - - Ölüm Mesajları + + Sarı Lekeli İnce Cam - - Hareketli Karakter + + Açık Gri - - Özel Görünüm Animasyonu + + Gri - - Artık eşya kazamaz veya kullanamazsın + + Pembe - - Artık eşya kazabilir veya kullanabilirsin + + Mavi - - Artık blok yerleştiremezsin + + Mor - - Artık blok yerleştirebilirsin + + Camgöbeği - - Artık kapıları ve düğmeleri kullanabilirsin + + Açık Yeşil - - Artık kapıları ve düğmeleri kullanamazsın + + Turuncu - - Artık konteynerleri kullanabilirsin. (Ör. Sandıklar) + + Beyaz - - Artık konteynerleri kullanamazsın. (Ör. Sandıklar) + + Özel - - Artık yaratıklara saldıramazsın + + Sarı - - Artık yaratıklara saldırabilirsin + + Açık Mavi - - Artık oyunculara saldıramazsın + + Galibarda - - Artık oyunculara saldırabilirsin + + Kahverengi - - Artık hayvanlara saldıramazsın + + Beyaz Lekeli İnce Cam - - Artık hayvanlara saldırabilirsin + + Küçük Top - - Artık denetleyicisin + + Büyük Top - - Artık denetleyici değilsin + + Açık Mavi Lekeli İnce Cam - - Artık uçabilirsin + + Galibarda Lekeli İnce Cam - - Artık uçamazsın + + Turuncu Lekeli İnce Cam - - Artık yorulmazsın + + Yıldız biçimli - - Artık yorulabilirsin + + Siyah - - Artık görünmezsin + + Kırmızı - - Artık görünmez değilsin + + Yeşil - - Artık hasar almazsın + + Ürperten biçimli - - Artık hasar alabilirsin + + İnfilak - - %d MYP + + Bilinmeyen Şekil - - Sonveren Ejderha + + Siyah Lekeli Cam - - %s Son'a girdi + + Demir At Zırhı - - %s Son'dan çıktı + + Altın At Zırhı - - {*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*} + + Elmas At Zırhı + + + Kızıltaş Karşılaştırıcısı + + + TNT'li Maden Arabası + + + Hunili Maden Arabası + + + Tasma + + + Fener + + + Kilitli Sandık + + + Tartılı Basınç Plakası (Hafif) + + + İsim Etiketi + + + Keresteler (bütün türleri) + + + Komut Bloğu + + + Havai Fişek Yıldızı + + + Bu hayvanlar evcilleştirilebilir ve sürülebilir. Bunlara bir Sandık bağlanabilir. + + + Katır + + + 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. + + + At + + + Bu hayvanlar evcilleştirilip, ardından sürülebilirler. + + + Eşek + + + Zombi At + + + Dip Yıldızı + + + + + + Havai Fişek Roketleri + + + İskelet At + + + Solgun + + + Bunlar Solgun Kafatasları ve Ruh Kumlarıyla yapıldı. Sana patlayan Kafatası fırlatırlar. + + + Tartılı Basınç Plakası (Ağır) + + + Açık Gri Lekeli Kil + + + Gri Lekeli Kil + + + Pembe Lekeli Kil + + + Mavi Lekeli Kil + + + Mor Lekeli Kil + + + Camgöbeği Lekeli Kil + + + Açık Yeşil Lekeli Kil + + + Turuncu Lekeli Kil + + + Beyaz Lekeli Kil + + + Lekeli Cam + + + Sarı Lekeli Kil + + + Açık Mavi Lekeli Kil + + + Galibarda Lekeli Kil + + + Kahverengi Lekeli Kil + + + Huni + + + Etkinleştirici Ray + + + Düşürücü + + + Kızıltaş Karşılaştırıcısı + + + Günışığı Sensörü + + + Kızıltaş Bloğu + + + Lekeli Kil + + + Siyah Lekeli Kil + + + Kırmızı Lekeli Kil + + + Yeşil Lekeli Kil + + + Saman Balyası + + + Sertleştirilmiş Kil + + + Kömür Bloğu + + + Geç: + + + 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. + + + Açıldığında oyuncular öldükleri zaman envanterlerini korurlar. + + + Kapatıldığında, yaratıklar doğal şekilde canlanmazlar. + + + Oyun Modu: Macera + + + Macera + + + Aynı araziyi tekrar oluşturmak için bir oluşum gir. Rastgele bir dünya için ise boş bırak. + + + Kapatıldığında canavarlar ve hayvanlar ganimet düşürmezler (örneğin Ürpertenler barut düşürmezler). + + + {*PLAYER*} merdivenden düştü + + + {*PLAYER*} asmaların üzerinden düştü + + + {*PLAYER*} sudan aşağı düştü + + + Kapatıldığında bloklar yok oldukları zaman eşya düşürmezler (örneğin Taş bloklar parke taşı düşürmezler). + + + Kapatıldığında oyuncular sağlıklarını doğal olarak yenileyemezler. + + + Devre dışı bırakıldığında geçen zaman değişmeyecek. + + + Maden Arabası + + + Yular + + + Bırak + + + Bağla + + + İn + + + Sandık Tak + + + Fırlat + + + İsim + + + Fener + + + Birincil Güç + + + İkincil Güç + + + At + + + Düşürücü + + + Huni + + + {*PLAYER*} yüksek bir yerden düştü + + + Şu anda Canlandırma Yumurtasını kullanamazsın. Bir dünyada olabilecek maksimum Yarasa sayısına ulaşıldı. + + + Bu hayvan Aşk Moduna giremez. Maksimum damızlık at sayısına ulaşıldı. + + + Oyun Seçenekleri + + + {*PLAYER*} {*ITEM*} kullanan {*SOURCE*} tarafından gelen ateş topuyla vuruldu + + + {*PLAYER*} oyuncusu {*ITEM*} kullanan {*SOURCE*} tarafından vurularak öldürüldü + + + {*PLAYER*}, {*ITEM*} kullanan {*SOURCE*} tarafından öldürüldü + + + Yaratık Hasarı + + + Döşeme Parçaları + + + Doğal Yenilenme + + + Günışığı Döngüsü + + + Envanteri Koru + + + Yaratık Canlanması + + + Yaratık Ganimetleri + + + {*PLAYER*} {*ITEM*} kullanan {*SOURCE*} tarafından vuruldu + + + {*PLAYER*} çok yüksekten düştü ve {*SOURCE*} tarafından işi bitirildi. + + + {*PLAYER*} çok yüksekten düştü ve {*ITEM*} kullanan {*SOURCE*} tarafından işi bitirildi + + + {*PLAYER*}, {*SOURCE*} ile savaşırken ateşe girdi + + + {*PLAYER*} {*SOURCE*} tarafından ölüme mahkum edildi + + + {*PLAYER*} {*SOURCE*} tarafından ölüme mahkum edildi + + + {*PLAYER*}, {*ITEM*} kullanan {*SOURCE*} tarafından ölüme mahkum edildi. + + + {*PLAYER*}, {*SOURCE*} ile savaşırken çıtır çıtır yandı + + + {*PLAYER*} {*SOURCE*} tarafından patlatıldı + + + {*PLAYER*} soldu gitti + + + {*PLAYER*} {*ITEM*} kullanan {*SOURCE*} tarafından öldürüldü + + + {*PLAYER*}, {*SOURCE*} tarafından kovalanırken lavda yüzmeye çalıştı + + + {*PLAYER*}, {*SOURCE*} tarafından kovalanırken boğuldu + + + {*PLAYER*}, {*SOURCE*} tarafından kovalanırken kaktüse çarptı. + + + Binek + + + 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. + + + 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. + + + 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. + + + 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. + + + Evcilleştirildiklerinde etraflarında kalpler belirir ve artık oyuncuyu sırtlarından atmaya çalışmazlar. + + + Şimdi bu atı sürmeyi dene. Üzerine binmek için elinde eşya veya alet yokken {*CONTROLLER_ACTION_USE*} düğmesini kullan. + + + 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. + + + 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. + + + 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. + + + Bu piramitin tepesinde çalışmayan bir Fener var. + + + Burası, Fenerine verebileceğin güçleri seçebildiğin Fener arabirimidir. + + + 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. + + + Fener menüsündeyken Fenerin için 1 ana güç seçebilirsin. Piramitinin katları arttıkça seçilecek güçler de artar. + + + +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. + + + Bu, atın envanter arabirimidir. + + + + {*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. + + + At envanteri, Atına, Eşeğine ya da Katırına eşya transfer etmeni ya da takmanı sağlar. + + + Parıltı + + + İz + + + Uçuş Süresi: + + + Eyer yuvasına bir eyer yerleştirerek Atını eyerleyebilirsin. Zırh yuvasına At Zırhı yerleştirilerek Atlara zırh takılabilir. + + + Bir Katır buldun. + + + {*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. + + + Atlar ve Eşekler genelde açık ovalarda bulunurlar. Katırlar bir at ve eşekten üreyebilirler fakat kendileri kısırdır. + + + Bu menüde ayrıca, kendi envanterin ile Eşeklere ve Katırlara bağlanmış heybeler arasında eşya transferi yapabilirsin. + + + Bir At buldun. + + + Bir Eşek buldun. + + + + 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. + + + Havai Fişek Yıldızları, üretim örgüsüne Barut ve Boya koyularak üretilebilir. + + + Boya, Havai Fişek Yıldızının patlama rengini belirleyecektir. + + + 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. + + + İ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. + + + Ü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. + + + Ardından üretilen Havai Fişeği, üretimde kullanmak istersen çıkış bölmesinden al. + + + Elmaslar ve Parıltı Taşı Tozu kullanılarak izler ve patlamalar eklenebilir. + + + 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. + + + Ü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. + + + Sandıklardaki çeşitli bileşenleri kullanarak Üretim Masasında bir Havai Fişek üretmeyi dene. + + + 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. + + + Buraki sandıkların içinde, HAVAİ FİŞEK yapımında kullanılan çeşitli eşyalar mevcuttur. + + + {*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. + + + Bir Havai Fişek üretmek için envanterinin üzerinde bulunan 3x3'lük üretim örgüsüne Barut ve Kağıt yerleştir. + + + Bu odada Huniler bulunuyor. + + + 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. + + + 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. + + + 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. + + + 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. + + + Sağladığı güçleri belirlemek için Feneri kullan, gereken ödeme için sana sağlanan Demir Külçeleri kullanabilirsin. + + + 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. + + + Bu odanın içerisinde görülmeyi ve kullanılmayı bekleyen birçok kullanışlı Huni dizilimi vardır. + + + Bu, Havai Fişek ve Havai Fişek Yıldızı üretmek için kullanabileceğin Havai Fişek arayüzüdür. + + + {*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. + + + Huniler, üzerlerine yerleştirilen uygun konteynerlerden devamlı eşya emmeye çalışacaklardır. Depolanan eşyaları bir çıkış konteynerine yerleştirmeye de çalışırlar. + + + 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. + + + 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. + + + Bu düşmanlar bataklıklarda bulunurlar ve İksir atarak saldırırlar. Öldürüldüklerinde İksir düşürürler. + + + Dünyadaki maksimum Tablo/Eşya çerçevesi sayısına ulaşıldı. + + + Huzurlu Modda düşman canlandırılamaz. + + + Bu hayvan Aşk Moduna giremez. Maksimum damızlık Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. + + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kalamar sayısına ulaşıldı. + + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum düşman sayısına ulaşıldı. + + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum köylü sayısına ulaşıldı. + + + Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Kurt sayısına ulaşıldı. + + + + Dünyadaki maksimum Yaratık Kellesi sayısına ulaşıldı. + + + Bakışı Ters Çevir + + + Solak + + + Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Tavuk sayısına ulaşıldı. + + + + Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Möntar sayısına ulaşıldı. + + + + Dünyadaki maksimum Tekne sayısına ulaşıldı. + + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Tavuk sayısına ulaşıldı. {*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*} @@ -4831,9 +2326,61 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Dip Alem'i Sıfırla + + %s Son'a girdi + + + %s Son'dan çıktı + + + {*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*} + 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! + + Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. + + + Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Möntar sayısına ulaşıldı. + + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kurt sayısına ulaşıldı. + Dip Alem'i Sıfırla @@ -4841,116 +2388,11 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Dip Alem'i Sıfırlama - Şu an bu Möntar biçilemez. Maksimum Domuz, Koyun, İnek ve Kedi sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Domuz, Koyun, İnek ve Kedi sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Möntar sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kurt sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Tavuk sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kalamar sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum düşman sayısına ulaşıldı. - - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum köylü sayısına ulaşıldı. - - - Dünyadaki maksimum Tablo/Eşya çerçevesi sayısına ulaşıldı. - - - Huzurlu Modda düşman canlandırılamaz. - - - Bu hayvan Aşk Moduna giremez. Maksimum damızlık Domuz, Koyun, İnek ve Kedi sayısına ulaşıldı. - - - Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Kurt sayısına ulaşıldı. - - - - Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Tavuk sayısına ulaşıldı. - - - - Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Möntar sayısına ulaşıldı. - - - - Dünyadaki maksimum Tekne sayısına ulaşıldı. - - - Dünyadaki maksimum Yaratık Kellesi sayısına ulaşıldı. - - - Bakışı Ters Çevir - - - Solak + Şu an bu Möntar biçilemez. Maksimum Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. Öldün! - - Tekrar Canlan - - - İndirilebilir İçerik Teklifleri - - - Görünümü Değiştir - - - Nasıl Oynanır - - - Kontroller - - - Ayarlar - - - Emeği Geçenler - - - İçeriği Tekrar Yükle - - - Hata Düzeltme Ayarları - - - Yangın Yayılır - - - TNT Patlar - - - Oyuncu vs Oyuncu - - - Oyunculara Güven - - - Kurucu Ayrıcalıkları - - - Yapı Üret - - - Aşırı Düz Dünya - - - Bonus Sandık - Dünya Seçenekleri @@ -4960,18 +2402,18 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Kapıları ve Düğmeleri Kullanabilir + + Yapı Üret + + + Aşırı Düz Dünya + + + Bonus Sandık + Konteynerleri Açabilir - - Oyunculara Saldırabilir - - - Hayvanlara Saldırabilir - - - Denetleyici - Oyuncuyu At @@ -4981,185 +2423,305 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Yorulmayı Kapat + + Oyunculara Saldırabilir + + + Hayvanlara Saldırabilir + + + Denetleyici + + + Kurucu Ayrıcalıkları + + + Nasıl Oynanır + + + Kontroller + + + Ayarlar + + + Tekrar Canlan + + + İndirilebilir İçerik Teklifleri + + + Görünümü Değiştir + + + Emeği Geçenler + + + TNT Patlar + + + Oyuncu vs Oyuncu + + + Oyunculara Güven + + + İçeriği Tekrar Yükle + + + Hata Düzeltme Ayarları + + + Yangın Yayılır + + + Sonveren Ejderha + + + {*PLAYER*} Sonveren Ejderha nefesiyle öldü + + + {*PLAYER*}, {*SOURCE*} tarafından katledildi + + + {*PLAYER*}, {*SOURCE*} tarafından katledildi + + + {*PLAYER*} öldü + + + {*PLAYER*} havaya uçtu + + + {*PLAYER*} büyüyle öldü + + + {*PLAYER*}, {*SOURCE*} tarafından vuruldu + + + Taban Sisi + + + Göstergeleri Göster + + + Eli Göster + + + {*PLAYER*}, {*SOURCE*} tarafından ateş topuyla vuruldu + + + {*PLAYER*}, {*SOURCE*} tarafından dövülerek öldürüldü + + + {*PLAYER*}, {*SOURCE*} tarafından büyü kullanılarak öldürüldü + + + {*PLAYER*} dünyanın dışına düştü + + + Kaplama Paketleri + + + Uyarlama Paketleri + + + {*PLAYER*} alevlere gömüldü + + + Temalar + + + Oyuncu Resimleri + + + Avatar Eşyaları + + + {*PLAYER*} yanarak öldü + + + {*PLAYER*} açlıktan öldü + + + {*PLAYER*} kaktüs iğnesiyle öldü + + + {*PLAYER*} yere çok sert çarptı + + + {*PLAYER*} lavların içinde yüzmeye kalkıştı + + + {*PLAYER*} bir duvarın içinde havasızlıktan boğuldu + + + {*PLAYER*} boğuldu + + + Ölüm Mesajları + + + Artık denetleyici değilsin + + + Artık uçabilirsin + + + Artık uçamazsın + + + Artık hayvanlara saldıramazsın + + + Artık hayvanlara saldırabilirsin + + + Artık denetleyicisin + + + Artık yorulmazsın + + + Artık hasar almazsın + + + Artık hasar alabilirsin + + + %d MYP + + + Artık yorulabilirsin + + + Artık görünmezsin + + + Artık görünmez değilsin + + + Artık oyunculara saldırabilirsin + + + Artık eşya kazabilir veya kullanabilirsin + + + Artık blok yerleştiremezsin + + + Artık blok yerleştirebilirsin + + + Hareketli Karakter + + + Özel Görünüm Animasyonu + + + Artık eşya kazamaz veya kullanamazsın + + + Artık kapıları ve düğmeleri kullanabilirsin + + + Artık yaratıklara saldıramazsın + + + Artık yaratıklara saldırabilirsin + + + Artık oyunculara saldıramazsın + + + Artık kapıları ve düğmeleri kullanamazsın + + + Artık konteynerleri kullanabilirsin. (Ör. Sandıklar) + + + Artık konteynerleri kullanamazsın. (Ör. Sandıklar) + Görünmez - - Kurucu Seçenekleri + + Fenerler - - Oyuncular/Davet + + {*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*} + - - Çevrimiçi Oyun + + Havai Fişekler - - Sadece Davetle + + Diller - - Daha Fazla Seçenek + + Atlar - - Yükle + + {*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*} + - - Yeni Dünya + + {*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. - - Dünya Adı + + {*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. - - Dünya Üreteci Tohumu + + 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. - - Rastgele bir tohum için boş bırak + + Solgundan düşerler ve Fenerlerin yapımında kullanılırlar. - - Oyuncular + + Huniler - - Oyuna Katıl + + {*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*} - - Oyuna Başla + + Düşürücüler - - Oyun Bulunamadı - - - Oyun Oyna - - - Sıralama Tablosu - - - Yardım & Seçenekler - - - Tüm Oyunun Kilidini Aç - - - Oyuna Devam Et - - - Oyunu Kaydet - - - Zorluk: - - - Oyun Türü: - - - Yapılar: - - - Seviye Türü: - - - PvP: - - - Oyunculara Güven: - - - TNT: - - - Yangın Yayılır: - - - Temayı Baştan Yükle - - - Oyuncu Resmi 1'i Yeniden Yükle - - - Oyuncu Resmi 2'yi Yeniden Yükle - - - Avatar Eşyası 1'i Yeniden Yükle - - - Avatar Eşyası 2'yi Yeniden Yükle - - - Avatar Eşyası 3'ü Yeniden Yükle - - - Seçenekler - - - Ses - - - Kontrol - - - Görsel - - - Kullanıcı Arabirimi - - - Başlangıç Ayarlarına Dön - - - Sallantıyı Görüntüle - - - İpuçları - - - Oyun İçi Araç İpucu - - - 2 Oyunculu Yatay Kesilmiş Ekran - - - Tamam - - - İmza mesajını düzenle: - - - Ekran görüntüsüne eklenecek detayları gir - - - Yazı - - - Oyun için ekran görüntüsü - - - İmza mesajını düzenle: - - - Klasik Minecraft kaplamaları, simgeleri ve kullanıcı arabirimi! - - - Tüm Birleşik Dünyaları Göster - - - Etki Yok - - - Hız - - - Yavaşlık - - - Çabukluk - - - Kazı Yorgunluğu - - - Kuvvet - - - Zayıflık + + KULLANILMADI Anında Sağlık @@ -5170,62 +2732,3290 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Zıplama Güçlendirici + + Kazı Yorgunluğu + + + Kuvvet + + + Zayıflık + Bulantı + + KULLANILMADI + + + KULLANILMADI + + + KULLANILMADI + Yenilenme Direnç - - Ateş Direnci + + Dünya Üretimi için Oluşum bulunuyor. - - Suda Soluma + + 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. - - Görünmezlik + + Hunili Maden Arabalarına olanak sağlayan veya devre dışı bırakan ce Maden Arabalarını TNT ile patlatabilen özel bir ray türü. - - Körlük + + Kızıltaş yükü verildiğinde, eşyaları tutup bırakmayı veya başka bir konteynere aktarmak için kullanılır. - - Gece Görüşü + + Sertleştirilmiş Kil kullanılarak yapılan renkli bloklar. - - Açlık + + 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. + + + Bir kızıltaş güç kaynağı olarak kullanılır. Tekrar Kızıltaş haline getirilebilir. + + + Eşyaları yakalamak ve konteynerlere ya da konteynerlerden eşya aktarması yapmak için kullanılır. + + + 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. + + + Yarasa + + + Uçan yaratıklar mağaralarda veya diğer geniş ve kapalı alanlarda bulunurlar. + + + Cadı + + + Ocakta Kil eritilerek yapıldı. + + + Cam ve boyadan yapıldı. + + + Lekeli Camdan yapıldı + + + Bir Kızıltaş gücü sağlar. Bu güç, plakada daha fazla eşya varsa daha da güçlenir. + + + Güneş ışığına (ya da güneş ışığının eksikliğine) bağlı olarak bir Kızıltaş sinyali çıkışı veren bir blok. + + + Bir Huni ile benzer işlevlere sahip özel bir Maden Arabası türü. Raylardaki ve üzerinde bulunan Konteynerlerden eşya alır. + + + Bir ata kuşatılabilen özel bir zırh türü. 5 Zırh sağlar. + + + Bir havai fişeğin rengini, etkisini ve şeklini belirlemede kullanılır. + + + 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. + + + Hareket eden bir TNT bloğu gibi işlev gören bir Maden Arabası türüdür. + + + Bir ata kuşatılabilen özel bir Zırh türü. 7 Zırh Sağlar. + + + Komutların çalıştırılmasında kullanılırlar. + + + Gökyüzüne bir ışın yansıtır ve yakındaki oyunculara Durum Etkilerini gösterir. + + + İç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. + + + Bir ata kuşatılabilen özel bir Zırh türü. 11 Zırh Sağlar. + + + Yaratıkları oyuncuya veya çitli noktalara bağlamak için kullanılır + + + Dünyadaki yaratıkları isimlendirmek için kullanılır. + + + Çabukluk + + + Tüm Oyunun Kilidini Aç + + + Oyuna Devam Et + + + Oyunu Kaydet + + + Oyun Oyna + + + Sıralama Tablosu + + + Yardım & Seçenekler + + + Zorluk: + + + PvP: + + + Oyunculara Güven: + + + TNT: + + + Oyun Türü: + + + Yapılar: + + + Seviye Türü: + + + Oyun Bulunamadı + + + Sadece Davetle + + + Daha Fazla Seçenek + + + Yükle + + + Kurucu Seçenekleri + + + Oyuncular/Davet + + + Çevrimiçi Oyun + + + Yeni Dünya + + + Oyuncular + + + Oyuna Katıl + + + Oyuna Başla + + + Dünya Adı + + + 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ı + + + CEO + + + Beyaz Yakalı İşçi + + + Patlayıcı Animatörü + + + Son'da bulunan büyük siyah bir ejderhadır. + + + Alaz + + + Dip Alem'de bulunan bu düşmanlar çoğunlukla Dip Alem Kalelerinin içindedir. Öldürüldüklerinde Alaz Çubukları bırakırlar. + + + Kar Golemi + + + 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. + + + Sonveren Ejderha + + + Magma Küpü + + + 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. + + + Demir Golem + + + Koruma amacıyla Köyde ortaya çıkar ve Demir Bloklar ile Bal Kabakları kullanılarak oluşturulabilir. + + + Dip Alem'de bulunur. Balçığa benzer şekilde öldürüldüğünde daha ufak türlerine ayrılır. + + + Köylü + + + Oselo + + + Efsun Masasının etrafına yerleştirildiği zaman daha güçlü efsunların yaratılmasına imkan tanır. + + + {*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. + + + + {*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. + + + + {*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. + + + + + {*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. + + + + {*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. + + + + {*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ı. + + + Bu bir tavuk mu yoksa bir ördek mi? + + + Mojang'ın yeni ofisi oldukça havalı! + + + {*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. + + + {*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. + + + {*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. + + + Minecon 2013, Orlando, Florida, ABD'de gerçekleştirildi! + + + .party() mükemmeldi! + + + Söylentilere her zaman yalan oldukları gözüyle bakın, doğru oldukları değil! + + + Önceki Sayfa + + + Ticaret + + + Örs + + + Son + + + Bölüm Yasaklamak + + + Yaratıcılık Modu + + + Kurucu ve Oyuncu Seçenekleri + + + {*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. + + + + {*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*} + + + Ele göre daha fazla hasar verir. + + + 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. + + + Koşma + + + Yeni Ne Var + + + {*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*} + + + Ekran Görüntüsü Paylaşmak + + + Sandıklar + + + Üretim + + + Ocak + + + Temel Öğeler + + + Gösterge + + + Envanter + + + Fırlatıcı + + + Efsun + + + Dip Alem Portalı + + + Çok Oyunculu + + + Çiftlik Hayvanları + + + Damızlık Hayvanlar + + + İksir Yapımı + + + deadmau5, Minecraft'ı çok seviyor! + + + Domuzadamlar, sen onlara saldırmadığın sürece sana saldırmazlar. + + + Yatakta uyuyarak oyun canlanma noktanı değiştirebilir ve gündüz olmasını sağlayabilirsin. + + + Ateş toplarını Fersiz'e geri gönder! + + + Geceleri etrafı aydınlatmak için meşale yap. Canavarlar, meşale ile aydınlatılan yerlerden uzak duracaktır. + + + Maden arabası ve raylar ile istediğin yere hızlıca git! + + + Ağaç olması için birkaç fidan dik. + + + Portal inşa ederek başka bir boyuta, Dip Alem'e geçebilirsin. + + + Dümdüz aşağı veya yukarı kazmak iyi bir fikir değildir. + + + Kemik Tozu (İskelet kemiğinden üretilen), gübre olarak kullanılabilir ve ürünlerin çok hızlı bir şekilde büyümesini sağlar! + + + Ürpertenler, sana çok yaklaşırlarsa patlarlar! + + + Elindeki eşyayı yere bırakmak için {*CONTROLLER_VK_B*} düğmesine bas! + + + İşe uygun araç gereçler kullan! + + + Meşale yapmak için hiç kömür bulamıyorsan, ocak kullanarak ağaçlardan odun kömürü yapabilirsin. + + + Pişmiş domuz pirzolası, çiğ domuz pirzolasından daha fazla sağlık verir. + + + Eğer oyun zorluğunu Huzurlu olarak ayarlarsan, sağlığın otomatik olarak dolacak ve geceleri canavarlar gelmeyecek! + + + Bir kurdu evcilleştirmek için ona bir kemik ver. Böylece oturmasını veya seni takip etmesini sağlayabilirsin. + + + Envanter menüsündeyken, imleci menüden dışarı kaydırıp {*CONTROLLER_VK_A*} düğmesine basarak eşyaları yere bırakabilirsin. + + + Yeni bir İndirilebilir İçerik var! Ana Menüdeki Minecraft Mağazası düğmesinden ulaşabilirsin. + + + 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ç. + + + Oyunu daha aydınlık ya da karanlık yapmak için gamma ayarını değiştir. + + + 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. + + + Toprağı ekim yapmak üzere hazırlamak için çapa kullan. + + + Örümcekler, sen onlara saldırmadığın sürece gündüz vakti sana saldırmazlar. + + + Toprağı veya kumu bahçıvan küreği ile kazmak, elinle kazmaktan daha kolaydır! + + + Domuzlardan domuz pirzolası elde et ve sağlığını kazanmak için pişirip ye. + + + İneklerden deri elde et ve zırh yapmak için kullan. + + + Eğer boş bir kovan varsa su, lav ya da inek sütü ile doldurabilirsin! + + + Obsidiyen, lav ile suyun birbirine temas etmesiyle oluşur. + + + İstiflenebilir çitler oyuna eklendi! + + + Eğer elinde buğday varsa bazı hayvanlar seni takip edecektir. + + + Eğer bir hayvan, herhangi bir yönde 20 bloktan fazla uzaklaşamazsa, ortadan kaybolmayacaktır. + + + Evcil kurtlar, sağlığını kuyruklarının pozisyonu ile gösterir. Onları iyileştirmek için etle besle. + + + Yeşil boya elde etmek için ocakta kaktüs pişir. + + + Nasıl Oynanır menülerindeki Neler Yeni kısmını okuyarak oyun hakkındaki son güncellemeleri öğrenebilirsin. + + + Müzik: C418 + + + Notch kimdir? + + + Mojang'ın, çalışanlarından daha fazla ödülü var! + + + Bazı ünlü insanlar Minecraft oynuyor! + + + Notch'un Twitter'da bir milyondan fazla takipçisi bulunuyor! + + + Tüm İsveçliler sarışın değildir. Hatta Mojang'tan Jens gibi bazıları kızıldır! + + + Bir gün bu oyuna bir güncelleme gelecek! + + + Yan yana iki sandık koyarak tek bir geniş sandık oluşturabilirsin. + + + 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. + + + Sadece bir kova lav, ocak içerisinde 100 bloğu eritmek için kullanılabilir. + + + Nota bloğu tarafından çalınan enstrüman, altındaki malzemeye bağlı olarak değişebilir. + + + Kaynak blok yok edildiği zaman lavın ortadan TAMAMEN kaybolması dakikalar alabilir. + + + Parke taşı, Fersiz ateş toplarına karşı dayanıklıdır. Bu yüzden portal savunması için kullanışlıdır. + + + Işık kaynağı olarak kullanılabilen bloklar karı ve buzu eritir. Buna meşaleler, parıltı taşı ve Cadılar Bayramı Kabağı dahildir. + + + Zombiler ve İskeletler, eğer suyun altındalarsa gündüzleri de hayatta kalabilirler. + + + Tavuklar, her 5 veya 10 dakikada bir yumurtlarlar. + + + Obsidiyen, sadece elmastan bir kazma ile çıkartılabilir. + + + Ürpertenler, en kolay erişilebilen barut kaynağıdır. + + + 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. + + + Kurtlar Dip Alem'e geçemezler. + + + Kurtlar Ürpertenlere saldırmazlar. + + + Taş blokları ve cevherleri kazmak için gereklidir. + + + Kek tarifinde ve iksir yapımında malzeme olarak kullanılır. + + + 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. + + + 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. + + + 2 {*ICON_SHANK_01*} yeniler ve altından bir elma yapılabilir. + + + 2 {*ICON_SHANK_01*} yeniler ve 4 saniye boyunca sağlık verir. Bir elmadan veya altın külçelerinden üretilir. + + + 2 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. + + + Kızıltaş devrelerinde yineleyici, geciktirici ve/veya diyot olarak kullanılır. + + + Maden arabalarını yönlendirmek için kullanılır. + + + 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. + + + 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. + + + 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. + + + Kızıltaş yükü verildiği zaman eşyaları rastgele fırlatmak için kullanılır. + + + 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. + + + 2.5 {*ICON_SHANK_01*} yeniler. Ocakta çiğ balığın pişirilmesiyle yapılır. + + + 1 {*ICON_SHANK_01*} yeniler. + + + 1 {*ICON_SHANK_01*} yeniler. + + + 3 {*ICON_SHANK_01*} yeniler. + + + Yay için cephane olarak kullanılır. + + + 2.5 {*ICON_SHANK_01*} yeniler. + + + 1 {*ICON_SHANK_01*} yeniler. 6 defa kullanılabilir. + + + 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Bunu yemek zehirlenmene neden olabilir. + + + 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. + + + 4 {*ICON_SHANK_01*} yeniler. Çiğ domuz pirzolasının ocakta pişirilmesiyle yapılır. + + + 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Evcilleştirmek için bir Oseloya da verilebilir. + + + 3 {*ICON_SHANK_01*} yeniler. Çiğ tavuğun ocakta pişirilmesiyle yapılır. + + + 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. + + + 4 {*ICON_SHANK_01*} yeniler. Çiğ etin ocakta pişirilmesiyle yapılır. + + + Raylar boyunca seni, bir hayvanı veya bir canavarı taşımak için kullanılır. + + + Açık mavi yün yapmak için boya olarak kullanılır. + + + Camgöbeği yün yapmak için boya olarak kullanılır. + + + Mor yün yapmak için boya olarak kullanılır. + + + Açık yeşil yün yapmak için boya olarak kullanılır. + + + Gri yün yapmak için boya olarak kullanılır. + + + 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. + + + Kitaplar ve haritalar yapmak için kullanılır. + + + Kitap rafı oluşturmak veya efsunlanarak Efsunlu Kitap yapmak için kullanılabilir. + + + Mavi yün yapmak için boya olarak kullanılır. + + + Müzik CDleri çalar. + + + Dayanıklı araçlar, silahlar veya zırh yapmak için bunları kullan. + + + Turuncu yün yapmak için boya olarak kullanılır. + + + Koyunlardan toplanır ve boyalar ile renklendirilebilir. + + + İnşaat malzemesi olarak kullanılabilir ve boyanabilir. Bu tarif tavsiye edilmez çünkü Yün, Koyunlardan kolayca elde edilebilmektedir. + + + Siyah yün yapmak için boya olarak kullanılır. + + + Raylar boyunca mal taşımak için kullanılır. + + + İçine kömür konulduğunda raylar boyunca hareket eder ve diğer maden arabalarını iter. + + + Suda, yüzmekten daha hızlı hareket edebilmek için kullanılır. + + + Yeşil yün yapmak için boya olarak kullanılır. + + + Kırmızı yün yapmak için boya olarak kullanılır. + + + 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. + + + Pembe yün yapmak için boya olarak kullanılır. + + + Kahverengi yün yapmak için boya olarak, kurabiyede malzeme olarak veya Kakao Tohumları yetiştirmek için kullanılır. + + + Gümüş rengi yün yapmak için boya olarak kullanılır. + + + Sarı yün yapmak için boya olarak kullanılır. + + + Ok ile mesafeli saldırılara imkan tanır. + + + Giyildiği zaman giyen kişiye 5 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 5 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Bu malzemeden yapılmış araçlar üretmek için kullanılabilen, parlak bir külçe. Ocakta cevherin eritilmesiyle üretilmiş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. + + + 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. + + + Giyildiği zaman giyen kişiye 8 Zırh verir. + + + Giyildiği zaman giyen kişiye 6 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Giyildiği zaman giyen kişiye 6 Zırh verir. + + + Demir kapılar sadece Kızıltaş, düğmeler veya devre anahtarları ile açılabilir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Odun blokları, ele göre daha hızlı bir şekilde kesmek için kullanılır. + + + Ekinler için hazırlamak üzere toprak ve çim blokları sürmek için kullanılır. + + + Ahşap kapılar, kullanarak, üzerlerine vurarak veya Kızıltaş ile açılır. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 4 Zırh verir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 5 Zırh verir. + + + Kompakt merdivenler yapmak için kullanılır. + + + Mantar yahnisi koymak için kullanılır. Yahni yenildiği zaman kase kaybolmaz. + + + Su, lav ve süt koymak ve taşımak için kullanılır. + + + Su koymak ve taşımak için kullanılır. + + + Senin veya diğer oyuncular tarafından yazılan metni gösterir. + + + Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. + + + 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. + + + Lav koymak ve taşımak için kullanılır. + + + Güneş'in ve Ay'ın konumlarını gösterir. + + + Başlangıç noktanı gösterir. + + + Elindeyken keşfedilen bölgenin resmini oluşturur. Bu, yol bulmak için kullanılabilir. + + + Süt koymak ve taşımak için kullanılır. + + + Ateş yakmak, TNT'yi tutuşturmak ve inşa edildiği zaman portalı açmak için kullanılır. + + + Balık yakalamak için kullanılır. + + + 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. + + + İnşaat malzemesi olarak kullanılır ve birçok şeyin üretiminde de kullanılabilir. Herhangi bir tip odundan üretilebilir. + + + İnşaat malzemesi olarak kullanılır. Normal kum gibi yer çekiminden etkilenmez. + + + İnşaat malzemesi olarak kullanılır. + + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Uzun merdivenler yapmak için kullanılır. Birbirinin üstüne yerleştirilen iki levha, normal boyutta ikili levha bloğu oluşturur. + + + Işık çıkarmak için kullanılır. Meşaleler ayrıca karı ve buzu eritir. + + + Meşale, ok, tabela, merdiven, çit üretmek amacıyla ve araçlar ile silahlar için de sap olarak kullanılı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. + + + Üzerinden atlanamayan bir duvar olarak kullanılır. Oyuncular, hayvanlar ve canavarlar için 1.5, diğer bloklar için 1 blok uzundur. + + + Dikine tırmanmak için kullanılır. + + + Haritadaki herkes yataktaysa, gecenin herhangi bir anından zamanı gündüze çevirmek için kullanılır ve oyuncunun canlanma noktasını değiştirir. +Kullanılan yünün rengi ne olursa olsun yatak her zaman aynı renktir. + + + Normal üretime göre daha fazla eşya üretebilmene imkan tanır. + + + Cevher eritmeni, odun kömürü ve cam yapmanı, balık ve pirzola pişirmeni sağlar. + + + Demir Balta + + + Kızıltaş Lambası + + + Orman Odunu Basamak + + + Huş Odunu Basamak + + + Geçerli Kontroller + + + Kafatası + + + Kakao + + + Ladin Odunu Basamak + + + Ejderha Yumurtası + + + Son Taşı + + + Son Portalı Çerçevesi + + + Kum Taşı Basamak + + + Eğrelti Otu + + + Çalı + + + Dizilim + + + Üretim + + + Kullan + + + Eylem + + + Sessizce İlerle/Alçal + + + Sessizce İlerle + + + Bırak + + + Elindeki Eşyayı Değiştir + + + Duraklat + + + Bak + + + Hareket Et/Koş + + + Envanter + + + Zıpla/Yüksel + + + Zıpla + + + Son Portalı + + + Bal Kabağı Sapı + + + Kavun + + + İnce Cam + + + Çit Kapısı + + + Sarmaşık + + + Kavun Sapı + + + Demir Parmaklık + + + Çatlak Taş Tuğlalar + + + Yosunlu Taş Tuğlalar + + + Taş Tuğlalar + + + Mantar + + + Mantar + + + Yontma Taş Tuğlalar + + + Tuğla Basamak + + + Dip Alem Yumrusu + + + Dip Alem Tuğlası Basamağı + + + Dip Alem Tuğlası Çiti + + + Kazan + + + Simya Standı + + + Efsun Masası + + + Dip Alem Tuğlası + + + Gümüşçün Parke Taşı + + + Gümüşçün Taşı + + + Taş Tuğla Basamak + + + Nilüfer Yaprağı + + + Miselyum + + + Gümüşçün Taşı Tuğlası + + + Kamera Modunu Değiştir + + + 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. + + + 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. + + + Daha çok eşya toplayıp ürettikçe envanterin dolacaktır.{*B*} + Envanterini açmak için{*CONTROLLER_ACTION_INVENTORY*} düğmesine bas. + + + Topladığın odundan keresteler üretilebilir. Bunun için üretim arabirimini aç.{*PlanksIcon*} + + + 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*} + + + 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. + + + Üretim arabirimini açmak için{*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. + + + 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. + + + Hareket etmek için{*CONTROLLER_ACTION_MOVE*} çubuğu kullan. + + + Yukarıya, aşağıya ve etrafa bakmak için{*CONTROLLER_ACTION_LOOK*} çubuğu kullan. + + + 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. + + + 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... + + + Zıplamak için{*CONTROLLER_ACTION_JUMP*} düğmesine bas. + + + 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*} + + + + Ç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. + + + + Konteyneri aç + + + 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*} + + + 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*} + + + + 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. + + + + + Yakınlarda geceyi güvenli şekilde geçirmen için tamamlayabileceğin terk edilmiş bir Madenci barınağı var. + + + + 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*} + + + 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. + + + Elinde tuttuğun eşyayı değiştirmek için{*CONTROLLER_ACTION_LEFT_SCROLL*} ile{*CONTROLLER_ACTION_RIGHT_SCROLL*} düğmelerini kullan. + + + 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*} + + + 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*} + + + Artı imlecini üretim masasına doğrultup{*CONTROLLER_ACTION_USE*} düğmesine basarak aç. + + + Üretim masası seçiliyken, artı imlecini istediğin yere doğrult ve{*CONTROLLER_ACTION_USE*} düğmesini kullanarak üretim masasını yerleştir. + + + 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. + + + + + + + + + + + + + + + + + + + + + + + + 1. Dizilim + + + Hareket (Uçarken) + + + Oyuncular/Davet Et + + + + + + 3. Dizilim + + + 2. Dizilim + + + + + + + + + + + + + + + {*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. + + + {*B*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. + + + + + + + + + + + + + + + + + + + + + + + + + + + Gümüşçün Bloğu + + + Taş Levha + + + Demir depolamanın kompakt bir yolu. + + + Demir Bloğu + + + Meşe Odunu Levha + + + Kum Taşı Levha + + + Taş Levha + + + Altın depolamanın kompakt bir yolu. + + + Çiçek + + + Beyaz Yün + + + Turuncu Yün + + + Altın Bloğu + + + Mantar + + + Gül + + + Parke Taşı Levha + + + Kitap Rafı + + + TNT + + + Tuğlalar + + + Meşale + + + Obsidiyen + + + Yosunlu Taş + + + Dip Alem Tuğlası Levha + + + Meşe Odunu Levha + + + Taş Tuğla Levha + + + Tuğla Levha + + + Orman Odunu Levha + + + Huş Odunu Levha + + + Ladin Odunu Levha + + + Galibarda Yün + + + Huş Yaprakları + + + Ladin Yaprakları + + + Meşe Yaprakları + + + Cam + + + Sünger + + + Orman Yaprakları + + + Yapraklar + + + Meşe + + + Ladin + + + Huş + + + Ladin Odunu + + + Huş Odunu + + + Orman Odunu + + + Yün + + + Pembe Yün + + + Gri Yün + + + Açık Gri Yün + + + Açık Mavi Yün + + + Sarı Yün + + + Limon Yeşili Yün + + + Camgöbeği Yün + + + Yeşil Yün + + + Kırmızı Yün + + + Siyah Yün + + + Mor Yün + + + Mavi Yün + + + Kahverengi Yün + + + Meşale (Kömür) + + + Parıltı Taşı + + + Ruh Kumu + + + Dip Alem Kütlesi + + + Laciverttaş Bloğu + + + Laciverttaş Cevheri + + + Portal + + + Cadılar Bayramı Kabağı + + + Şeker Kamışı + + + Kil + + + Kaktüs + + + Bal Kabağı + + + Çit + + + Müzik Kutusu + + + Laciverttaş depolamanın kompakt bir yolu. + + + Yatay Kapı + + + Kilitli Sandık + + + Diyot + + + Yapışkan Piston + + + Piston + + + Yün (herhangi bir renk) + + + Ölü Çalı + + + Pasta + + + Nota Bloğu + + + Fırlatıcı + + + Uzun Çimen + + + + + + Yatak + + + Buz + + + Üretim Masası + + + Elmas depolamanın kompakt bir yolu. + + + Elmas Bloğu + + + Ocak + + + Ekim Toprağı + + + Mahsul + + + Elmas Cevheri + + + Canavar Canlandırıcı + + + Ateş + + + Meşale (Odun Kömürü) + + + Kızıltaş Tozu + + + Sandık + + + Meşe Odunu Basamak + + + Tabela + + + Kızıltaş Cevheri + + + Demir Kapı + + + Basınç Plakası + + + Kar + + + Düğme + + + Kızıltaş Meşalesi + + + Şalter + + + Ray + + + Merdiven + + + Ahşap Kapı + + + Taş Basamak + + + Dedektörlü Ray + + + Enerjili Ray + + + Ocak yapmaya yetecek kadar parke taşı topladın. Şimdi üretim masanı kullanarak bir ocak üret. + + + Olta + + + Saat + + + Parıltı Taşı Tozu + + + Ocaklı Maden Arabası + + + Yumurta + + + Pusula + + + Çiğ Balık + + + Gül Kırmızısı + + + Kaktüs Yeşili + + + Kakao Çekirdekleri + + + Pişmiş Balık + + + Boya Tozu + + + Mürekkep Kesesi + + + Sandıklı Maden Arabası + + + Kartopu + + + Kayık + + + Deri + + + Maden Arabası + + + Eyer + + + Kızıltaş + + + Süt Kovası + + + Kağıt + + + Kitap + + + Balçık Topu + + + Tuğla + + + Kil + + + Şeker Kamışları + + + Laciverttaş + + + Harita + + + Müzik Plağı - "13" + + + Müzik Plağı - "kedi" + + + Yatak + + + Kızıltaş Yineleyici + + + Kurabiye + + + Müzik Plağı - "bloklar" + + + Müzik Plağı - "mellohi" + + + Müzik Plağı - "stal" + + + Müzik Plağı - "strad" + + + Müzik Plağı - "cıvıltı" + + + Müzik Plağı - "uzak" + + + Müzik Plağı - "AVM" + + + Pasta + + + Gri Boya + + + Pembe Boya + + + Limon Yeşili Boya + + + Mor Boya + + + Camgöbeği Boya + + + Açık Gri Boya + + + Karahindiba Sarısı + + + Kemik Tozu + + + Kemik + + + Şeker + + + Açık Mavi Boya + + + Galibarda Boya + + + Turuncu Boya + + + Tabela + + + Deri Tunik + + + Demir Göğüs Zırhı + + + Elmas Göğüs Zırhı + + + Demir Miğfer + + + Elmas Miğfer + + + Altın Miğfer + + + Altın Göğüs Zırhı + + + Altın Pantolon + + + Deri Çizmeler + + + Demir Çizmeler + + + Deri Pantolon + + + Demir Pantolon + + + Elmas Pantolon + + + Deri Başlık + + + Taş Çapa + + + Demir Çapa + + + Elmas Çapa + + + Elmas Balta + + + Altın Balta + + + Ahşap Çapa + + + Altın Çapa + + + Zincir Göğüs Zırhı + + + Zincir Pantolon + + + Zincir Çizmeler + + + Ahşap Kapı + + + Demir Kapı + + + Zincir Miğfer + + + Elmas Çizmeler + + + Tüy + + + Barut + + + Buğday Tohumu + + + Kase + + + Mantar Yahnisi + + + İp + + + Buğday + + + Pişmiş Domuz Pirzolası + + + Tablo + + + Altın Elma + + + Ekmek + + + Çakmak Taşı + + + Çiğ Domuz Pirzolası + + + Sopa + + + Kova + + + Su Kovası + + + Lav Kovası + + + Altın Çizmeler + + + Demir Külçe + + + Altın Külçe + + + Çakmak Taşı ve Çelik + + + Kömür + + + Odun Kömürü + + + Elmas + + + Elma + + + Yay + + + Ok + + + Müzik Plağı - "koruma" + + + + Ü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*} + + + + + Ü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*} + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + Ü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*} + + + + Topladığın odunlardan kalas üretilebilir. Kalas simgesini seç ve {*CONTROLLER_VK_A*} düğmesine basarak üret.{*PlanksIcon*} + + + + 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. + + + + + Ü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. + + + + + {*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. + + + + + 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. + + + + + Ü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. + + + + + Bazı eşyalar üretim masası kullanılarak üretilemez, bunlar için ocak gerekir. Şimdi bir ocak yapın.{*FurnaceIcon*} + + + + Çakıl Taşı + + + Altın Cevheri + + + Demir Cevheri + + + Lav + + + Kum + + + Kum Taşı + + + Kömür Cevheri + + + {*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. + + + + + Burası ocak arabirimi. Ocak sayesinde eşyaları eriterek değiştirebilirsin. Örneğin, ocakta demir cevheri eritip onları demir külçelerine çevirebilirsin. + + + + + Ü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. + + + + Odun + + + Meşe Odunu + + + + 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. + + + + {*B*} + Envanteri tekrar görmek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Envanteri nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + 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. + + + + + {*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. + + + + + İmleçte bir eşya varken imleci arabirimin dışına çıkarırsan, eşyayı bırakabilirsin. + + + + + 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. + + + + + İ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. + + + + Eğitimin ilk aşamasını tamamladın. + + + + Cam yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? + + + 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? + + + Dünya üzerinde bir yere ocağı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullanıp ardından da ocağı aç. + + + 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*} + + + 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. + + + İ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*} + + + + Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_ACTION_MENU_PAGEDOWN*} düğmesine bas. + + + + + Burası üretim arabirimidir. Bu arabirim topladığın eşyaları birleştirip yeni eşyalar üretebilmeni sağlar. + + + + + Yaratıcılık modu envanterinden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_ACTION_MENU_PAGEDOWN*} düğmesine bas. + + + + {*B*} + Geçerli eşyayı yapmak için gereken bileşenleri görmek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + {*B*} + Eşya açıklamasını göstermek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Üretimi nasıl yapacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} ile Grup Tipi sekmeleri arasından almak istediğin eşyanın grup tipini seç. + + + + {*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. + + + + + 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. + + + + + Envanterden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + + + + + İ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. + + + + + İ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. + + + + + İ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. + + + + Su + + + Cam Şişe + + + Su Şişesi + + + Örümcek Gözü + + + Altın Keseği + + + Dip Alem Yumrusu + + + {*splash*}{*prefix*}{*postfix*}İksiri + + + Mayalı Örümcek Gözü + + + Kazan + + + Sonveren Gözü + + + Parıldayan Kavun + + + Alaz Tozu + + + Magma Özü + + + Simya Standı + + + Fersiz Gözyaşı + + + Bal Kabağı Çekirdekleri + + + Kavun Çekirdekleri + + + Çiğ Tavuk Eti + + + Müzik Plağı - "11" + + + Müzik Plağı - "neredeyiz şimdi" + + + Makas + + + Pişmiş Tavuk Eti + + + Sonveren İncisi + + + Kavun Dilimi + + + Alaz Çubuğu + + + Çiğ Sığır Eti + + + Biftek + + + Çürümüş Et + + + Efsunlu Şişe + + + Meşe Kerestesi + + + Ladin Kerestesi + + + Huş Kerestesi + + + Çimen Bloğu + + + Toprak + + + Parke Taşı + + + Orman Kerestesi + + + Huş Fidanı + + + Orman Ağacı Fidanı + + + Taban Kayası + + + Fidan + + + Meşe Fidanı + + + Ladin Fidanı + + + Taş + + + Eşya Çerçevesi + + + {*CREATURE*} Canlandır + + + Dip Alem Tuğlası + + + Kor + + + Kor (Odun Kömürü) + + + Kor (Kömür) + + + Kafatası + + + Kafa + + + %s Kafası + + + Ürperten Kafası + + + İskelet Kafatası + + + Soluk İskelet Kafatası + + + Zombi Kafası + + + 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 + + Kazı Yorgunluğu + + + Çabukluk + + + Zayıflık + + + Kuvvet + + + Ateş Direnci + + + Doygunluk + Direnç - - Ateş Direnci + + Zıplama Güçlendirici - - Suda Soluma + + Solgun - - Görünmezlik + + Sağlık Güçlendirici - - Körlük - - - Gece Görüşü - - - Açlık - - - Zehir + + Soğurum @@ -5266,9 +6065,78 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? III + + Görünmezlik + IV + + Suda Soluma + + + Ateş Direnci + + + Gece Görüşü + + + Zehir + + + Açlık + + + : Soğurum + + + : Doygunluk + + + : Sağlık Güçlendirici + + + Körlük + + + : Solgun + + + Sade + + + İnceltilmiş + + + Yayık + + + Berrak + + + Sütlü + + + Tuhaf + + + Yağlı + + + Hafif + + + Bozan + + + Tatsız + + + Hacimli + + + Yumuşak + Fırlatılabilen @@ -5278,50 +6146,14 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Yavan - - Yumuşak + + Gösterişli - - Berrak + + Ferahlatıcı - - Sütlü - - - Yayık - - - Sade - - - İnceltilmiş - - - Tuhaf - - - Tatsız - - - Hacimli - - - Bozan - - - Yağlı - - - Hafif - - - Tatlı - - - Latif - - - Koyu + + Alımlı Zarif @@ -5329,149 +6161,152 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Havalı - - Alımlı - - - Gösterişli - - - Arıtılmış - - - Ferahlatıcı - Işıltılı - - Tesirli - - - Fena - - - Kokusuz - Acı Sert + + Kokusuz + + + Tesirli + + + Fena + + + Tatlı + + + Arıtılmış + + + Koyu + + + Latif + + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla onarır. + + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını anında azaltır. + + + İ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. + 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. + + + Bütün iksirlerin temeli olarak kullanılır. İksir oluşturmak için simya standında kullan. + İğrenç Kokulu - - Bütün iksirlerin temeli olarak kullanılır. İksir oluşturmak için simya standında kullan. - - - 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. - - - İ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. - - - İksirden etkilenen oyuncuların ve yaratıkların saldırı sırasında verdikleri hasarı 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. - - - İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını anında azaltır. - - - İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla onarır. - - - İksirden etkilenen oyuncuları, hayvanları ve yaratıkları; ateşe, lava ve menzilli Alaz saldırılarına karşı bağışık hale getirir . - - - İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla azaltır. + + Vuruş Keskinlik - - Vuruş + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla azaltır. - - Eklembacaklı Felaketi + + Saldırı Hasarı Geri Fırlatma - - Ateş Nazarı + + Eklembacaklı Felaketi - - Koruma + + Hız - - Ateşten Koruma + + Zombi Takviyeleri - - Hafif Düşüş + + Atın Zıplama Kuvveti - - Patlamadan Koruma + + Uygulandığında: - - Mermiden Koruma + + Geri Fırlatma Direnci - - Solunum + + Yaratık Takip Menzili - - Suya Yakınlık - - - Etkinlik + + Maksimum Sağlık İpeksi Dokunuş - - Kırılmaz + + Etkinlik - - Yağma + + Suya Yakınlık Talih - - Güç + + Yağma - - Alev + + Kırılmaz - - Yumruk + + Ateşten Koruma - - Sonsuzluk + + Koruma - - I + + Ateş Nazarı - - II + + Hafif Düşüş - - III + + Solunum + + + Mermiden Koruma + + + Patlamadan Koruma IV @@ -5482,23 +6317,29 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? VI + + Yumruk + VII - - VIII + + III - - IX + + Alev - - X + + Güç - - Zümrüt toplamak için Demir Kazma veya daha iyisi ile kazılabilir. + + Sonsuzluk - - Sandığa benzer ancak Sonveren Sandığına koyulan eşyalar oyuncunun tüm Sonveren Sandıklarında belirecektir, oyuncu farklı boyutlarda bile olsa. + + II + + + I Bağlı tetikleyiciden bir canlı geçtiği zaman etkinleşir. @@ -5509,44 +6350,59 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Zümrütleri derli toplu depolama yolu. - - Parketaşından yapılma bir duvar. + + Sandığa benzer ancak Sonveren Sandığına koyulan eşyalar oyuncunun tüm Sonveren Sandıklarında belirecektir, oyuncu farklı boyutlarda bile olsa. - - Silahlar, aletler ve zırhları tamir etmek için kullanılabilir. + + IX - - Dip Alem Kuvarsı üretmek için bir ocakta eritilebilir. + + VIII - - Dekorasyon olarak kullanılır. + + Zümrüt toplamak için Demir Kazma veya daha iyisi ile kazılabilir. - - Köylülerle takas edilebilir. - - - Dekorasyon olarak kullanılır. Çiçekler, Fidanlar, Kaktüsler ve Mantarlar ekilebilir. + + X 2 {*ICON_SHANK_01*} yeniler ve altın bir havuca dönüştürülebilir. Ekim toprağına ekilebilir. + + Dekorasyon olarak kullanılır. Çiçekler, Fidanlar, Kaktüsler ve Mantarlar ekilebilir. + + + Parketaşından yapılma bir duvar. + 0.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Ekim toprağına ekilebilir. - - 3 {*ICON_SHANK_01*} yeniler. Ocakta patates pişirilerek üretilir. + + Dip Alem Kuvarsı üretmek için bir ocakta eritilebilir. + + + Silahlar, aletler ve zırhları tamir etmek için kullanılabilir. + + + Köylülerle takas edilebilir. + + + Dekorasyon olarak kullanılır. + + + 4 {*ICON_SHANK_01*} yeniler. - 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. + 1 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. Eyerlenmiş bir domuzu sürerken onu kontrol etmeyi sağlar. - - 4 {*ICON_SHANK_01*} yeniler. + + 3 {*ICON_SHANK_01*} yeniler. Ocakta patates pişirilerek üretilir. + + + 3 {*ICON_SHANK_01*} yeniler. Havuç ve altın külçelerinden yapılır. Örs ile birlikte kullanılarak silah, aletler ve zırhları efsunlamak için kullanılır. @@ -5554,6 +6410,15 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? 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ç + + Balkabağı Turtası - - Patates - - - 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,72 +6557,76 @@ 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. + + + + Tasmayı boya + + + Bir eşya üzerinde çalışmaya başlamak için, onu ilk girdi yuvasına yerleştir. @@ -5776,8 +6636,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Örs arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - - Bir eşya üzerinde çalışmaya başlamak için, onu ilk girdi yuvasına yerleştir. + + + Ayrıca, ikinci yuvaya aynı eşyadan bir tane daha yerleştirilirse, ikisi birleştirilebilir. @@ -5785,23 +6646,13 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? İ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. - - - Ayrıca, ikinci yuvaya aynı eşyadan bir tane daha yerleştirilirse, ikisi birleştirilebilir. + + İşin ne kadar Tecrübe Seviyesine mal olacağı çıktının altında gösterilir. Yeterli Tecrübe Seviyen yoksa, tamir tamamlanamaz. Örste eşya efsunlamak için, ikinci girdi yuvasına bir Efsunlu Kitap yerleştir. - - - - İş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. @@ -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,14 +6733,24 @@ 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. Bu bölgede bir köylü ve içinde eşya satın almak için gereken Kağıt bulunan bir Sandık var. + + + + + Teklife açık olan eşyayı almak için köylüye ihtiyacı olan eşyaları {*CONTROLLER_VK_A*} düğmesine basarak ver. + + + + + Oyuncular envanterindeki eşyaları köylülerle takas edebilir. @@ -5899,19 +6760,14 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Takas hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + - Oyuncular envanterindeki eşyaları köylülerle takas edebilir. + Ç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. - - - - - Çeşitli takas işlemleri yapmak köylünün mevcut takas seçeneklerine rastgele eklemeler yapar veya teklif listesini yeniler. @@ -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,38 +1,123 @@  - - 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ç + + + Bölünmüş Ekran Çevrimiçi Kimlikleri + + + Kupalar + + + 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. + + + 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. + + + Çevirimiçi Kimlikler: + + + 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. + + + + Yama 1.04 (Oyun Güncellemesi 14) + + + Oyun İçi Çevrimiçi Kimlikler + + + Minecraft: PlayStation®Vita Edition oyununda neler yaptığıma bakın! + + + İndirme başarısız oldu. Lütfen daha sonra tekrar deneyin. + + + Kısıtlı NAT türü sebebiyle oyuna katılım başarısız oldu. Lütfen ağ ayarlarınızı kontrol edin. + + + Yükleme başarısız oldu. Lütfen daha sonra tekrar deneyin. + + + İndirme Tamamlandı! + + + Ş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. + + + + Kayıt tamamlanmadı + + + 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. + + + Yükleme İptal Edildi + + + Kayıt taşıma bölgesine bu kaydı yüklemeyi iptal ettiniz. + + + PS3™/PS4™ için kayıt yükle + + + Veri yükleniyor: %d%% + + + "PSN" + + + PS3™ kaydı indir + + + Veri indiriliyor: %d%% + + + Kaydediliyor + + + Yükleme Tamamlandı! + + + Bu kaydı yüklemek ve mevcut kayıt alanındaki kaydın üzerine yazmak istediğinizden emin misiniz? + + + Veri Dönüştürülüyor + + + KULLANILMIYOR + + + KULLANILMIYOR {*T3*}NASIL OYNANIR : YARATICILIK MODU{*ETW*}{*B*}{*B*} @@ -48,59 +133,54 @@ Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini ba 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. - - KULLANILMIYOR - - - KULLANILMIYOR - "KULLANILMIYOR" - - "KULLANILMIYOR" - - - Arkadaş Davet Et - 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? 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? - - Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. + + "KULLANILMIYOR" - - 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? + + Arkadaş Davet Et - - "PSN" bağlantısı koptu. Ana menüye dönülüyor. + + minecraftforum'da PlayStation®Vita Edition için bir bölüm bulunmaktadır. - - "PSN" bağlantısı koptu. + + Bu oyun hakkındaki en son haberlere @4JStudios ve @Kappische ile Twitter'dan ulaşabilirsin! - - 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? + + NOT USED - - 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? + + PlayStation®Vita sisteminde menüler arasında geçiş yapmak için dokunmatik ekranı kullanabilirsiniz! - - 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? + + Bir Sonveren Adam'ın gözlerinin içine bakma! - - Misafir oyuncular tam sürüm oyunu açamaz. Lütfen Sony Entertainment Network hesabınız ile giriş yapın. + + {*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. - - Çevrimiçi Kimlik + + {*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. - - Simya + + 4J Studios'un Herobrine'ı PlayStation®4 sistemi oyunundan çıkardığını düşünüyoruz ama emin değiliz. - - "PSN" hesabınızdan çıkış yaptığınızdan dolayı ana ekrana döndürüldünüz. + + Minecraft: PlayStation®Vita Edition birçok rekor kırdı! 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? @@ -108,15 +188,15 @@ Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini ba "Minecraft: PlayStation®Vita" Edition yüklenemedi ve devam edemiyor. + + Simya + + + "PSN" hesabınızdan çıkış yaptığınızdan dolayı ana ekrana döndürüldünüz. + 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. - - Ç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. - - - Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı Sony Entertainment Network hesabınız Çevrimiçi oyunlara giremiyor. - 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. @@ -124,116 +204,40 @@ Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini ba 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 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. + + Ç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. - - 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. + + Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı Sony Entertainment Network hesabınız Çevrimiçi oyunlara giremiyor. - - Bölünmüş Ekran Çevrimiçi Kimlikleri + + "PSN" bağlantısı koptu. Ana menüye dönülüyor. - - Kupalar + + "PSN" bağlantısı koptu. - - Çevirimiçi Kimlikler: + + Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. - - Oyun İçi Çevrimiçi Kimlikler + + 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? - - Minecraft: PlayStation®Vita Edition oyununda neler yaptığıma bakın! + + 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? - - 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. - + + Misafir oyuncular tam sürüm oyunu açamaz. Lütfen Sony Entertainment Network hesabınız ile giriş yapın. - - Yama 1.04 (Oyun Güncellemesi 14) + + Çevrimiçi Kimlik - - SELECT + + 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? - - 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 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? - - "PSN" e giriş yapmak ister misin? - - - - 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 sistemi - - - Ağ Modunu Değiştir - - - Ağ Modu Seç - - - 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. - - - Ad Hoc Ağı - - - "PSN" - - - PlayStation®3 sistemi Kaydını İndir - - - PlayStation®3/PlayStation®4 sistemi için Kayıt Yükle - - - Yükleme İptal Edildi - - - Kayıt taşıma bölgesine bu kaydı yüklemeyi iptal ettiniz. - - - Veri yükleniyor: %d%% - - - Veri indiriliyor: %d%% - - - Bu kaydı yüklemek ve mevcut kayıt alanındaki kaydın üzerine yazmak istediğinizden emin misiniz? - - - Veri Dönüştürülüyor - - - Kaydediliyor - - - Yükleme Tamamlandı! - - - Yükleme başarısız oldu. Lütfen daha sonra tekrar deneyin. - - - İndirme Tamamlandı! - - - İndirme başarısız oldu. Lütfen daha sonra tekrar deneyin. - - - Kısıtlı NAT türü sebebiyle oyuna katılım başarısız oldu. Lütfen ağ ayarlarınızı kontrol edin. - - - Ş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. - - - - Kayıt tamamlanmadı - - - 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. + + 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 @@  - - 主機儲存空間沒有足夠的可用空間來建立遊戲存檔。 + + 無法將設定儲存至 Sony Entertainment Network 帳戶。 - - 您已經登出 "PSN",因此返回標題畫面 + + Sony Entertainment Network 帳戶疑難 + + + 系統在存取您的 Sony Entertainment Network 帳戶時發生問題,因此您目前無法獲得獎盃。 + + + 這是 Minecraft: "PlayStation 3" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation 3" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? + + + 連線至無線隨意網路 + + + 這個遊戲有某些功能需要無線隨意網路連線,但您目前處於離線狀態。 + + + 無線隨意網路現處於離線狀態。 + + + 獎盃疑難 您已經登出 "PSN",因此配對遊戲已結束" + + 您已經登出 "PSN",因此返回標題畫面 + + + 主機儲存空間沒有足夠的可用空間來建立遊戲存檔。 + - 目前未登入。 - - - - 這個遊戲有某些功能需要連線至 "PSN" 才能使用,但您目前處於離線狀態。 - - - 無線隨意網路現處於離線狀態。 - - - 這個遊戲有某些功能需要無線隨意網路連線,但您目前處於離線狀態。 - - - 這個功能需要登入 "PSN" 才能使用。 + 目前未登入。 連線至 "PSN" - - 連線至無線隨意網路 + + 這個功能需要登入 "PSN" 才能使用。 - - 獎盃疑難 - - - 系統在存取您的 Sony Entertainment Network 帳戶時發生問題,因此您目前無法獲得獎盃。 - - - Sony Entertainment Network 帳戶疑難 - - - 無法將設定儲存至 Sony Entertainment Network 帳戶。 - - - 這是 Minecraft: PlayStation(R)3 Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! -解除完整版遊戲鎖定即可享受 Minecraft: PlayStation(R)3 Edition 的完整樂趣,而且還能透過 "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,3177 +1,738 @@  - - 新的下載內容現已推出!請選取主畫面的 [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*} -精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,能精製出的物品種類也較多。 - - - {*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*} - 這讓玩家可以將其他玩家或自己傳送到世界中的其他玩家身邊。 - - - - 下一頁 - - - 上一頁 - - - 基本介紹 - - - 平行顯示器 - - - 物品欄 - - - 箱子 - - - 精製 - - - 熔爐 - - - 分發器 - - - 豢養動物 - - - 繁殖動物 - - + 釀製 - - 附加能力 - - - 地獄傳送門 - - - 多人遊戲 - - - 分享螢幕擷取畫面 - - - 禁用關卡 - - - 創造模式 - - - 主持人與玩家選項 - - - 交易 - - - 鐵砧 - - - 終界 - - - {*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*} - - - - 能造成比用手劈砍更大的傷害。 - - - 用來挖泥土、青草、沙子、礫石及白雪時的速度,會比用手挖還要快。您需要用鏟子才能挖雪球。 - - - 您需要用十字鎬才能開採石頭相關方塊和礦石。 - - - 用來劈砍木頭相關方塊的速度,會比用手劈砍還要快。 - - - 用來在泥土和青草方塊上整地,以準備進行耕種。 - - - 木門只要透過使用或敲擊,或是使用紅石就能啟動。 - - - 鐵門只能透過紅石、按鈕或開關來開啟。 - - - 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 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + Minecraft 商店 - - 可用來產生光線,還能融化白雪和冰塊。 + + 旋轉 - - 所有形式的木頭都可以精製成木板。木板可當做建築材料,還能用來精製出許多種物品。 + + 隱藏 - - 可當做建築材料。沙岩不會受到重力的影響,不像普通的沙子會因為重力而往下掉。 + + 清除所有空格 - - 可當做建築材料。 + + 確定要離開目前的遊戲,並加入新的遊戲嗎?您將因此失去尚未儲存的遊戲進度。 - - 可用來精製出火把、箭、牌子、梯子、柵欄,還能當做工具與武器的把手。 + + 確定要用這個世界目前的存檔,來覆寫同一世界之前的存檔嗎? - - 當遊戲世界進入夜晚時,只要世界中的所有玩家都上床睡覺,就能讓時間立刻從夜晚跳到早晨,而且上床也會改變玩家的再生點。 -無論您用哪種色彩的羊毛來精製床舖,床舖的顏色都會是一樣的。 + + 確定要不儲存即離開嗎?您將因此失去在這個世界的所有遊戲進度! - - 與一般的精製介面相較之下,精製台可讓您精製出更多種類的物品。 + + 開始遊戲 - - 可讓您熔煉礦石、製造木炭與玻璃,還能烹煮生魚和生豬肉。 + + 離開遊戲 - - 可讓您在裡面存放方塊和物品。把 2 個箱子並排放置,就能製造出有 2 倍容量的大箱子。 + + 儲存遊戲 - - 可當做無法躍過的屏障。對玩家、動物及怪物而言,柵欄有 1.5 個方塊高;但對於其他方塊來說,柵欄只有 1 個方塊高。 + + 不儲存即離開 - - 可讓您上下攀爬。 + + 按下 START 按鈕來加入遊戲 - - 只要透過使用或敲擊,或是使用紅石就能啟動。活板門的功用與一般的門相同,但大小是 1 x 1 的方塊,而且放置後會平躺在地面上。 + + 太棒了!您獲得 1 個玩家圖示,主角就是 Minecraft 裡的 Steve! - - 可顯示您或其他玩家輸入的文字。 + + 太棒了!您獲得 1 個玩家圖示,主角就是 Creeper! - - 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 + + 解除完整版遊戲鎖定 - - 可用來產生爆炸。炸藥放置後,只要用打火鐮點燃,或利用電流即可啟動。 + + 由於您嘗試加入的玩家執行的遊戲版本較新,所以您無法加入此遊戲。 - - 可用來裝燉蘑菇。當您吃掉燉蘑菇時,碗會保留下來。 + + 新世界 - - 可用來裝水、熔岩及牛奶,讓您能夠把這些物品運送到其他地方。 + + 已解除獎項鎖定! - - 可用來裝水,讓您能夠把水運送到其他地方。 + + 您正在玩試玩版遊戲,但您必須擁有完整版遊戲才能儲存遊戲進度。 +想要立刻解除完整版遊戲鎖定嗎? - - 可用來裝熔岩,讓您能夠把熔岩運送到其他地方。 + + 好友 - - 可用來裝牛奶,讓您能夠把牛奶運送到其他地方。 + + 我的分數 - - 可用來生火、點燃炸藥,以及啟動蓋好的傳送門。 + + 整體 - - 可用來釣魚。 + + 請稍候 - - 會顯示太陽與月亮目前的位置。 + + 沒有搜尋結果 - - 會持續指向您的起點。 + + 篩選條件: - - 用手握住時,會顯示某個地區中已探索區域的影像。可讓您用來尋找能前往某個地點的路。 + + 由於您嘗試加入的玩家執行的遊戲版本較舊,所以您無法加入此遊戲。 - - 可射出箭來進行遠距攻擊。 + + 連線中斷 - - 可與弓組成武器。 + + 與伺服器的連線中斷。即將離開遊戲並返回主畫面。 - - 可回復 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*},或可用熔爐烹煮。可以餵豹貓來馴服牠們。 + + 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成嚴重的傷害。千萬要留意 Creeper,因為當您嘗試遠離時,Creeper 可不會取消爆炸攻擊! - - 可回復 2.5 個 {*ICON_SHANK_01*}。在熔爐烹煮生魚即可獲得。 + + 主題 - - 可回復 2 個 {*ICON_SHANK_01*},還能精製成金蘋果。 + + 角色外觀套件 - - 可回復 2 個 {*ICON_SHANK_01*},並自動回復生命值 4 秒鐘。由蘋果和碎金塊製作而成。 + + 允許好友的好友加入 - - 可回復 2 個 {*ICON_SHANK_01*}。吃下這個會讓您中毒。 + + 踢除玩家 - - 可用來製作蛋糕,以及做為釀製藥水的材料。 + + 確定要將該玩家踢出這個遊戲嗎?除非您讓這個世界重新開始,該玩家才能重新加入遊戲。 - - 開啟時會送出電流。當拉桿開啟或關閉後,就會保持在這個狀態,直到下次開啟或關閉為止。 + + 玩家圖示套件 - - 會持續送出電流,也可以在連接到方塊側邊時作為接收器或傳送器。 -紅石火把還可以當做亮度較低的光源。 + + 您無法加入這個遊戲,因為只有主持人的好友才能加入。 - - 可在紅石電路中當做中繼器、延遲器,及/或真空管。 + + 損毀的下載內容 - - 按下後即會啟動並送出電流,持續時間大約 1 秒鐘,然後就會再次關閉。 + + 這個下載內容已經損毀,因此無法使用。您必須刪除該下載內容,然後從 [Minecraft 商店] 選單重新安裝。 - - 可用來裝填物品,並在收到紅石送出的電流時隨機射出其中的物品。 + + 您有部分的下載內容已經損毀,因此無法使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] 選單重新安裝。 - - 啟動後會播放 1 個音符的聲音,受到敲擊後就會變更音符的音調。把音符方塊放在不同的方塊上面,就會改變樂器的種類。 + + 無法加入遊戲 - - 可用來引導礦車的行進路線。 + + 已選取 - - 有動力時,會讓行經的礦車加速。沒有動力時,會讓碰到的礦車停在上面。 + + 已選取的角色外觀: - - 功能跟壓板一樣 (會在啟動時送出紅石信號),但只能靠礦車來啟動。 + + 取得完整版 - - 可用來沿著軌道把您、動物或怪物載到其他地方。 + + 解除材質套件鎖定 - - 可用來沿著軌道運送物品。 + + 您必須先解除這個材質套件的鎖定才能在您的世界中使用。 +您想要立刻解除這個材質套件的鎖定嗎? - - 當裡面有煤塊時,可自動在軌道上移動,或是推動其他礦車。 + + 試用版材質套件 - - 可讓您在水面上移動,而且速度會比游泳快。 + + 種子 - - 可從綿羊身上收集,還能用染料染色。 + + 解除角色外觀套件鎖定 - - 可當做建築材料,還能用染料染色。但我們不建議您使用這個製作方法,因為您可以輕易地從綿羊身上取得羊毛。 + + 如要使用您選取的角色外觀,您必須先解除這個角色外觀套件的鎖定。 +您想要立刻解除這個角色外觀套件的鎖定嗎? - - 可當做染料來製造黑色羊毛。 + + 您目前所使用的是試用版的材質套件。只有解除完整版鎖定才能將這個世界存檔。 +您想要解除完整版材質套件的鎖定嗎? - - 可當做染料來製造綠色羊毛。 + + 下載完整版 - - 可當做染料來製造棕色羊毛、製作餅乾的材料,或者可用來種植可可豆。 + + 您沒有這個世界所使用的混搭套件或材質套件! +您想要立刻安裝混搭套件或材質套件嗎? - - 可當做染料來製造銀色羊毛。 + + 取得試用版 - - 可當做染料來製造黃色羊毛。 + + 沒有材質套件 - - 可當做染料來製造紅色羊毛。 + + 解除完整版鎖定 - - 可用來讓作物、樹木、茂密青草、巨型蘑菇及花朵立刻長大,還能與某些染料組合成新的染料。 + + 下載試用版 - - 可當做染料來製造粉紅色羊毛。 + + 遊戲模式已經變更 - - 可當做染料來製造橘色羊毛。 + + 啟用此選項時,只限被邀請的玩家才能加入。 - - 可當做染料來製造亮綠色羊毛。 + + 啟用此選項時,您好友的朋友便可以加入遊戲。 - - 可當做染料來製造灰色羊毛。 + + 啟用此選項時,玩家可以對其他玩家造成傷害。只有在生存模式才會生效。 - - 可當做染料來製造淺灰色羊毛。 -(注意:您也可以把灰色染料與骨粉組合成淺灰色染料,讓您可以用 1 個墨囊製造出 4 個淺灰色染料,而不是 3 個。) + + 普通 - - 可當做染料來製造淺藍色羊毛。 + + 非常平坦 - - 可當做染料來製造水藍色羊毛。 + + 啟用此選項時,本遊戲將成為線上遊戲。 - - 可當做染料來製造紫色羊毛。 + + 停用此選項時,加入遊戲的玩家需要取得同意才能建造或開採。 - - 可當做染料來製造紫紅色羊毛。 + + 啟用此選項時,會在遊戲世界中產生村落和地下要塞等建築。 - - 可當做染料來製造藍色羊毛。 + + 啟用此選項時,會在地上世界與地獄世界中產生地形完全平坦的世界。 - - 可用來播放唱片。 + + 啟用此選項時,玩家的再生點附近會產生一個裝著有用物品的箱子。 - - 可用來製造非常強韌且堅硬的工具、武器或護甲。 + + 啟用此選項時,火可能會蔓延到鄰近的易燃方塊。 - - 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 + + 啟用此選項時,炸藥會在點燃後爆炸。 - - 可用來製造書本和地圖。 + + 啟用此選項時,會重新產生地獄世界。如果您的舊存檔中沒有地獄要塞,這將會很有用。 - - 可用來製造書架,或經過附加能力來製成「已附加能力的書本」。 + + 關閉 - - 放置在附加能力台附近時可以創造更具威力的附加能力。 + + 遊戲模式:創造 - - 可當做裝飾品。 + + 生存 - - 可用鐵鎬或材質更堅硬的十字鎬開採,然後在熔爐中熔煉成黃金錠塊。 + + 創造 - - 可用石鎬或材質更堅硬的十字鎬開採,然後在熔爐中熔煉成鐵錠塊。 + + 重新為您的世界命名 - - 可用十字鎬開採來收集煤塊。 + + 請為您的世界輸入新的名稱 - - 可用石鎬或材質更堅硬的十字鎬開採來收集青金石。 + + 遊戲模式:生存 - - 可用鐵鎬或材質更堅硬的十字鎬開採來收集鑽石。 + + 在生存模式中建立 - - 可用鐵鎬或材質更堅硬的十字鎬開採來收集紅石塵。 + + 重新為存檔命名 - - 可用十字鎬開採來收集鵝卵石。 + + 自動存檔倒數 %d... - - 可用鏟子來收集,能當做建築材料。 + + 開啟 - - 可讓您栽種,最後會長成樹木。 + + 在創造模式中建立 - - 這不會破裂。 + + 產生雲朵 - - 會讓接觸到的任何東西著火。可以用桶子來收集。 + + 您要如何處理這個遊戲存檔? - - 可用鏟子來收集,能在熔爐中熔煉成玻璃。當下方沒有其他方塊時,會受重力的影響而往下掉。 + + 平行顯示器大小 (分割畫面) - - 可用鏟子來收集,挖掘時偶爾會挖出打火石。當下方沒有其他方塊時,會受重力的影響而往下掉。 + + 材料 - - 可用斧頭劈砍來收集,能精製成木板,或是當做燃料使用。 + + 燃料 - - 在熔爐中熔煉沙子即可獲得。可當做建築材料,但當您開採玻璃時,玻璃會破碎。 - - - 用十字鎬開採石頭即可獲得,可用來建造熔爐或石製工具。 - - - 將黏土放在熔爐中經過火燒之後即可獲得。 - - - 可在熔爐中燒成磚塊。 - - - 破裂之後會掉落黏土球,可在熔爐中將黏土球燒成磚塊。 - - - 壓縮的雪球存放方式。 - - - 可用鏟子挖掘來製造雪球。 - - - 破裂時偶爾會出現小麥種子。 - - - 可精製成染料。 - - - 可與碗一起精製成燉蘑菇。 - - - 可用鑽石鎬來開採。當靜止的熔岩碰到水時,就會產生黑曜石。黑曜石可用來建造傳送門。 - - - 可產生遊戲世界中的怪物。 - - - 可放置在地上來傳送電流。若搭配藥水一起釀製,將可延長效果持續時間。 - - - 完全成熟後,即可收成來收集小麥。 - - - 已經準備好能栽種種子的地面。 - - - 可用熔爐烹煮來取得綠色染料。 - - - 可精製成砂糖。 - - - 可當做頭盔使用,或是與火把一起精製成南瓜燈籠。同時也是製作南瓜派的主要材料。 - - - 點燃後會永遠燃燒。 - - - 會讓行經其上的所有東西減速。 - - - 站在傳送門中,即可讓您在地上世界與地獄世界之間往返。 - - - 可當做熔爐的燃料,或是精製成火把。 - - - 殺死蜘蛛即可獲得,可用來精製成弓或釣魚竿,或放置在地面上形成絆索。 - - - 殺死雞即可獲得,可用來精製成箭。 - - - 殺死 Creeper 即可獲得,可用來精製成炸藥,或當做釀製藥水的材料。 - - - 在農田栽種即可長成作物。切記:種子需要足夠的光線才能成長! - - - 收成作物即可獲得,可用來精製成食物。 - - - 挖掘礫石即可獲得,可用來精製成打火鐮。 - - - 對豬使用時,可讓您騎在豬身上,然後利用木棍上的胡蘿蔔操控豬的行進方向。 - - - 挖掘白雪即可獲得,可讓您投擲。 - - - 殺死乳牛即可獲得,可用來精製成護甲或用來製作書本。 - - - 殺死史萊姆即可獲得,可當做釀製藥水的材料,或精製成黏性活塞。 - - - 雞會隨機下蛋,而蛋可用來精製成食物。 - - - 開採閃石即可獲得,可透過精製變回閃石方塊,或搭配藥水一起釀製來提高效果的威力。 - - - - 殺死骷髏後即可獲得,可用來精製成骨粉,餵狼吃還可馴服狼。 - - - 設法讓骷髏殺死 Creeper 後即可獲得,可利用點唱機來播放。 - - - 可用來滅火,或協助作物生長。您可用桶子來裝水。 - - - 破碎時偶爾會掉落樹苗,讓您能重新栽種並長成樹木。 - - - 能夠在地城裡找到,可當做建築材料和裝飾品。 - - - 可用來取得綿羊身上的羊毛,以及獲得樹葉方塊。 - - - 當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是以上任何的紅石物品來啟動活塞),會在情況允許時延伸出去推動方塊。 - - - 當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是以上任何的紅石物品來啟動活塞),會在情況允許時延伸出去推動方塊。黏性活塞縮回時,會把接觸到活塞延伸部分的方塊一起拉回。 - - - 由石頭方塊製造而成,通常能在地下要塞中找到。 - - - 可當做屏障,類似柵欄。 - - - 和門類似,但主要與柵欄搭配使用。 - - - 精製西瓜片即可獲得。 - - - 可用來取代玻璃方塊的透明方塊。 - - - 栽種即可長成南瓜。 - - - 栽種即可長成西瓜。 - - - 會在終界人死亡時掉落,投擲後玩家即會在失去些許生命值的同時,被傳送到終界珍珠所在之處。 - - - 上面長草的泥土方塊。可用鏟子來收集,能當做建築材料。 - - - 可當做建築材料和裝飾品。 - - - 行經時會減緩您的速度。可使用大剪刀摧毀,並收集絲線。 - - - 摧毀時會產生 Silverfish。如果附近有隻 Silverfish 遭到攻擊,也可能會產生另一隻 Silverfish。 - - - 放置後會隨著時間生長。使用大剪刀即可收集。可用來當梯子一樣攀爬。 - - - 在上面行走時會感覺滑溜。如果冰塊下面有其他方塊,當您摧毀冰塊時,冰塊就會變成水。如果冰塊太靠近光源或放在地獄裡,就會融化。 - - - 可當做裝飾品。 - - - 可用來釀製藥水或尋找地下要塞。由 Blaze 掉落,而 Blaze 多半出沒於地獄要塞的裡面或附近。 - - - 可用來釀製藥水,會在 Ghast 死亡時掉落。 - - - 會在殭屍 Pigmen 死亡時掉落。在地獄可找到殭屍 Pigmen。用來做為釀製藥水的材料。 - - - 可用來釀製藥水。生長在地獄要塞中,也可以種植在魂沙上。 - - - 會依據使用對象的不同而有各種不同的效果。 - - - 可用來裝水,並可在釀製台當成製作藥水一開始時就必須用到的材料。 - - - 這是有毒的食物和釀製物品,會在蜘蛛或穴蜘蛛被玩家殺死時掉落。 - - - 可用來釀製藥水,且絕大部分用來製造具備負面效果的藥水。 - - - 可用來釀製藥水,或與其他物品一起精製成終界之眼或熔岩球。 - - - 可用來釀製藥水。 - - - 可用來釀製藥水和噴濺藥水。 - - - 可以裝滿雨水或以一水桶的水承滿,然後即可用來幫玻璃瓶裝水。 - - - 投擲後即會顯示前往終界入口的方向。將十二個終界之眼放置於終界入口框架上後,即可啟動終界入口。 - - - 可用來釀製藥水。 - - - 和青草方塊類似,但非常適合在上面栽種蘑菇。 - - - 會浮在水面,且可在上面行走。 - - - 可用來建造地獄要塞,且不受 Ghast 的火球傷害。 - - - 用在地獄要塞。 - - - 出現於地獄要塞,會在地獄結節破裂後掉落。 - - - 您可在附加能力台使用您的經驗值,將特殊能力附加到劍、鎬、斧、鏟、弓和護甲上。 - - - 終界入口可由十二個終界之眼啟動,玩家可經由終界入口進入終界。 - - - 可用來組成終界入口。 - - - 這是一種只會在終界出現的方塊,防爆性很高,很適合當做建造材料。 - - - 擊敗終界的龍就會產生這個方塊。 - - - 投擲後會掉落經驗光球,收集光球即可增加您的經驗值。 - - - 很適合用來讓東西著火,或是從發射器發射可任意開火。 - - - - 類似展示櫃,可將物品或方塊放置在裡面展示。 - - - 投擲出去後可再生出其所顯示類型的生物。 - - - 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 - - - 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 - - - 在熔爐中熔煉地獄血石即可獲得。能精製成地獄磚塊方塊。 - - - 有動力時會發出光線。 - - - 用來耕種即可收集可可豆。 - - - 生物頭顱可當做裝飾品擺放,或置於頭盔空格中當做面具戴。 - - - 烏賊 - - - 被殺死時會掉落墨囊。 - - - 乳牛 - - - 被殺死時會掉落皮革。您也可以用桶子來擠牛奶。 - - - 綿羊 - - - 被剪羊毛時會掉落羊毛 (前提是牠的羊毛還沒被剪掉)。可將綿羊染色來擁有不同色彩的羊毛。 - - - - - - 被殺死時會掉落羽毛,還會隨機下蛋。 - - - - - - 被殺死時會掉落豬肉。您還可以使用鞍座來騎在豬上。 - - - - - - 狼是溫馴的動物,但當您攻擊牠時,牠就會攻擊您。您可以使用骨頭來馴服狼,這會讓牠跟著您走,並攻擊任何正在攻擊您的東西。 - - - 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 - - - Portfolio Director - - - Product Manager - - - Marketing - - - Community Manager - - - Europe Localization Team - - - Redmond Localization Team - - - Asia Localization Team - - - User Research Team - - - MGS Central Teams - - - Milestone Acceptance Tester - - - Special Thanks - - - Test Manager - - - Senior Test Lead - - - SDET - - - Project STE - - - Additional STE - - - Test Associates - - - Jon Kagstrom - - - Tobias Mollstam - - - Rise Lugo - - - 木劍 - - - 石劍 - - - 鐵劍 - - - 鑽石劍 - - - 黃金劍 - - - 木鏟 - - - 石鏟 - - - 鐵鏟 - - - 鑽石鏟 - - - 黃金鏟 - - - 木鎬 - - - 石鎬 - - - 鐵鎬 - - - 鑽石鎬 - - - 黃金鎬 - - - 木斧 - - - 石斧 - - - 鐵斧 - - - 鑽石斧 - - - 黃金斧 - - - 木鋤 - - - 石鋤 - - - 鐵鋤 - - - 鑽石鋤 - - - 黃金鋤 - - - 木門 - - - 鐵門 - - - 鎖鏈盔 - - - 鎖鏈護甲 - - - 鎖鏈護脛 - - - 鎖鏈靴 - - - 皮帽 - - - 鐵盔 - - - 鑽石盔 - - - 黃金盔 - - - 皮衣 - - - 鐵護甲 - - - 鑽石護甲 - - - 黃金護甲 - - - 皮褲 - - - 鐵護脛 - - - 鑽石護脛 - - - 黃金護脛 - - - 皮靴 - - - 鐵靴 - - - 鑽石靴 - - - 黃金靴 - - - 鐵錠塊 - - - 黃金錠塊 - - - 桶子 - - - 水桶 - - - 熔岩桶 - - - 打火鐮 - - - 蘋果 - - - - - - - - - 煤塊 - - - 木炭 - - - 鑽石 - - - 木棍 - - - - - - 燉蘑菇 - - - 絲線 - - - 羽毛 - - - 火藥 - - - 小麥種子 - - - 小麥 - - - 麵包 - - - 打火石 - - - 生豬肉 - - - 熟豬肉 - - - 圖畫 - - - 金蘋果 - - - 牌子 - - - 礦車 - - - 鞍座 - - - 紅石 - - - 雪球 - - - 小船 - - - 皮革 - - - 牛奶桶 - - - 磚塊 - - - 黏土 - - - 甘蔗 - - - 紙張 - - - 書本 - - - 史萊姆球 - - - 箱子礦車 - - - 熔爐礦車 - - - - - - 指南針 - - - 釣魚竿 - - - 時鐘 - - - 閃石塵 - - - 生魚 - - - 熟魚 - - - 染粉 - - - 墨囊 - - - 玫瑰紅 - - - 仙人掌綠 - - - 可可豆 - - - 青金石 - - - 紫色染料 - - - 水藍色染料 - - - 淺灰色染料 - - - 灰色染料 - - - 粉紅色染料 - - - 亮綠色染料 - - - 蒲公英黃 - - - 淺藍色染料 - - - 紫紅色染料 - - - 橘色染料 - - - 骨粉 - - - 骨頭 - - - 砂糖 - - - 蛋糕 - - - 床舖 - - - 紅石中繼器 - - - 餅乾 - - - 地圖 - - - 唱片:13 - - - 唱片:Cat - - - 唱片:Blocks - - - 唱片:Chirp - - - 唱片:Far - - - 唱片:Mall - - - 唱片:Mellohi - - - 唱片:Stal - - - 唱片:Strad - - - 唱片:Ward - - - 唱片:11 - - - 唱片:Where are we now - - - 大剪刀 - - - 南瓜子 - - - 西瓜子 - - - 生雞肉 - - - 熟雞肉 - - - 生牛肉 - - - 牛排 - - - 腐肉 - - - 終界珍珠 - - - 西瓜片 - - - Blaze 棒 - - - Ghast 淚水 - - - 碎金塊 - - - 地獄結節 - - - {*splash*}{*prefix*}{*postfix*}藥水 - - - 玻璃瓶 - - - 水瓶 - - - 蜘蛛眼 - - - 發酵蜘蛛眼 - - - Blaze 粉 - - - 熔岩球 - - - 釀製台 - - - 水槽 - - - 終界之眼 - - - 發光西瓜 - - - 經驗藥水瓶 - - - 火彈 - - - 火彈 (木炭) - - - 火彈 (煤塊) - - - 物品框架 - - - 再生 {*CREATURE*} - - - 地獄磚塊 - - - 骷髏 - - - 骷髏頭 - - - 凋零骷髏 - - - 殭屍頭顱 - - - 頭顱 - - - %s 頭顱 - - - Creeper 頭顱 - - - 石頭 - - - 青草方塊 - - - 泥土 - - - 鵝卵石 - - - 橡樹厚木板 - - - 杉樹厚木板 - - - 樺樹厚木板 - - - 熱帶叢林厚木板 - - - 樹苗 - - - 橡樹樹苗 - - - 杉樹樹苗 - - - 樺樹樹苗 - - - 熱帶叢林樹苗 - - - 基岩 - - - 水體 - - - 熔岩 - - - 沙子 - - - 沙岩 - - - 礫石 - - - 黃金礦石 - - - 鐵礦石 - - - 煤礦石 - - - 木頭 - - - 橡樹木頭 - - - 杉樹木頭 - - - 樺樹木頭 - - - 熱帶叢林木頭 - - - 橡樹 - - - 杉樹 - - - 樺樹 - - - 樹葉 - - - 橡樹樹葉 - - - 杉樹樹葉 - - - 樺樹樹葉 - - - 熱帶叢林樹葉 - - - 海綿 - - - 玻璃 - - - 羊毛 - - - 黑色羊毛 - - - 紅色羊毛 - - - 綠色羊毛 - - - 棕色羊毛 - - - 藍色羊毛 - - - 紫色羊毛 - - - 水藍色羊毛 - - - 淺灰色羊毛 - - - 灰色羊毛 - - - 粉紅色羊毛 - - - 亮綠色羊毛 - - - 黃色羊毛 - - - 淺藍色羊毛 - - - 紫紅色羊毛 - - - 橘色羊毛 - - - 白色羊毛 - - - 花朵 - - - 玫瑰 - - - 蘑菇 - - - 黃金方塊 - - - 黃金的壓縮存放方式。 - - - 鐵方塊 - - - 鐵的壓縮存放方式。 - - - 石板 - - - 石板 - - - 沙岩板 - - - 橡樹木板 - - - 鵝卵石板 - - - 磚塊板 - - - 石磚塊板 - - - 橡樹木板 - - - 杉樹木板 - - - 樺樹木板 - - - 熱帶叢林木板 - - - 地獄磚塊板 - - - 磚塊 - - - 炸藥 - - - 書架 - - - 苔蘚石 - - - 黑曜石 - - - 火把 - - - 火把 (煤塊) - - - 火把 (木炭) - - - - - - 怪物產生器 - - - 橡樹木梯 - - - 箱子 - - - 紅石塵 - - - 鑽石礦石 - - - 鑽石方塊 - - - 鑽石的壓縮存放方式。 - - - 精製台 - - - 作物 - - - 農地 - - - 熔爐 - - - 牌子 - - - 木門 - - - 梯子 - - - 軌道 - - - 動力軌道 - - - 偵測器軌道 - - - 石梯 - - - 拉桿 - - - 壓板 - - - 鐵門 - - - 紅石礦石 - - - 紅石火把 - - - 按鈕 - - - 白雪 - - - 冰塊 - - - 仙人掌 - - - 黏土 - - - 甘蔗 - - - 點唱機 - - - 柵欄 - - - 南瓜 - - - 南瓜燈籠 - - - 地獄血石 - - - 魂沙 - - - 閃石 - - - 傳送門 - - - 青金石礦石 - - - 青金石方塊 - - - 青金石的壓縮存放方式。 - - + 分發器 - - 音符方塊 + + 箱子 - - 蛋糕 + + 附加能力 - - 床舖 + + 熔爐 - - 蜘蛛網 + + 這款遊戲目前沒有此類型的下載內容。 - - 茂密青草 + + 確定要刪除這個遊戲存檔嗎? - - 枯灌木 + + 正在等待核准 - - 真空管 + + 已審查 - - 上鎖的箱子 + + %s 已經加入遊戲。 - - 活板門 + + %s 已經離開遊戲。 - - 羊毛 (不限色彩) + + %s 已被踢出遊戲。 - - 活塞 - - - 黏性活塞 - - - Silverfish 方塊 - - - 石磚塊 - - - 長滿青苔的石磚塊 - - - 裂開的石磚塊 - - - 刻紋石磚塊 - - - 蘑菇 - - - 蘑菇 - - - 鐵條 - - - 玻璃片 - - - 西瓜 - - - 南瓜莖 - - - 西瓜莖 - - - 藤蔓 - - - 柵欄門 - - - 磚塊梯 - - - 石磚塊梯 - - - Silverfish 石 - - - Silverfish 鵝卵石 - - - Silverfish 石磚塊 - - - 菌絲體 - - - 睡蓮 - - - 地獄磚塊 - - - 地獄磚塊柵欄 - - - 地獄磚塊梯 - - - 地獄結節 - - - 附加能力台 - - + 釀製台 - - 水槽 + + 輸入牌子的文字 - - 終界入口 + + 請輸入牌子上的文字 - - 終界入口框架 + + 輸入標題 - - 終界石 + + 試玩版遊戲時間結束 - - 龍蛋 + + 遊戲人數已滿 - - 矮樹 + + 已無空位,因此無法加入遊戲 - - + + 請輸入文章的標題 - - 沙岩梯 + + 請輸入文章的描述 - - 杉樹木梯 - - - 樺樹木梯 - - - 熱帶叢林木梯 - - - 紅石燈 - - - 可可 - - - 骷髏 - - - 目前的控制方式 - - - 配置 - - - 移動/奔跑 - - - 觀看 - - - 暫停 - - - 跳躍 - - - 跳躍/往上飛 - - + 物品欄 - - 依序更換手中的物品 + + 材料 - - 動作 + + 輸入說明 - - 使用 + + 請輸入文章的說明 - - 精製 + + 輸入描述 - - 丟棄 + + 現在正在播放: - - 潛行 + + 確定要把這個關卡加入禁用關卡清單嗎? +如果您選取 [確定],將會離開這個遊戲。 - - 潛行/往下飛 + + 從禁用清單中移除 - - 變更視角模式 + + 自動存檔時間間隔 - - 玩家/邀請 + + 已禁用的關卡 - - 移動 (飛翔時) + + 您要加入的遊戲已經列在您的禁用關卡清單中。 +如果您要加入這個遊戲,系統會把這個關卡從禁用關卡清單中移除。 - - 配置 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;]]> + + %s 的遊戲 - - <![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;]]> + + 正在載入錯誤 - - <![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*} 即可。當您往前按住 {*CONTROLLER_ACTION_MOVE*} 時,角色將會繼續奔跑,直到奔跑時間耗盡或是食物消耗完畢為止。 - - - 按下 {*CONTROLLER_ACTION_JUMP*} 即可跳躍。 - - - 按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源,但您可能需要精製出工具來開採某些方塊… - - - 請按住 {*CONTROLLER_ACTION_ACTION*} 來砍下 4 個木頭方塊 (樹幹)。{*B*}當方塊被劈砍下來後,只要站在隨後出現的浮空物品旁邊,該物品就會進入您的物品欄。 - - - 按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟精製介面。 - - - 在您不斷收集和精製物品的同時,物品欄也會逐漸填滿。{*B*} - 請按下 {*CONTROLLER_ACTION_INVENTORY*} 來開啟物品欄。 - - - 當您四處移動、開採和攻擊時,就會消耗食物列 {*ICON_SHANK_01*}。奔跑和快速跳躍時所消耗的食物量,會比行走和正常跳躍時所消耗的多。 - - - 如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。只要吃下食物,就能補充食物列。 - - - 只要把食物握在手中,然後按住 {*CONTROLLER_ACTION_USE*} 即可吃下該食物來補充您的食物列。當食物列全滿時,您無法繼續吃東西。 - - - 您的食物列即將耗盡,而且您失去了部分生命值。請吃下物品欄中的牛排來補充食物列,並開始回復生命值。{*ICON*}364{*/ICON*} - - - 您收集來的木頭可以精製成木板。請開啟精製介面來精製木板。{*PlanksIcon*} - - - 許多精製過程包含好幾個步驟。現在您已經有幾片木板,就能夠精製出更多物品了。請建造 1 個精製台。{*CraftingTableIcon*} - - - 如果您想要加快收集方塊的速度,可以製造專為該工作所設計的工具。某些工具上有使用木棍做成的把手。現在請精製出幾根木棍。{*SticksIcon*} - - - 使用 {*CONTROLLER_ACTION_LEFT_SCROLL*} 和 {*CONTROLLER_ACTION_RIGHT_SCROLL*} 即可變更手中握住的物品。 - - - 使用 {*CONTROLLER_ACTION_USE*} 即可使用物品、與物體互動,以及放置某些物品。如果您想要重新撿起已經放置好的物品,只要使用正確的工具敲擊該物品即可撿起。 - - - 當您選取精製台時,請將游標對準您要放置精製台的地方,然後使用 {*CONTROLLER_ACTION_USE*} 來放置。 - - - 請將游標對準精製台,然後按下 {*CONTROLLER_ACTION_USE*} 來開啟。 - - - 鏟子可加快您挖掘較軟方塊 (例如泥土及白雪) 的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度且較不容易損壞的工具。請製造 1 把木鏟。{*WoodenShovelIcon*} - - - 斧頭可加快劈砍木頭及木質方塊的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度且較不容易損壞的工具。請製造 1 把木斧。{*WoodenHatchetIcon*} - - - 十字鎬可加快您挖掘較硬方塊 (例如石頭及礦石) 的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度且較不容易損壞的工具,讓您能夠開採材質較硬的資源。請製造 1 把木鎬。{*WoodenPickaxeIcon*} - - - 請開啟容器 - - - - 夜晚很快就會來臨,沒有做好準備就在夜晚外出是很危險的事。您可以精製出護甲及武器來保護自己,但最實用的方法就是建造安全的棲身處。 - - - - - 附近有個廢棄的礦工棲身處,您可以完成該建築來當做您夜晚時的安全棲身處。 - - - - - 您還需要收集資源才能蓋好這個棲身處。您可以用任何材質的方塊來蓋牆壁和屋頂,但您還必須製作 1 個門、幾扇窗戶,還有光源。 - - - - 請使用十字鎬來開採石頭方塊。石頭方塊在開採後會挖出鵝卵石。只要收集 8 個鵝卵石方塊,就能建造 1 座熔爐。您可能需要挖開一些泥土才能找到石頭,所以請記得使用鏟子來挖泥土。{*StoneIcon*} - - - 您已經收集到足夠的鵝卵石來建造熔爐了。請使用精製台來建造熔爐。 - - - 請使用 {*CONTROLLER_ACTION_USE*} 把熔爐放置在遊戲世界中,然後開啟熔爐。 - - - 請使用熔爐來製作一些木炭。如果您正在等待木炭製作完成,我們建議您利用這段等待時間收集更多建築材料來蓋好棲身處。 - - - 請使用熔爐來製作一些玻璃。如果您正在等待玻璃製作完成,我們建議您利用這段等待時間收集更多建築材料來蓋好棲身處。 - - - 良好的棲身處是有門的,讓您能夠輕易地進出棲身處,而不必費力把牆壁挖開再補好牆壁來進出。現在請精製 1 個木門。{*WoodenDoorIcon*} - - - 請使用 {*CONTROLLER_ACTION_USE*} 來放置門。您可以使用 {*CONTROLLER_ACTION_USE*} 來開、關遊戲世界中的木門。 - - - 當夜晚來臨時,棲身處裡面可能會很暗,因此您必須放置光源,好讓您能看見周遭的環境。現在請使用精製台,把木棍跟木炭精製成火把。{*TorchIcon*} - - - 您已經完成教學課程的第一部分。 - - + {*B*} - 請按下 {*CONTROLLER_VK_A*} 繼續教學課程。{*B*} - 如果您覺得自己已經準備好,可以獨自玩遊戲了,請按下 {*CONTROLLER_VK_B*}。 + 按下 {*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*}。 - - - - 請使用 {*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*} 即可顯示物品說明。 - - - {*B*} - 按下 {*CONTROLLER_VK_X*} 即可顯示要精製出目前物品所需的材料。 - - - {*B*} - 請按下 {*CONTROLLER_VK_X*} 來再次顯示物品欄。 - - - - 請使用 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 來切換頂端的群組類型索引標籤,以便選取您想要精製的物品所屬的群組類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來選取您要精製的物品。 - - - - - 精製區域會顯示精製新物品所需的材料。按下 {*CONTROLLER_VK_A*} 即可精製物品,並將該物品放置在物品欄中。 - - - - 精製台可讓您精製出種類較多的物品。精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,讓您能夠使用更多樣化的材料組合。 - - - 精製介面的右下區域會顯示您的物品欄。這裡也會顯示目前所選取物品的說明,以及精製該物品所需的材料。 - - - 精製介面現在會顯示目前所選取物品的說明,告訴您該物品的用途。 - - - 精製介面現在會列出精製所選取物品的所需材料。 - - - 您之前收集的木頭可用來精製成木板。請選取木板圖示,然後按下 {*CONTROLLER_VK_A*} 來製造木板。{*PlanksIcon*} - - - 既然您已經建造好精製台,就應該將其放置在遊戲世界中,以便讓您能夠精製出更多種類的物品。{*B*} - 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 - - - 按下 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 即可切換至您想要精製的物品所屬的群組類型。請選取工具群組。{*ToolsIcon*} - - - 按下 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 即可切換至您想要精製的物品所屬的群組類型。請選取建築群組。{*StructuresIcon*} - - - 使用 {*CONTROLLER_MENU_NAVIGATE*} 即可切換至您想要精製的物品。某些物品會因為所用材料的不同而有不一樣的版本。請選取木鏟。{*WoodenShovelIcon*} - - - 許多精製過程包含好幾個步驟。現在您已經有幾片木板,就能夠精製出更多物品了。使用 {*CONTROLLER_MENU_NAVIGATE*} 即可切換至您想要精製的物品。請選取精製台。{*CraftingTableIcon*} - - - 有了您製造的這些工具,您就能更有效率地收集各種不同的資源。{*B*} - 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 - - - 某些物品無法用精製台來製造,必須靠熔爐來產生。現在請製造 1 座熔爐。{*FurnaceIcon*} - - - 請將您精製出的熔爐放置在遊戲世界中,最好是放置在您的棲身處裡面。{*B*} - 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 - - - 這是熔爐介面。熔爐可讓您透過火燒來改變物品。舉例來說,您可以使用熔爐把鐵礦石轉變成鐵錠塊。 - - - {*B*} - 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} - 如果您已經了解如何使用熔爐,請按下 {*CONTROLLER_VK_B*}。 - - - 您必須把一些燃料放在熔爐底部的空格中,熔爐頂端空格裡的物品才會受熱,然後熔爐就會起火,開始火燒上面的物品,並把成品放在右邊的空格中。 - - - 許多木質物品可以用來當做燃料,但並非每樣東西的燃燒時間都是相同的。還有其他物品也能拿來當做燃料,您可以多多嘗試。 - - - 當物品火燒完畢後,您就能把物品從成品區移動到物品欄中。您可以嘗試火燒不同的物品,看看會得到什麼成品。 - - - 如果您把木頭當做材料,就會製造出木炭。請在熔爐裡放些燃料,然後把木頭放在材料格裡。熔爐需要花些時間才能製造木炭,您可以趁這段時間去做其他的事,稍後再回來查看進度。 - - - 木炭可當做燃料使用,還能與木棍一起精製成火把。 - - - 把沙子放在材料格裡,就能製造出玻璃。請製造一些玻璃方塊來當做棲身處的窗戶。 - - - 這是釀製介面,您可以在此製作具備各種不同效果的藥水。 - - - {*B*} - 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} - 如果您已經了解如何使用釀製台,請按下 {*CONTROLLER_VK_B*}。 - - - 請將材料放在上方空格,再將藥水或水瓶置於下方空格,即可釀製藥水,一次最多只能釀製 3 瓶藥水。當您完成適當的組合後,便會展開釀製過程,不久即可製造出藥水。 - - - 釀製藥水必須先準備水瓶。大部分的藥水都是先用地獄結節做出粗劣藥水,再至少加入另一種材料,便能釀製出最後的成品。 - - - 您可以調整藥水的效果:加入紅石塵可增加效果的持久度,加入閃石塵則可讓效果更具威力。 - - - 加入發酵蜘蛛眼會破壞藥水,讓藥水出現反效果;加入火藥則可將藥水變成噴濺藥水,投擲噴濺藥水即可使藥水效力影響附近區域。 - - - 先將地獄結節加入水瓶,再加入熔岩球,即可製造防火藥水。 - - - 現在請按下 {*CONTROLLER_VK_B*} 來離開釀製介面。 - - - 您在這個地區可以找到釀製藥水所需的釀製台、水槽和裝滿物品的箱子。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解釀製和藥水的相關知識。{*B*} - 如果您已經了解釀製和藥水的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 釀製藥水的第一步就是製造水瓶。請從箱子中拿出玻璃瓶。 - - - 您可以從裝了水的水槽或水方塊中取水裝入玻璃瓶。請將游標指向水源,再按下 {*CONTROLLER_ACTION_USE*},即可將水裝入玻璃瓶中。 - - - 如果水槽空了,您可以用水桶幫水槽加水。 - - - 在釀製台上使用水瓶、地獄結節和熔岩球,即可製造防火藥水。 - - - - 手中持有藥水時,只要按住 {*CONTROLLER_ACTION_USE*} 即可使用藥水。若是一般藥水,您只要喝下藥水,即可在自己身上發揮藥水的效果。噴濺藥水則必須投擲出去,讓藥水的效果發揮在位於擊中處附近的生物上。 - 在一般藥水內加入火藥,即可製造噴濺藥水。 - - - - 將防火藥水用在自己身上。 - - - 既然您現在的身體已可抵抗火和熔岩,不妨前往之前因火或熔岩的阻礙而無法到達的區域。 - - - 這是附加能力介面,可讓您將特殊能力附加到武器、護甲及特定的工具上。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解附加能力介面的相關知識。{*B*} - 如果您已經了解附加能力介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 請先將物品放到附加能力空格中,才能對物品附加能力。武器、護甲和特定工具在附加能力後即可擁有特殊效果,比如更能抵抗傷害,或開採方塊時可收集到更多物品等。 - - - 當您將物品放到附加能力空格後,畫面右邊的按鈕會顯示多種隨機挑選的附加能力。 - - - 按鈕上的號碼代表附加該特殊能力到物品上所需的經驗等級。如果您的經驗等級不夠高,您就無法使用該按鈕。 - - - 請選取您想要的附加能力,然後按一下 {*CONTROLLER_VK_A*},即可將能力附加到物品上。附加能力會消耗您的經驗等級。 - - - 雖然可供您使用的附加能力皆為隨機出現,但某些效果較好的附加能力,只會在您經驗等級較高,且附加能力台的周圍被許多書架圍住來強化其威力時,才會出現。 - - - 您在這個地區可以找到附加能力台,以及一些能幫助您了解如何附加能力的其他物品。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解附加能力的相關知識。{*B*} - 如果您已經了解附加能力的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - - 您可使用附加能力台把特殊效果附加到武器、護甲和特定工具上,比如開採方塊時可收集到更多物品,或是更能抵抗傷害等。 - - - 把附加能力台的周圍用書架圍住,即可強化附加能力台的威力,您也因此可使用更高等級的附加能力。 - - - 對物品附加能力會消耗您的經驗等級。收集怪物和動物被殺死時掉落的光球、開採礦石、繁殖動物、釣魚和使用熔爐熔煉/烹煮物品,都可讓您累積經驗值。 - - - 您也可使用經驗藥水瓶增加經驗等級。只要投擲經驗藥水瓶,掉落處就會產生可以收集的經驗值光球。 - - - 您在這個地區的箱子中可以找到一些已附加能力的物品、經驗藥水瓶,以及待您使用附加能力台來嘗試附加能力的物品。 - - - 您現在坐在礦車中。如要離開礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*}。{*MinecartIcon*} - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解礦車的相關知識。{*B*} - 如果您已經了解礦車的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 礦車會在軌道上前進。您也可以製作內有熔爐的動力礦車,以及內有箱子的礦車。 - {*RailIcon*} - - - 您也可以精製出動力軌道,這會使用紅石火把及電路傳來的動力,使礦車速度加快。動力軌道還能與開關、拉桿及壓板連接,製造出更複雜的軌道系統。 - {*PoweredRailIcon*} - - - 您現在坐在小船上。如要離開小船,請把游標指向小船,然後按下 {*CONTROLLER_ACTION_USE*}。{*BoatIcon*} - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解小船的相關知識。{*B*} - 如果您已經了解小船的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 小船可讓您在水面上快速移動。您可以使用 {*CONTROLLER_ACTION_MOVE*} 和 {*CONTROLLER_ACTION_LOOK*} 來控制行進方向。 - {*BoatIcon*} - - - 您現在手中握著釣魚竿。請按下 {*CONTROLLER_ACTION_USE*} 來使用釣魚竿。{*FishingRodIcon*} - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解釣魚的相關知識。{*B*} - 如果您已經了解釣魚的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 按下 {*CONTROLLER_ACTION_USE*} 即可拋線來開始釣魚。再次按下 {*CONTROLLER_ACTION_USE*} 即可收線。 - {*FishingRodIcon*} - - - 如果您等到浮標沈到水面下時再收線,就能釣到魚。您可以吃生魚,也可以先用熔爐把魚煮熟後再吃。不論是生魚還是熟魚,吃下後都能回復您的生命值。 - {*FishIcon*} - - - 釣魚竿就跟許多其他工具一樣,有使用次數的限制,但用途可不限於釣魚喔!您可以多多實驗,看看釣魚竿還能釣上或啟動什麼東西... - {*FishingRodIcon*} - - - 這是床舖。當夜晚來臨時,把游標指向床舖並按下 {*CONTROLLER_ACTION_USE*} 即可睡覺,並在早晨醒來。{*ICON*}355{*/ICON*} - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解床舖的相關知識。{*B*} - 如果您已經了解床舖的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 床舖應該要放置在安全、具有足夠光線的地方,以免怪物在半夜吵醒您。當您使用過床舖後,您下次死亡時就會在那張床舖再生。 - {*ICON*}355{*/ICON*} - - - 如果您的遊戲中有其他玩家,每位玩家都必須同時躺在床上才能睡覺。 - {*ICON*}355{*/ICON*} - - - 這個地區有些簡單的紅石和活塞電路,還有個箱子,裡面裝了其他可用來擴大電路系統的物品。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解紅石電路和活塞的相關知識。{*B*} - 如果您已經了解紅石電路和活塞的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - - 拉桿、按鈕、壓板和紅石火把都可為電路提供動力。您可直接把這些東西連接到您想要啟動的物品上,或是利用紅石塵將它們連接起來。 - - - 動力來源的放置位置和方向,會改變它對周遭方塊的影響方式。舉例來說,如果您把紅石火把連接到方塊側邊,當這個方塊從其他來源獲得動力時,紅石火把就會熄滅。 + 按下 {*CONTROLLER_VK_A*} 即可進一步了解傳送門和地獄的相關知識。 {*B*} + 如果您已經了解傳送門和地獄的相關知識,請按下 {*CONTROLLER_VK_B*}。 @@ -3190,32 +751,10 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 活塞獲得動力時會延伸出去,並推動最多 12 個方塊。當黏性活塞縮回時,會拉回 1 個方塊,而且幾乎所有材質的方塊都可拉回。 {*ICON*}33{*/ICON*} - - - 這個地區的箱子中有些零件,可用來組成有活塞的電路。請使用或完成這個區域裡的電路,或是組成您自己的電路。在教學課程地區外,還有更多的範例可讓您參考。 - - - 這個地區有個通往地獄的傳送門! - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解傳送門和地獄的相關知識。 {*B*} - 如果您已經了解傳送門和地獄的相關知識,請按下 {*CONTROLLER_VK_B*}。 只要利用黑曜石方塊組合成有 4 個方塊寬、5 個方塊高的框架,就能製造傳送門。框架的 4 個邊角不需要放置方塊。 - - - 如要啟動地獄傳送門,只要用打火鐮點燃框架內側的黑曜石方塊即可。當傳送門的框架損壞、附近發生爆炸,或是有液體流過傳送門時,傳送門就會失效。 - - - - 如要使用地獄傳送門,請站在傳送門裡面。此時您會看到畫面變成紫色,還會聽到某種聲音。幾秒鐘後,您就會被傳送到地獄。 - - - 地獄是個危險的地方,到處都是熔岩,但也是收集地獄血石和閃石的好地方。地獄血石只要一點燃就會永遠燃燒,而閃石則可作為光源。 - 您可以利用地獄世界在地上世界中快速移動,因為在地獄世界移動 1 個方塊的距離,就等於在地上世界移動 3 個方塊的距離。 @@ -3227,53 +766,71 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 按下 {*CONTROLLER_VK_A*} 即可進一步了解創造模式的相關知識。{*B*} 如果您已經了解創造模式的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 在創造模式中,您擁有無限多的物品和方塊,且不需使用任何特殊工具,只要按一下即可摧毀方塊。您是無敵的,並且可以飛翔。 + + + 如要啟動地獄傳送門,只要用打火鐮點燃框架內側的黑曜石方塊即可。當傳送門的框架損壞、附近發生爆炸,或是有液體流過傳送門時,傳送門就會失效。 + - - 按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟創造模式物品欄介面。 + + 如要使用地獄傳送門,請站在傳送門裡面。此時您會看到畫面變成紫色,還會聽到某種聲音。幾秒鐘後,您就會被傳送到地獄。 - - 您必須設法移到這個洞的另一邊,才能繼續進行遊戲。 - - - 您已完成創造模式的教學課程。 - - - 這個地區已經準備好一塊農田。耕種能夠讓您建立一個可以重複提供食物與其他物品的再生來源。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解耕種的相關知識。{*B*} - 如果您已經了解耕種的相關知識,請按下 {*CONTROLLER_VK_B*} 。 - - - 小麥、南瓜和西瓜皆必須從種子開始栽種。小麥種子可以藉由破壞茂密青草或收成小麥來獲得。相對地,收成南瓜和西瓜,同樣也能收集到南瓜和西瓜種子。 - - - 在栽種種子前,需要先使用鋤頭將泥土方塊變成農田。在附近放置水源和光源,不但能使農田保持水分,還能讓作物生長得較快。 - - - 小麥的生長過程包含數個階段,當顏色轉深後,就表示可以收成了。{*ICON*}59:7{*/ICON*} - - - 南瓜和西瓜還需要在播種的方塊旁邊空出一格的空間,讓完全長成的莖葉能夠長出果實。 - - - 甘蔗必須栽種在青草、泥土,或沙子方塊上,並且需要和水體方塊相鄰。劈砍甘蔗方塊將會連帶使上方所有方塊一起掉落。{*ICON*}83{*/ICON*} - - - 仙人掌必須栽種在沙子上,最高可以長到三個方塊的高度。和甘蔗一樣,破壞最底層的方塊,就能夠連帶一起收集上方所有的方塊。{*ICON*}81{*/ICON*} - - - 蘑菇必須栽種在光線昏暗的區域,並且會蔓延至附近光線昏暗的其他方塊上。{*ICON*}39{*/ICON*} - - - 骨粉可以用來讓作物立刻達到完全成熟的階段,或是讓蘑菇長成巨型蘑菇。{*ICON*}351:15{*/ICON*} + + 地獄是個危險的地方,到處都是熔岩,但也是收集地獄血石和閃石的好地方。地獄血石只要一點燃就會永遠燃燒,而閃石則可作為光源。 您已完成耕種的教學課程。 + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用斧頭來劈砍樹幹。 + + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用十字鎬來開採石頭及礦石,但您可能需要用更好的材料來製造十字鎬,才能開採某些較硬的方塊。 + + + 某些工具比較適合用來攻擊敵人。請考慮使用劍來攻擊。 + + + 鐵傀儡還會自然出現來保護村落,如果您攻擊村民,就會遭到鐵傀儡的攻擊。 + + + 您必須完成教學課程,才能離開這個地區。 + + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用鏟子來開採材質較軟的方塊,例如泥土和沙子。 + + + 提示:按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源。但您可能需要精製出工具來開採某些方塊… + + + 河邊的箱子中有艘小船。如要放置小船,請把游標指向水面,然後按下 {*CONTROLLER_ACTION_USE*} 即可。當您把游標指向小船時,使用 {*CONTROLLER_ACTION_USE*} 即可上船。 + + + 池塘邊的箱子中有根釣魚竿。請把釣魚竿拿出箱子,然後選取它作為您手中握住的物品來使用。 + + + 這個更進階的活塞機械系統可產生會自行修復的橋樑喔!請按下按鈕啟動,然後觀察各個零件的互動方式,了解更多資訊。 + + + 您正在使用的工具受損了。工具每次使用時都會受損,到最後就會完全損壞。在物品欄中,物品下方的色彩列即為目前的損害狀態。 + + + 按住 {*CONTROLLER_ACTION_JUMP*} 即可往上游。 + + + 這個地區的軌道上有台礦車。如要坐上礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*} 即可。對按鈕使用 {*CONTROLLER_ACTION_USE*} 即可讓礦車移動。 + + + 製作鐵傀儡需要 4 個帶有指定圖案的鐵方塊,在中間的方塊上方放 1 個南瓜。鐵傀儡會攻擊您的敵人。 + + + 餵乳牛、Mooshroom 或綿羊吃小麥,餵豬吃胡蘿蔔,餵雞吃小麥種子或地獄結節,餵狼吃肉,然後這些動物就會開始尋找周遭也處於戀愛模式中的同種類動物。 + + + 當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,然後就會出現剛出生的小動物。小動物一開始會跟在父母身旁,之後就會長成一般成年動物的大小。 + + + 剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。 + 這個地區已經豢養數隻動物。您可以開始讓動物繁殖,培育小動物。 @@ -3287,29 +844,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 您必須餵動物吃特定的食物,讓動物進入「戀愛模式」,動物才能繁殖。 - - 餵乳牛、Mooshroom 或綿羊吃小麥,餵豬吃胡蘿蔔,餵雞吃小麥種子或地獄結節,餵狼吃肉,然後這些動物就會開始尋找周遭也處於戀愛模式中的同種類動物。 - - - 當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,然後就會出現剛出生的小動物。小動物一開始會跟在父母身旁,之後就會長成一般成年動物的大小。 - - - 剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。 - 當您手中握著動物的食物時,有些動物會跟著您,這可以協助您將一群動物聚集起來繁殖。{*ICON*}296{*/ICON*} - - - 您可以給野狼提供骨頭來馴服牠們。馴服成功後,狼的周圍會出現一些愛心。經過馴服的狼若沒有收到坐下的指示,會一直跟在玩家身邊並保護玩家。 - - - - 您已完成動物與繁殖的教學課程。 - - - 這個地區有一些南瓜和方塊可以用來製作雪人和鐵傀儡。 - {*B*} 按下 {*CONTROLLER_VK_A*} 即可進一步了解雪人和鐵傀儡的相關知識。{*B*} @@ -3321,51 +858,437 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 製作雪人需要將 2 個白雪方塊疊在一起,最頂端放 1 個南瓜。雪人會向您的敵人丟雪球。 - - 製作鐵傀儡需要 4 個帶有指定圖案的鐵方塊,在中間的方塊上方放 1 個南瓜。鐵傀儡會攻擊您的敵人。 + + + 您可以給野狼提供骨頭來馴服牠們。馴服成功後,狼的周圍會出現一些愛心。經過馴服的狼若沒有收到坐下的指示,會一直跟在玩家身邊並保護玩家。 + - - 鐵傀儡還會自然出現來保護村落,如果您攻擊村民,就會遭到鐵傀儡的攻擊。 + + 您已完成動物與繁殖的教學課程。 - - 您必須完成教學課程,才能離開這個地區。 + + 這個地區有一些南瓜和方塊可以用來製作雪人和鐵傀儡。 - - 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用鏟子來開採材質較軟的方塊,例如泥土和沙子。 + + 動力來源的放置位置和方向,會改變它對周遭方塊的影響方式。舉例來說,如果您把紅石火把連接到方塊側邊,當這個方塊從其他來源獲得動力時,紅石火把就會熄滅。 - - 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用斧頭來劈砍樹幹。 + + 如果水槽空了,您可以用水桶幫水槽加水。 - - 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用十字鎬來開採石頭及礦石,但您可能需要用更好的材料來製造十字鎬,才能開採某些較硬的方塊。 + + 在釀製台上使用水瓶、地獄結節和熔岩球,即可製造防火藥水。 - - 某些工具比較適合用來攻擊敵人。請考慮使用劍來攻擊。 + + + 手中持有藥水時,只要按住 {*CONTROLLER_ACTION_USE*} 即可使用藥水。若是一般藥水,您只要喝下藥水,即可在自己身上發揮藥水的效果。噴濺藥水則必須投擲出去,讓藥水的效果發揮在位於擊中處附近的生物上。 + 在一般藥水內加入火藥,即可製造噴濺藥水。 + - - 提示:按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源。但您可能需要精製出工具來開採某些方塊… + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解釀製和藥水的相關知識。{*B*} + 如果您已經了解釀製和藥水的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 您正在使用的工具受損了。工具每次使用時都會受損,到最後就會完全損壞。在物品欄中,物品下方的色彩列即為目前的損害狀態。 + + 釀製藥水的第一步就是製造水瓶。請從箱子中拿出玻璃瓶。 - - 按住 {*CONTROLLER_ACTION_JUMP*} 即可往上游。 + + 您可以從裝了水的水槽或水方塊中取水裝入玻璃瓶。請將游標指向水源,再按下 {*CONTROLLER_ACTION_USE*},即可將水裝入玻璃瓶中。 - - 這個地區的軌道上有台礦車。如要坐上礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*} 即可。對按鈕使用 {*CONTROLLER_ACTION_USE*} 即可讓礦車移動。 + + 將防火藥水用在自己身上。 - - 河邊的箱子中有艘小船。如要放置小船,請把游標指向水面,然後按下 {*CONTROLLER_ACTION_USE*} 即可。當您把游標指向小船時,使用 {*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*}。 + + + 拉桿、按鈕、壓板和紅石火把都可為電路提供動力。您可直接把這些東西連接到您想要啟動的物品上,或是利用紅石塵將它們連接起來。 + + + {*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*}。 當您拿著物品時,將游標移動到介面外,即可丟棄該物品。 + + 閱讀 + + + 懸吊 + + + 投擲 + + + 開啟 + + + 變更音調 + + + 觸發 + + + 栽種 + + + 解除完整版遊戲鎖定 + + + 刪除存檔 + + + 刪除 + + + 整地 + + + 收成 + + + 繼續 + + + 往上游 + + + 敲擊 + + + 擠牛奶 + + + 收集 + + + 清空 + + + 鞍座 + + + 放置 + + + + + + 騎/搭乘 + + + 乘船 + + + 栽培 + + + 睡覺 + + + 起床 + + + 播放 + + + 選項 + + + 移動護甲 + + + 移動武器 + + + 配備 + + + 移動材料 + + + 移動燃料 + + + 移動工具 + + + 拉弓 + + + 上一頁 + + + 下一頁 + + + 戀愛模式 + + + 射箭 + + + 特權 + + + 格擋 + + + 創造 + + + 禁用關卡 + + + 選取角色外觀 + + + 點燃 + + + 邀請好友 + + + 接受 + + + 剪毛 + + + 瀏覽 + + + 重新安裝 + + + 儲存選項 + + + 執行命令 + + + 安裝完整版 + + + 安裝試用版 + + + 安裝 + + + 退出 + + + 重新整理線上遊戲清單 + + + 派對遊戲 + + + 所有遊戲 + + + 離開 + + + 取消 + + + 取消加入 + + + 變更群組 + + + 精製 + + + 製造 + + + 撿起/放置 + + + 顯示物品欄 + + + 顯示說明 + + + 顯示材料 + + + 返回 + + + 提醒事項: + + + + + + 我們已經在最新版遊戲中加入新功能,包括教學課程世界裡的幾個全新地區。 + 您沒有製造該物品所需的所有材料。左下角的方塊會顯示要精製該物品所需的材料。 @@ -3376,28 +1299,10 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 {*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*} @@ -3409,102 +1314,18 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 使用 - - 返回 + + 在這個地區裡,有幾個可協助您了解釣魚、小船、活塞和紅石等相關知識的區域。 - - 離開 + + 在這個地區外,您會發現有關建築物、耕種、礦車和軌道、附加能力、釀製、交易、鍛造等知識的範例! - - 取消 - - - 取消加入 - - - 重新整理線上遊戲清單 - - - 派對遊戲 - - - 所有遊戲 - - - 變更群組 - - - 顯示物品欄 - - - 顯示說明 - - - 顯示材料 - - - 精製 - - - 製造 - - - 撿起/放置 + + 您的食物列已消耗到無法讓生命值自動回復的程度。 撿起 - - 全部撿起 - - - 撿起一半 - - - 放置 - - - 全部放置 - - - 放置 1 個 - - - 丟棄 - - - 全部丟棄 - - - 丟棄 1 個 - - - 交換 - - - 快速移動 - - - 清除快速選取 - - - 這是什麼? - - - 分享至 Facebook - - - 變更篩選條件 - - - 傳送好友請求 - - - 下一頁 - - - 上一頁 - 下一個 @@ -3514,18 +1335,18 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 踢除玩家 + + 傳送好友請求 + + + 下一頁 + + + 上一頁 + 染色 - - 開採 - - - 餵食 - - - 馴服 - 治療 @@ -3535,1067 +1356,874 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 跟著我 - - 退出 + + 開採 - - 清空 + + 餵食 - - 鞍座 + + 馴服 - + + 變更篩選條件 + + + 全部放置 + + + 放置 1 個 + + + 丟棄 + + + 全部撿起 + + + 撿起一半 + + 放置 - - 敲擊 + + 全部丟棄 - - 擠牛奶 + + 清除快速選取 - - 收集 + + 這是什麼? - - + + 分享至 Facebook - - 睡覺 + + 丟棄 1 個 - - 起床 + + 交換 - - 播放 - - - 騎/搭乘 - - - 乘船 - - - 栽培 - - - 往上游 - - - 開啟 - - - 變更音調 - - - 觸發 - - - 閱讀 - - - 懸吊 - - - 投擲 - - - 栽種 - - - 整地 - - - 收成 - - - 繼續 - - - 解除完整版遊戲鎖定 - - - 刪除存檔 - - - 刪除 - - - 選項 - - - 邀請好友 - - - 接受 - - - 剪毛 - - - 禁用關卡 - - - 選取角色外觀 - - - 點燃 - - - 瀏覽 - - - 安裝完整版 - - - 安裝試用版 - - - 安裝 - - - 重新安裝 - - - 儲存選項 - - - 執行命令 - - - 創造 - - - 移動材料 - - - 移動燃料 - - - 移動工具 - - - 移動護甲 - - - 移動武器 - - - 配備 - - - 拉弓 - - - 射箭 - - - 特權 - - - 格擋 - - - 上一頁 - - - 下一頁 - - - 戀愛模式 - - - - - - 旋轉 - - - 隱藏 - - - 清除所有空格 - - - 確定 - - - 取消 - - - Minecraft 商店 - - - 確定要離開目前的遊戲,並加入新的遊戲嗎?您將因此失去尚未儲存的遊戲進度。 - - - 離開遊戲 - - - 儲存遊戲 - - - 不儲存即離開 - - - 確定要用這個世界目前的存檔,來覆寫同一世界之前的存檔嗎? - - - 確定要不儲存即離開嗎?您將因此失去在這個世界的所有遊戲進度! - - - 開始遊戲 - - - 損毀的存檔 - - - 這個存檔已損毀。想要刪除這個存檔嗎? - - - 確定要離開並返回主畫面,同時中斷遊戲中所有玩家的連線嗎?您將因此失去尚未儲存的遊戲進度。 - - - 離開並存檔 - - - 不存檔即離開 - - - 確定要離開並返回主畫面嗎?您將因此失去尚未儲存的遊戲進度。 - - - 確定要離開並返回主畫面嗎?您將因此失去遊戲進度! - - - 建立新世界 - - - 進行教學課程 - - - 教學課程 - - - 為您的世界命名 - - - 請為您的世界輸入一個名稱 - - - 輸入用來產生新世界的種子 - - - 載入已存檔的世界 - - - 按下 START 按鈕來加入遊戲 - - - 正在離開遊戲 - - - 發生錯誤,即將離開遊戲並返回主畫面。 - - - 連線失敗 - - - 連線中斷 - - - 與伺服器的連線中斷。即將離開遊戲並返回主畫面。 - - - 伺服器中斷連線 - - - 您被踢出遊戲 - - - 您因為飛翔而被踢出遊戲 - - - 嘗試連線的時間太久 - - - 伺服器人數已滿 - - - 主持人已經離開遊戲。 - - - 您無法加入這個遊戲,因為該遊戲中沒有任何玩家是您的好友。 - - - 您無法加入這個遊戲,因為您之前已經被主持人踢出遊戲。 - - - 由於您嘗試加入的玩家執行的遊戲版本較舊,所以您無法加入此遊戲。 - - - 由於您嘗試加入的玩家執行的遊戲版本較新,所以您無法加入此遊戲。 - - - 新世界 - - - 已解除獎項鎖定! - - - 太棒了!您獲得 1 個玩家圖示,主角就是 Minecraft 裡的 Steve! - - - 太棒了!您獲得 1 個玩家圖示,主角就是 Creeper! - - - 解除完整版遊戲鎖定 - - - 您正在玩試玩版遊戲,但您必須擁有完整版遊戲才能儲存遊戲進度。 -想要立刻解除完整版遊戲鎖定嗎? - - - 請稍候 - - - 沒有搜尋結果 - - - 篩選條件: - - - 好友 - - - 我的分數 - - - 整體 - - - 項目: - - - 排名 - - - 正在準備儲存關卡資料 - - - 正在準備區塊... - - - 正在完成... - - - 正在建造地形 - - - 正在模擬世界 - - - 正在啟動伺服器 - - - 正在產生再生區域 - - - 正在載入再生區域 - - - 正在進入地獄 - - - 正在離開地獄 - - - 再生中 - - - 正在產生關卡 - - - 正在載入關卡 - - - 正在儲存玩家資料 - - - 正在與主持人連線 - - - 正在下載地形 - - - 正在切換至離線遊戲 - - - 伺服器正在儲存遊戲資料,請稍候 - - - 正在進入終界 - - - 正在離開終界 - - - 這張床已經有人佔據了 - - - 您只能在夜晚睡覺 - - - %s 正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 - - - 您家中的床舖已消失,或是被擋住了 - - - 附近有怪物,您不能休息 - - - 您正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 - - - 工具與武器 - - - 武器 - - - 食物 - - - 建築 - - - 護甲 - - - 機械 - - - 運送 - - - 裝飾 - - - 建築材料 - - - 紅石與運送方式 - - - 雜項 - - - 釀製 - - - 工具、武器與護甲 - - - 材料 - - - 已經登出 - - - 困難度 - - - 音樂 - - - 音效 - - - 色差補正 - - - 遊戲靈敏度 - - - 介面靈敏度 - - - 和平 - - - 容易 - - - 普通 - - - 困難 - - - 在這個模式中,玩家的生命值會隨時間自動回復,且遊戲環境中不會出現敵人。 - - - 在這個模式中,遊戲世界會出現敵人,但敵人只會對玩家造成少量的傷害。 - - - 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成普通的傷害。 - - - 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成嚴重的傷害。千萬要留意 Creeper,因為當您嘗試遠離時,Creeper 可不會取消爆炸攻擊! - - - 試玩版遊戲時間結束 - - - 遊戲人數已滿 - - - 已無空位,因此無法加入遊戲 - - - 輸入牌子的文字 - - - 請輸入牌子上的文字 - - - 輸入標題 - - - 請輸入文章的標題 - - - 輸入說明 - - - 請輸入文章的說明 - - - 輸入描述 - - - 請輸入文章的描述 - - - 物品欄 - - - 材料 - - - 釀製台 - - - 箱子 - - - 附加能力 - - - 熔爐 - - - 材料 - - - 燃料 - - - 分發器 - - - 這款遊戲目前沒有此類型的下載內容。 - - - %s 已經加入遊戲。 - - - %s 已經離開遊戲。 - - - %s 已被踢出遊戲。 - - - 確定要刪除這個遊戲存檔嗎? - - - 正在等待核准 - - - 已審查 - - - 現在正在播放: - - - 重設設定 - - - 確定要將所有設定重設為預設值嗎? - - - 正在載入錯誤 - - - %s 的遊戲 - - - 不明主持人的遊戲 - - - 訪客已經登出 - - - 某位訪客玩家已經登出,導致系統移除遊戲中的所有訪客玩家。 - - - 登入 - - - 您尚未登入。您必須登入,才能進行這個遊戲。想要立刻登入嗎? - - - 不允許進行多人遊戲 - - - 無法建立遊戲 - - - 已自動選取 - - - 無套件:預設角色外觀 - - - 最愛的角色外觀 - - - 已禁用的關卡 - - - 您要加入的遊戲已經列在您的禁用關卡清單中。 -如果您要加入這個遊戲,系統會把這個關卡從禁用關卡清單中移除。 - - - 要禁用這個關卡嗎? - - - 確定要把這個關卡加入禁用關卡清單嗎? -如果您選取 [確定],將會離開這個遊戲。 - - - 從禁用清單中移除 - - - 自動存檔時間間隔 - - - 自動存檔時間間隔:關閉 - - - 分鐘 - - - 不能放置在這裡! - - - 您無法在關卡再生點附近放置熔岩,以避免讓再生的玩家立刻死亡。 - - - 介面透明度 - - - 正在準備自動儲存關卡資料 - - - 平行顯示器大小 - - - 平行顯示器大小 (分割畫面) - - - 種子 - - - 解除角色外觀套件鎖定 - - - 如要使用您選取的角色外觀,您必須先解除這個角色外觀套件的鎖定。 -您想要立刻解除這個角色外觀套件的鎖定嗎? - - - 解除材質套件鎖定 - - - 您必須先解除這個材質套件的鎖定才能在您的世界中使用。 -您想要立刻解除這個材質套件的鎖定嗎? - - - 試用版材質套件 - - - 您目前所使用的是試用版的材質套件。只有解除完整版鎖定才能將這個世界存檔。 -您想要解除完整版材質套件的鎖定嗎? - - - 沒有材質套件 - - - 解除完整版鎖定 - - - 下載試用版 - - - 下載完整版 - - - 您沒有這個世界所使用的混搭套件或材質套件! -您想要立刻安裝混搭套件或材質套件嗎? - - - 取得試用版 - - - 取得完整版 - - - 踢除玩家 - - - 確定要將該玩家踢出這個遊戲嗎?除非您讓這個世界重新開始,該玩家才能重新加入遊戲。 - - - 玩家圖示套件 - - - 主題 - - - 角色外觀套件 - - - 允許好友的好友加入 - - - 您無法加入這個遊戲,因為只有主持人的好友才能加入。 - - - 無法加入遊戲 - - - 已選取 - - - 已選取的角色外觀: - - - 損毀的下載內容 - - - 這個下載內容已經損毀,因此無法使用。您必須刪除該下載內容,然後從 [Minecraft 商店] 選單重新安裝。 - - - 您有部分的下載內容已經損毀,因此無法使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] 選單重新安裝。 - - - 遊戲模式已經變更 - - - 重新為您的世界命名 - - - 請為您的世界輸入新的名稱 - - - 遊戲模式:生存 - - - 遊戲模式:創造 - - - 生存 - - - 創造 - - - 在生存模式中建立 - - - 在創造模式中建立 - - - 產生雲朵 - - - 您要如何處理這個遊戲存檔? - - - 重新為存檔命名 - - - 自動存檔倒數 %d... - - - 開啟 - - - 關閉 - - - 普通 - - - 非常平坦 - - - 啟用此選項時,本遊戲將成為線上遊戲。 - - - 啟用此選項時,只限被邀請的玩家才能加入。 - - - 啟用此選項時,您好友的朋友便可以加入遊戲。 - - - 啟用此選項時,玩家可以對其他玩家造成傷害。只有在生存模式才會生效。 - - - 停用此選項時,加入遊戲的玩家需要取得同意才能建造或開採。 - - - 啟用此選項時,火可能會蔓延到鄰近的易燃方塊。 - - - 啟用此選項時,炸藥會在點燃後爆炸。 - - - 啟用此選項時,會重新產生地獄世界。如果您的舊存檔中沒有地獄要塞,這將會很有用。 - - - 啟用此選項時,會在遊戲世界中產生村落和地下要塞等建築。 - - - 啟用此選項時,會在地上世界與地獄世界中產生地形完全平坦的世界。 - - - 啟用此選項時,玩家的再生點附近會產生一個裝著有用物品的箱子。 + + 快速移動 角色外觀套件 - - 主題 + + 紅色玻璃片 - - 玩家圖示 + + 綠色玻璃片 - - 個人造型項目 + + 棕色玻璃片 - - 材質套件 + + 白色玻璃 - - 混搭套件 + + 染色玻璃片 - - {*PLAYER*} 著火死亡了 + + 黑色玻璃片 - - {*PLAYER*} 被燒死了 + + 藍色玻璃片 - - {*PLAYER*} 嘗試在熔岩中游泳而死亡了 + + 灰色玻璃片 - - {*PLAYER*} 在牆中窒息死亡了 + + 粉紅玻璃片 - - {*PLAYER*} 溺死了 + + 淺綠色玻璃片 - - {*PLAYER*} 餓死了 + + 紫色玻璃片 - - {*PLAYER*} 被戳死了 + + 青色玻璃片 - - {*PLAYER*} 重重摔在地面上而死亡了 + + 淡灰色玻璃片 - - {*PLAYER*} 掉出世界而死亡了 + + 橘色玻璃 - - {*PLAYER*} 死了 + + 藍色玻璃 - - {*PLAYER*} 被炸死了 + + 紫色玻璃 - - {*PLAYER*} 被魔法殺死了 + + 青色玻璃 - - {*PLAYER*} 被終界龍噴出的氣息殺死了 - + + 紅色玻璃 - - {*PLAYER*} 被 {*SOURCE*} 殺死了 + + 綠色玻璃 - - {*PLAYER*} 被 {*SOURCE*} 殺死了 + + 棕色玻璃 - - {*PLAYER*} 被 {*SOURCE*} 的箭射死了 + + 淺灰色玻璃 - - {*PLAYER*} 被 {*SOURCE*} 的火球殺死了 + + 黃色玻璃 - - {*PLAYER*} 被 {*SOURCE*} 的拳頭打死了 + + 淺藍色玻璃 - - {*PLAYER*} 被 {*SOURCE*} 殺死了 + + 桃紅色玻璃 - - 基岩迷霧 + + 灰色玻璃 - - 顯示平行顯示器 + + 粉紅色玻璃 - - 顯示手 + + 淺綠色玻璃 - - 死亡訊息 + + 黃色玻璃片 - - 動畫人物 + + 淺灰色 - - 自訂角色外觀動畫 + + 灰色 - - 您已無法開採或使用物品 + + 粉紅色 - - 您現在可以開採及使用物品 + + 藍色 - - 您已無法放置方塊 + + 紫色 - - 您現在可以放置方塊 + + 青色 - - 您現在可以使用門與開關 + + 淺綠色 - - 您已無法使用門與開關 + + 橘色 - - 您現在可以使用容器 (例如箱子等) + + 白色 - - 您已無法使用容器 (例如箱子等) + + 自訂 - - 您已無法攻擊生物 + + 黃色 - - 您現在可以攻擊生物 + + 淺藍色 - - 您已無法攻擊玩家 + + 洋紅色 - - 您現在可以攻擊玩家 + + 棕色 - - 您已無法攻擊動物 + + 白色玻璃片 - - 您現在可以攻擊動物 + + 小型球狀 - - 您現在是管理員 + + 大型球狀 - - 您已不是管理員 + + 淺藍色玻璃片 - - 您現在可以飛翔 + + 洋紅玻璃片 - - 您已無法飛翔 + + 橘色玻璃片 - - 您將不再感到疲勞 + + 星狀 - - 您現在開始會感到疲勞 + + 黑色 - - 您現在是隱形狀態 + + 紅色 - - 您已不是隱形狀態 + + 綠色 - - 您現在是無敵狀態 + + Creeper 形 - - 您已不是無敵狀態 + + 爆裂 - - %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*} + + 鑽石製馬鎧 + + + 紅石比較器 + + + TNT 礦車 + + + 漏斗礦車 + + + 栓繩 + + + 烽火台 + + + 陷阱儲物箱 + + + 感重壓力板 (輕) + + + 命名牌 + + + 木材 (任何類型) + + + 指令方塊 + + + 火藥球 + + + 這些動物可被馴服後可騎乘。 它們可以附加一個儲物箱。 + + + + + + 馬和驢雜交而生。這些動物可被馴服,隨後還可騎乘和背負儲物箱。 + + + + + + 這些動物可被馴服後可騎乘。 + + + + + + 僵屍馬 + + + 空白地圖 + + + 地獄之星 + + + 煙火 + + + 骷髏馬 + + + 凋零怪 + + + 它們是用凋零骷髏頭顱和靈魂砂製成的。 它們會向你發射會爆炸的骷髏頭顱。 + + + 感重壓力板 (重) + + + 淺灰粘土塊 + + + 灰色粘土塊 + + + 粉紅粘土塊 + + + 藍色粘土塊 + + + 紫色粘土塊 + + + 青色粘土塊 + + + 淺綠色粘土塊 + + + 橘色粘土塊 + + + 白色粘土塊 + + + 染色玻璃 + + + 黃色粘土塊 + + + 淺藍粘土塊 + + + 洋紅粘土塊 + + + 棕色粘土塊 + + + 漏斗 + + + 觸發鐵軌 + + + 投擲器 + + + 紅石比較器 + + + 陽光感測器 + + + 紅石磚 + + + 染色粘土 + + + 黑色粘土塊 + + + 紅色粘土塊 + + + 綠色粘土塊 + + + 乾草捆 + + + 硬化粘土 + + + 煤炭磚 + + + 淡化 + + + 停用後,怪物和動物無法更改方塊 (例如,Creeper 的爆炸無法摧毀方塊,羊也不會吃掉草) 或拾取物品。 + + + 啟用後,玩者死亡時將保留物品欄中的物品。 + + + 停用後,生物不會自然生成。 + + + 遊戲模式:冒險 + + + 冒險 + + + 輸入一個種子,再度生成同樣的地形。留空可隨機生成世界。 + + + 停用後,怪物和動物不會掉落物品 (例如,Creeper 不會掉落火藥)。 + + + {*PLAYER*} 從梯子上摔了下來 + + + {*PLAYER*} 從藤蔓上摔了下來 + + + {*PLAYER*} 掉到了水池外面 + + + 在停用後,方塊被破壞後不會掉落物品 (例如,石頭方塊不會掉落鵝卵石)。 + + + 停用後,玩者不會自然回復生命。 + + + 停用後,時間將不會變化。 + + + 礦車 + + + 栓繩 + + + 解繩 + + + 附著 + + + 下馬 + + + 附加儲物箱 + + + 發射 + + + 名稱 + + + 烽火台 + + + 主效果 + + + 輔助效果 + + + + + + 投擲器 + + + 漏斗 + + + {*PLAYER*} 從高處掉了下來 + + + 現在無法使用角色蛋。 世界中的蝙蝠已達最大數量。 + + + 這種動物無法進入「戀愛模式」。 世界中的種馬已達最大數量。 + + + 遊戲選項 + + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 的火球燒死了。 + + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 揍死了。 + + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 殺死了。 + + + 怪物破壞 + + + 方塊掉落 + + + 自然回復 + + + 日夜週期 + + + 保留物品欄 + + + 怪物生成 + + + 怪物掉寶 + + + {*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*}。 + + + + + 漏斗會一直嘗試從置於本身上方的合適容器中吸取物品, 也會嘗試將所存放的物品插入輸出容器。 + + + + + 然而,如果紅石給漏斗充能,漏斗就會變為閒置狀態,停止吸取和插入物品。 + + + + + 漏斗會指向其嘗試輸出物品的方向。要讓漏斗指向特定方塊,請在潛行時對著方塊放置漏斗。 + + + + 你可以在沼澤中發現這類敵人;它們會用投擲藥劑的方式對你發動攻擊。 殺死它們會掉落藥劑。 + + + 遊戲世界中的圖畫/物品框架已達到數量上限。 + + + 您無法在和平模式中產生敵人。 + + + 這種動物無法進入「戀愛模式」。豬、 綿羊、乳牛、貓和馬已達到繁殖數量上限。 + + + 遊戲世界裡的烏賊已達到數量上限,目前無法使用角色蛋。 + + + 遊戲世界裡的敵人已達到數量上限,目前無法使用角色蛋。 + + + 遊戲世界裡的村民已達到數量上限,目前無法使用角色蛋。 + + + 狼已達到繁殖數量上限,該動物無法進入戀愛模式。 + + + 遊戲世界裡的生物總數已達到上限。 + + + 上下反轉 + + + 慣用左手 + + + 雞已達到繁殖數量上限,該動物無法進入戀愛模式。 + + + Mooshroom 已達到繁殖數量上限,該動物無法進入戀愛模式。 + + + 遊戲世界裡的小船已達到數量上限。 + + + 遊戲世界裡的雞已達到數量上限,目前無法使用角色蛋。 {*C2*}現在,吸一口氣。再一口。感覺空氣進入肺部。讓你的四肢回復。是的,動動你的手指。再一次擁有身體,騰空、感受地心引力。再生到長夢當中。你回來了。你身體的每個細胞又再度碰觸宇宙,彷彿你和宇宙其實不是一體。彷彿我們都不是一體。{*EF*}{*B*}{*B*} @@ -4645,9 +2273,61 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 重設地獄 + + %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 已達到數量上限,目前無法使用角色蛋。 + + + 遊戲世界裡的狼已達到數量上限,目前無法使用角色蛋。 + 重設地獄 @@ -4655,113 +2335,11 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 不要重設地獄 - 豬、 綿羊、乳牛和貓已達到數量上限,目前無法剪 Mooshroom 的毛。 - - - 豬、綿羊、乳牛和貓已達到數量上限,目前無法使用角色蛋。 - - - Mooshroom 已達到數量上限,目前無法使用角色蛋。 - - - 遊戲世界裡的狼已達到數量上限,目前無法使用角色蛋。 - - - 遊戲世界裡的雞已達到數量上限,目前無法使用角色蛋。 - - - 遊戲世界裡的烏賊已達到數量上限,目前無法使用角色蛋。 - - - 遊戲世界裡的敵人已達到數量上限,目前無法使用角色蛋。 - - - 遊戲世界裡的村民已達到數量上限,目前無法使用角色蛋。 - - - 遊戲世界中的圖畫/物品框架已達到數量上限。 - - - 您無法在和平模式中產生敵人。 - - - 豬、綿羊、乳牛和貓已達到繁殖數量上限,該動物無法進入戀愛模式。 - - - 狼已達到繁殖數量上限,該動物無法進入戀愛模式。 - - - 雞已達到繁殖數量上限,該動物無法進入戀愛模式。 - - - Mooshroom 已達到繁殖數量上限,該動物無法進入戀愛模式。 - - - 遊戲世界裡的小船已達到數量上限。 - - - 遊戲世界裡的生物總數已達到上限。 - - - 上下反轉 - - - 慣用左手 + 目前無法為這頭 Mooshroom 剪毛。豬、 綿羊、乳牛、貓和馬已達到數量上限。 您死亡了! - - 再生 - - - 下載內容 - - - 變更角色外觀 - - - 遊戲方式 - - - 控制設定 - - - 設定 - - - 製作群 - - - 重新安裝內容 - - - 偵錯設定 - - - 火會蔓延 - - - 炸藥會爆炸 - - - 玩家對戰 - - - 信任玩家 - - - 主持人特權 - - - 產生建築 - - - 非常平坦的世界 - - - 贈品箱 - 世界選項 @@ -4771,18 +2349,18 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 可以使用門與開關 + + 產生建築 + + + 非常平坦的世界 + + + 贈品箱 + 可以開啟容器 - - 可以攻擊玩家 - - - 可以攻擊動物 - - - 管理員 - 踢除玩家 @@ -4792,185 +2370,309 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 不會疲勞 + + 可以攻擊玩家 + + + 可以攻擊動物 + + + 管理員 + + + 主持人特權 + + + 遊戲方式 + + + 控制設定 + + + 設定 + + + 再生 + + + 下載內容 + + + 變更角色外觀 + + + 製作群 + + + 炸藥會爆炸 + + + 玩家對戰 + + + 信任玩家 + + + 重新安裝內容 + + + 偵錯設定 + + + 火會蔓延 + + + 終界龍 + + + {*PLAYER*} 被終界龍噴出的氣息殺死了 + + + + {*PLAYER*} 被 {*SOURCE*} 殺死了 + + + {*PLAYER*} 被 {*SOURCE*} 殺死了 + + + {*PLAYER*} 死了 + + + {*PLAYER*} 被炸死了 + + + {*PLAYER*} 被魔法殺死了 + + + {*PLAYER*} 被 {*SOURCE*} 的箭射死了 + + + 基岩迷霧 + + + 顯示平行顯示器 + + + 顯示手 + + + {*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*} +在烽火台的選單中,你可以為它選取一種主效果。 金字塔的層數越高,可以選擇的效果就越多。{*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*} + - - 開始遊戲 + + 投擲器 - - 找不到任何遊戲 - - - 進行遊戲 - - - 排行榜 - - - 說明與選項 - - - 解除完整版遊戲鎖定 - - - 繼續遊戲 - - - 儲存遊戲資料 - - - 困難度: - - - 遊戲類型: - - - 建築: - - - 關卡類型: - - - 玩家對戰: - - - 信任玩家: - - - 炸藥: - - - 火會蔓延: - - - 重新安裝主題 - - - 重新安裝玩家圖示 1 - - - 重新安裝玩家圖示 2 - - - 重新安裝個人造型項目 1 - - - 重新安裝個人造型項目 2 - - - 重新安裝個人造型項目 3 - - - 選項 - - - 音訊 - - - 控制 - - - 圖形 - - - 使用者介面 - - - 重設為預設值 - - - 影像晃動 - - - 提示 - - - 遊戲中的工具提示 - - - 雙人遊戲垂直分割畫面 - - - 完成 - - - 編輯牌子上的訊息: - - - 請填寫螢幕擷取畫面的說明 - - - 說明 - - - 遊戲中的螢幕擷取畫面 - - - 編輯牌子上的訊息: - - - 經典 Minecraft 材質、圖示及使用者介面! - - - 顯示所有混搭的遊戲世界 - - - 沒有特殊效果 - - - 速度 - - - 緩慢 - - - 快速 - - - 開採造成的疲勞 - - - 力量 - - - 虛弱 + + NOT USED 立即回復生命值 @@ -4981,62 +2683,3281 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 增強跳躍 + + 開採造成的疲勞 + + + 力量 + + + 虛弱 + 噁心 + + NOT USED + + + NOT USED + + + NOT USED + 復原 抗性 - - 防火 + + 尋找用於產生世界的種子 - - 水中呼吸 + + 點燃後會製造多彩的爆炸。 製作煙火時所用的火藥球決定了煙火的顏色、效果、形狀和消失效果。 - - 隱形 + + 可以啟用或停用漏斗礦車,以及觸發 TNT 礦車的一種鐵軌。 - - 眼盲 + + 用於容納和投擲物品,或者在被給予紅石信號時將物品塞進另一容器中。 - - 夜視 + + 用染色硬化粘土製成的彩色方塊。 - - 飢餓 + + 提供一個紅石信號。 壓力板上的物品較多時,信號會較強。 需要的重量比輕壓力板要重。 + + + 用作紅石信號源。 可還原成紅石。 + + + 用於拾取物品和將物品運輸到容器或從容器中運出。 + + + 可以餵給馬、驢或騾,治療最多 10 顆心。 加速小馬的成長。 + + + 蝙蝠 + + + 你可以在洞穴或其他大型封閉空間中發現這些飛行的生物。 + + + 女巫 + + + 在熔爐中燒煉粘土塊製成。 + + + 用玻璃和一個染料製作而成。 + + + 用染色玻璃製成 + + + 提供一個紅石信號。 壓力板上的物品較多時,信號會較強。 + + + 是一塊會依據陽光照射 (或缺乏陽光照射) 而輸出紅石信號的方塊。 + + + 是一種特殊類型的礦車,其功能與漏斗類似。 它會收集落在軌道上的物品,也會從自己上方的容器中拿取物品。 + + + 可用來裝備馬匹的特殊護甲。 提供 5 點護甲值。 + + + 用於決定煙火的顏色、效果和形狀。 + + + 在紅石電路中,用於保持、比較或減去信號強度,或者也可用於測量特定方塊的狀態。 + + + 是一種礦車,功能上就像一塊移動的 TNT。 + + + 可用來裝備馬匹的特殊護甲。 提供 7 點護甲值。 + + + 用於執行指令。 + + + 向天空投射一束光柱,並且可以為周遭玩者提供狀態效果。 + + + 在內部存放方塊和物品。 並排放置兩個儲物箱可製作出一個具有雙倍儲物空間的較大儲物箱。 陷阱儲物箱在開啟時也會發出一個紅石信號。 + + + 可用來裝備馬匹的特殊護甲。 提供 11 點護甲值。 + + + 用於將生物栓到玩家或柵欄上。 + + + 用於為世界中的生物命名。 + + + 快速 + + + 解除完整版遊戲鎖定 + + + 繼續遊戲 + + + 儲存遊戲資料 + + + 進行遊戲 + + + 排行榜 + + + 說明與選項 + + + 困難度: + + + 玩家對戰: + + + 信任玩家: + + + 炸藥: + + + 遊戲類型: + + + 建築: + + + 關卡類型: + + + 找不到任何遊戲 + + + 僅限邀請 + + + 更多選項 + + + 載入 + + + 主持人選項 + + + 玩家/邀請 + + + 線上遊戲 + + + 新世界 + + + 玩家 + + + 加入遊戲 + + + 開始遊戲 + + + 世界名稱 + + + 用於產生世界的種子 + + + 留白即可使用隨機種子 + + + 火會蔓延: + + + 編輯牌子上的訊息: + + + 請填寫螢幕擷取畫面的說明 + + + 說明 + + + 遊戲中的工具提示 + + + 雙人遊戲垂直分割畫面 + + + 完成 + + + 遊戲中的螢幕擷取畫面 + + + 沒有特殊效果 + + + 速度 + + + 緩慢 + + + 編輯牌子上的訊息: + + + 經典 Minecraft 材質、圖示及使用者介面! + + + 顯示所有混搭的遊戲世界 + + + 提示 + + + 重新安裝個人造型項目 1 + + + 重新安裝個人造型項目 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() 棒極了! + + + 要永遠假設謠言是錯誤的,不要當真! + + + 上一頁 + + + 交易 + + + 鐵砧 + + + 終界 + + + 禁用關卡 + + + 創造模式 + + + 主持人與玩家選項 + + + {*T3*}遊戲方式:終界{*ETW*}{*B*}{*B*} +終界是遊戲中的另一個世界,只要進入已啟動的終界入口就能到達。終界入口位於地上世界地底深處的地下要塞。{*B*} +把終界之眼放入沒有終界之眼的終界入口框架中就能啟動終界入口。{*B*} +跳進已啟動的入口即可前往終界。{*B*}{*B*} +您將在終界中對抗許多的終界人以及凶狠強大的終界龍,所以請在進入終界之前做好戰鬥的準備!{*B*}{*B*} +您會發現 8 根黑曜石柱,其頂端都有終界水晶,終界龍會用水晶來治療自己, +因此戰鬥的第一步就是要摧毀這些水晶。{*B*} +只要用箭就能摧毀前面幾顆水晶,不過後面幾顆水晶受到鐵柵欄籠子的保護,需要建造方塊抵達石柱頂端才有辦法摧毀。{*B*}{*B*} +終界龍會在您建造的時候飛過來進行攻擊並朝著您吐終界酸液球!{*B*} +只要一接近被石柱包圍的龍蛋台,終界龍就會飛下來攻擊您,這會是對終界龍使出強力攻擊的好機會!{*B*} +在閃避酸液氣攻擊的同時攻擊終界龍的眼睛會有最佳的攻擊效果。如果可以的話,帶好友一起進入終界幫助您作戰!{*B*}{*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*} +- 食用金蘋果可在短時間內給予玩家額外的生命值「吸收」效果。{*B*} +- 在區域中逗留的時間越長,在這個區域中生成的怪物會越強。{*B*} + + + 分享螢幕擷取畫面 + + + 箱子 + + + 精製 + + + 熔爐 + + + 基本介紹 + + + 平行顯示器 + + + 物品欄 + + + 分發器 + + + 附加能力 + + + 地獄傳送門 + + + 多人遊戲 + + + 豢養動物 + + + 繁殖動物 + + + 釀製 + + + deadmau5 喜歡玩 Minecraft! + + + 殭屍 Pigmen 不會攻擊您,除非您先展開攻擊。 + + + 只要在床舖上睡覺,就能變更遊戲再生點,並讓遊戲時間快轉到日出。 + + + 把 Ghast 發射的火球打回去! + + + 別忘了製造一些火把,以便在夜晚時照亮四周的區域。怪物會避開火把附近的區域。 + + + 您可以利用礦車與軌道來快速抵達目的地! + + + 只要栽種樹苗,樹苗就會長成樹木。 + + + 建造傳送門就能讓您前往另一個次元的空間:地獄。 + + + 我們不建議您直直往下挖,或是直直往上挖。 + + + 從骷髏的骨頭精製出來的骨粉可以當做肥料,讓植物立刻長大喔! + + + Creeper 一旦靠近您就會自爆! + + + 按下 {*CONTROLLER_VK_B*} 即可丟棄您手上握著的物品! + + + 別忘了要使用正確的工具來做事! + + + 如果您找不到煤塊來製造火把,可以用熔爐裡的火燒木頭來製造木炭。 + + + 吃下熟豬肉所回復的生命值,會比吃下生豬肉所回復的多。 + + + 如果您將遊戲困難度設定為 [和平],您的生命值就會自動回復,而且夜晚不會出現怪物! + + + 用骨頭餵狼來馴服牠,就能讓牠坐下或是跟著您走。 + + + 當您開啟物品欄選單時,只要把游標移動到選單外面,再按下 {*CONTROLLER_VK_A*} 即可丟棄物品。 + + + 新的下載內容現已推出!請選取主畫面的 [Minecraft 商店] 按鈕來取得下載內容。 + + + 您可以用 Minecraft 商店裡的角色外觀套件來變更角色的外觀。請在主畫面選取 [Minecraft 商店],去看看有哪些好東西吧! + + + 調整色差補正設定就能讓遊戲畫面變亮或變暗。 + + + 夜晚時,在床舖上睡覺就能讓遊戲時間快轉到日出;但在多人遊戲中,所有玩家必須同時睡在床舖上,才會有這種效果。 + + + 您可以用鋤頭墾地,來準備栽種作物用的地面。 + + + 蜘蛛不會在白天攻擊您,除非您先展開攻擊。 + + + 用鏟子來挖泥土或沙子,會比用手挖快上許多! + + + 您可以把豬殺死來獲得生豬肉,然後在烹煮後吃掉熟豬肉來回復生命值。 + + + 您可以把乳牛殺死來獲得皮革,然後用來製作護甲。 + + + 如果您有空的桶子,可以用來裝從乳牛身上擠出來的牛奶,或是拿來裝水或熔岩! + + + 當水碰到熔岩源方塊時,就會產生黑曜石。 + + + 現在遊戲有可堆疊的柵欄囉! + + + 如果您的手中有小麥,有些動物會跟著您。 + + + 只要動物無法朝任一方向移動超過 20 個方塊的距離,牠就不會消失。 + + + 馴服後的狼會用尾巴的高低位置來表示目前的生命值狀態。只要餵狼吃肉就能治療牠們。 + + + 在熔爐烹煮仙人掌,即可獲得綠色染料。 + + + 閱讀 [遊戲方式] 選單中的 [最新資訊] 部分,即可獲得 Minecraft 的最新更新資訊。 + + + 遊戲中的音樂是由 C418 所製作! + + + Notch 是誰? + + + Mojang 獲得的獎項比員工的數目還多! + + + 有些名人很喜歡玩 Minecraft 喔! + + + Notch 在 Twitter 上已經有超過 100 萬名的跟隨者了! + + + 並非所有瑞典人都有金髮,有些瑞典人 (像是 Mojang 裡的 Jens) 就擁有紅髮! + + + 我們一定會為這個遊戲推出更新內容! + + + 把 2 個箱子並排放置,就能製造出 1 個大箱子。 + + + 在野外以羊毛作為建築材料來蓋東西時,千萬要小心,因為雷雨的閃電會讓羊毛著火。 + + + 使用熔爐時,1 桶熔岩可讓您熔煉 100 個方塊。 + + + 音符方塊所演奏的樂器種類,是根據底下方塊的材質而定。 + + + 當您移除熔岩源方塊後,熔岩需要好幾分鐘的時間才能完全消失。 + + + Ghast 的火球無法破壞鵝卵石,因此鵝卵石很適合用來保護傳送門。 + + + 可作為光源使用的方塊能夠融化白雪和冰塊,這些方塊包括火把、閃石及南瓜燈籠。 + + + 白天的時候,殭屍和骷髏必須待在水裡才能活下去。 + + + 雞每 5 到 10 分鐘就會下一顆蛋。 + + + 黑曜石只能用鑽石鎬來開採。 + + + 最容易取得火藥的來源就是 Creeper。 + + + 如果您攻擊某隻狼,四周所有的狼就會對您產生敵意並開始攻擊您。而殭屍 Pigmen 也有這種特性。 + + + 狼無法進入地獄。 + + + 狼不會攻擊 Creeper。 + + + 您需要用十字鎬才能開採石頭相關方塊和礦石。 + + + 可用來製作蛋糕,以及做為釀製藥水的材料。 + + + 開啟時會送出電流。當拉桿開啟或關閉後,就會保持在這個狀態,直到下次開啟或關閉為止。 + + + 會持續送出電流,也可以在連接到方塊側邊時作為接收器或傳送器。 +紅石火把還可以當做亮度較低的光源。 + + + 可回復 2 個 {*ICON_SHANK_01*},還能精製成金蘋果。 + + + 可回復 2 個 {*ICON_SHANK_01*},並自動回復生命值 4 秒鐘。由蘋果和碎金塊製作而成。 + + + 可回復 2 個 {*ICON_SHANK_01*}。吃下這個會讓您中毒。 + + + 可在紅石電路中當做中繼器、延遲器,及/或真空管。 + + + 可用來引導礦車的行進路線。 + + + 有動力時,會讓行經的礦車加速。沒有動力時,會讓碰到的礦車停在上面。 + + + 功能跟壓板一樣 (會在啟動時送出紅石信號),但只能靠礦車來啟動。 + + + 按下後即會啟動並送出電流,持續時間大約 1 秒鐘,然後就會再次關閉。 + + + 可用來裝填物品,並在收到紅石送出的電流時隨機射出其中的物品。 + + + 啟動後會播放 1 個音符的聲音,受到敲擊後就會變更音符的音調。把音符方塊放在不同的方塊上面,就會改變樂器的種類。 + + + 可回復 2.5 個 {*ICON_SHANK_01*}。在熔爐烹煮生魚即可獲得。 + + + 可回復 1 個 {*ICON_SHANK_01*}。 + + + 可回復 1 個 {*ICON_SHANK_01*}。 + + + 可回復 3 個 {*ICON_SHANK_01*}。 + + + 可與弓組成武器。 + + + 可回復 2.5 個 {*ICON_SHANK_01*}。 + + + 可回復 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*}。在熔爐烹煮生牛肉即可獲得。 + + + 可用來沿著軌道把您、動物或怪物載到其他地方。 + + + 可當做染料來製造淺藍色羊毛。 + + + 可當做染料來製造水藍色羊毛。 + + + 可當做染料來製造紫色羊毛。 + + + 可當做染料來製造亮綠色羊毛。 + + + 可當做染料來製造灰色羊毛。 + + + 可當做染料來製造淺灰色羊毛。 +(注意:您也可以把灰色染料與骨粉組合成淺灰色染料,讓您可以用 1 個墨囊製造出 4 個淺灰色染料,而不是 3 個。) + + + 可當做染料來製造紫紅色羊毛。 + + + 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 + + + 可用來製造書本和地圖。 + + + 可用來製造書架,或經過附加能力來製成「已附加能力的書本」。 + + + 可當做染料來製造藍色羊毛。 + + + 可用來播放唱片。 + + + 可用來製造非常強韌且堅硬的工具、武器或護甲。 + + + 可當做染料來製造橘色羊毛。 + + + 可從綿羊身上收集,還能用染料染色。 + + + 可當做建築材料,還能用染料染色。但我們不建議您使用這個製作方法,因為您可以輕易地從綿羊身上取得羊毛。 + + + 可當做染料來製造黑色羊毛。 + + + 可用來沿著軌道運送物品。 + + + 當裡面有煤塊時,可自動在軌道上移動,或是推動其他礦車。 + + + 可讓您在水面上移動,而且速度會比游泳快。 + + + 可當做染料來製造綠色羊毛。 + + + 可當做染料來製造紅色羊毛。 + + + 可用來讓作物、樹木、茂密青草、巨型蘑菇及花朵立刻長大,還能與某些染料組合成新的染料。 + + + 可當做染料來製造粉紅色羊毛。 + + + 可當做染料來製造棕色羊毛、製作餅乾的材料,或者可用來種植可可豆。 + + + 可當做染料來製造銀色羊毛。 + + + 可當做染料來製造黃色羊毛。 + + + 可射出箭來進行遠距攻擊。 + + + 穿戴時會讓使用者擁有 5 點護甲值。 + + + 穿戴時會讓使用者擁有 3 點護甲值。 + + + 穿戴時會讓使用者擁有 1 點護甲值。 + + + 穿戴時會讓使用者擁有 5 點護甲值。 + + + 穿戴時會讓使用者擁有 2 點護甲值。 + + + 穿戴時會讓使用者擁有 2 點護甲值。 + + + 穿戴時會讓使用者擁有 3 點護甲值。 + + + 只要在熔爐中熔煉礦石,就能取得閃亮的錠塊。錠塊可用來精製成相同材質的工具。 + + + 您可以將錠塊、寶石或染料精製成可放置的方塊,然後拿來當做昂貴的建築材料,或是壓縮的礦石存放方式。 + + + 當玩家、動物或怪物踏上壓板時,壓板就會送出電流。如果您讓東西掉落在木壓板上,也能啟動送出電流。 + + + 穿戴時會讓使用者擁有 8 點護甲值。 + + + 穿戴時會讓使用者擁有 6 點護甲值。 + + + 穿戴時會讓使用者擁有 3 點護甲值。 + + + 穿戴時會讓使用者擁有 6 點護甲值。 + + + 鐵門只能透過紅石、按鈕或開關來開啟。 + + + 穿戴時會讓使用者擁有 1 點護甲值。 + + + 穿戴時會讓使用者擁有 3 點護甲值。 + + + 用來劈砍木頭相關方塊的速度,會比用手劈砍還要快。 + + + 用來在泥土和青草方塊上整地,以準備進行耕種。 + + + 木門只要透過使用或敲擊,或是使用紅石就能啟動。 + + + 穿戴時會讓使用者擁有 2 點護甲值。 + + + 穿戴時會讓使用者擁有 4 點護甲值。 + + + 穿戴時會讓使用者擁有 1 點護甲值。 + + + 穿戴時會讓使用者擁有 2 點護甲值。 + + + 穿戴時會讓使用者擁有 1 點護甲值。 + + + 穿戴時會讓使用者擁有 2 點護甲值。 + + + 穿戴時會讓使用者擁有 5 點護甲值。 + + + 可用來組成樓梯。 + + + 可用來裝燉蘑菇。當您吃掉燉蘑菇時,碗會保留下來。 + + + 可用來裝水、熔岩及牛奶,讓您能夠把這些物品運送到其他地方。 + + + 可用來裝水,讓您能夠把水運送到其他地方。 + + + 可顯示您或其他玩家輸入的文字。 + + + 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 + + + 可用來產生爆炸。炸藥放置後,只要用打火鐮點燃,或利用電流即可啟動。 + + + 可用來裝熔岩,讓您能夠把熔岩運送到其他地方。 + + + 會顯示太陽與月亮目前的位置。 + + + 會持續指向您的起點。 + + + 用手握住時,會顯示某個地區中已探索區域的影像。可讓您用來尋找能前往某個地點的路。 + + + 可用來裝牛奶,讓您能夠把牛奶運送到其他地方。 + + + 可用來生火、點燃炸藥,以及啟動蓋好的傳送門。 + + + 可用來釣魚。 + + + 只要透過使用或敲擊,或是使用紅石就能啟動。活板門的功用與一般的門相同,但大小是 1 x 1 的方塊,而且放置後會平躺在地面上。 + + + 所有形式的木頭都可以精製成木板。木板可當做建築材料,還能用來精製出許多種物品。 + + + 可當做建築材料。沙岩不會受到重力的影響,不像普通的沙子會因為重力而往下掉。 + + + 可當做建築材料。 + + + 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + + 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + + 可用來產生光線,還能融化白雪和冰塊。 + + + 可用來精製出火把、箭、牌子、梯子、柵欄,還能當做工具與武器的把手。 + + + 可讓您在裡面存放方塊和物品。把 2 個箱子並排放置,就能製造出有 2 倍容量的大箱子。 + + + 可當做無法躍過的屏障。對玩家、動物及怪物而言,柵欄有 1.5 個方塊高;但對於其他方塊來說,柵欄只有 1 個方塊高。 + + + 可讓您上下攀爬。 + + + 當遊戲世界進入夜晚時,只要世界中的所有玩家都上床睡覺,就能讓時間立刻從夜晚跳到早晨,而且上床也會改變玩家的再生點。 +無論您用哪種色彩的羊毛來精製床舖,床舖的顏色都會是一樣的。 + + + 與一般的精製介面相較之下,精製台可讓您精製出更多種類的物品。 + + + 可讓您熔煉礦石、製造木炭與玻璃,還能烹煮生魚和生豬肉。 + + + 鐵斧 + + + 紅石燈 + + + 熱帶叢林木梯 + + + 樺樹木梯 + + + 目前的控制方式 + + + 骷髏 + + + 可可 + + + 杉樹木梯 + + + 龍蛋 + + + 終界石 + + + 終界入口框架 + + + 沙岩梯 + + + + + + 矮樹 + + + 配置 + + + 精製 + + + 使用 + + + 動作 + + + 潛行/往下飛 + + + 潛行 + + + 丟棄 + + + 依序更換手中的物品 + + + 暫停 + + + 觀看 + + + 移動/奔跑 + + + 物品欄 + + + 跳躍/往上飛 + + + 跳躍 + + + 終界入口 + + + 南瓜莖 + + + 西瓜 + + + 玻璃片 + + + 柵欄門 + + + 藤蔓 + + + 西瓜莖 + + + 鐵條 + + + 裂開的石磚塊 + + + 長滿青苔的石磚塊 + + + 石磚塊 + + + 蘑菇 + + + 蘑菇 + + + 刻紋石磚塊 + + + 磚塊梯 + + + 地獄結節 + + + 地獄磚塊梯 + + + 地獄磚塊柵欄 + + + 水槽 + + + 釀製台 + + + 附加能力台 + + + 地獄磚塊 + + + 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*} 即可用您的手或是手中握住的東西來開採及劈砍資源,但您可能需要精製出工具來開採某些方塊… + + + 按下 {*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 + + + 移動 (飛翔時) + + + 玩家/邀請 + + + + + + 配置 3 + + + 配置 2 + + + + + + + + + + + + + + + {*B*}請按下 {*CONTROLLER_VK_A*} 開始教學課程。{*B*} + 如果您覺得自己已經準備好,可以獨自玩遊戲了,請按下 {*CONTROLLER_VK_B*}。 + + + {*B*}請按下 {*CONTROLLER_VK_A*} 繼續。 + + + + + + + + + + + + + + + + + + + + + + + + + + + Silverfish 方塊 + + + 石板 + + + 鐵的壓縮存放方式。 + + + 鐵方塊 + + + 橡樹木板 + + + 沙岩板 + + + 石板 + + + 黃金的壓縮存放方式。 + + + 花朵 + + + 白色羊毛 + + + 橘色羊毛 + + + 黃金方塊 + + + 蘑菇 + + + 玫瑰 + + + 鵝卵石板 + + + 書架 + + + 炸藥 + + + 磚塊 + + + 火把 + + + 黑曜石 + + + 苔蘚石 + + + 地獄磚塊板 + + + 橡樹木板 + + + 石磚塊板 + + + 磚塊板 + + + 熱帶叢林木板 + + + 樺樹木板 + + + 杉樹木板 + + + 紫紅色羊毛 + + + 樺樹樹葉 + + + 杉樹樹葉 + + + 橡樹樹葉 + + + 玻璃 + + + 海綿 + + + 熱帶叢林樹葉 + + + 樹葉 + + + 橡樹 + + + 杉樹 + + + 樺樹 + + + 杉樹木頭 + + + 樺樹木頭 + + + 熱帶叢林木頭 + + + 羊毛 + + + 粉紅色羊毛 + + + 灰色羊毛 + + + 淺灰色羊毛 + + + 淺藍色羊毛 + + + 黃色羊毛 + + + 亮綠色羊毛 + + + 水藍色羊毛 + + + 綠色羊毛 + + + 紅色羊毛 + + + 黑色羊毛 + + + 紫色羊毛 + + + 藍色羊毛 + + + 棕色羊毛 + + + 火把 (煤塊) + + + 閃石 + + + 魂沙 + + + 地獄血石 + + + 青金石方塊 + + + 青金石礦石 + + + 傳送門 + + + 南瓜燈籠 + + + 甘蔗 + + + 黏土 + + + 仙人掌 + + + 南瓜 + + + 柵欄 + + + 點唱機 + + + 青金石的壓縮存放方式。 + + + 活板門 + + + 上鎖的箱子 + + + 真空管 + + + 黏性活塞 + + + 活塞 + + + 羊毛 (不限色彩) + + + 枯灌木 + + + 蛋糕 + + + 音符方塊 + + + 分發器 + + + 茂密青草 + + + 蜘蛛網 + + + 床舖 + + + 冰塊 + + + 精製台 + + + 鑽石的壓縮存放方式。 + + + 鑽石方塊 + + + 熔爐 + + + 農地 + + + 作物 + + + 鑽石礦石 + + + 怪物產生器 + + + + + + 火把 (木炭) + + + 紅石塵 + + + 箱子 + + + 橡樹木梯 + + + 牌子 + + + 紅石礦石 + + + 鐵門 + + + 壓板 + + + 白雪 + + + 按鈕 + + + 紅石火把 + + + 拉桿 + + + 軌道 + + + 梯子 + + + 木門 + + + 石梯 + + + 偵測器軌道 + + + 動力軌道 + + + 您已經收集到足夠的鵝卵石來建造熔爐了。請使用精製台來建造熔爐。 + + + 釣魚竿 + + + 時鐘 + + + 閃石塵 + + + 熔爐礦車 + + + + + + 指南針 + + + 生魚 + + + 玫瑰紅 + + + 仙人掌綠 + + + 可可豆 + + + 熟魚 + + + 染粉 + + + 墨囊 + + + 箱子礦車 + + + 雪球 + + + 小船 + + + 皮革 + + + 礦車 + + + 鞍座 + + + 紅石 + + + 牛奶桶 + + + 紙張 + + + 書本 + + + 史萊姆球 + + + 磚塊 + + + 黏土 + + + 甘蔗 + + + 青金石 + + + 地圖 + + + 唱片:13 + + + 唱片:Cat + + + 床舖 + + + 紅石中繼器 + + + 餅乾 + + + 唱片:Blocks + + + 唱片:Mellohi + + + 唱片:Stal + + + 唱片:Strad + + + 唱片:Chirp + + + 唱片:Far + + + 唱片:Mall + + + 蛋糕 + + + 灰色染料 + + + 粉紅色染料 + + + 亮綠色染料 + + + 紫色染料 + + + 水藍色染料 + + + 淺灰色染料 + + + 蒲公英黃 + + + 骨粉 + + + 骨頭 + + + 砂糖 + + + 淺藍色染料 + + + 紫紅色染料 + + + 橘色染料 + + + 牌子 + + + 皮衣 + + + 鐵護甲 + + + 鑽石護甲 + + + 鐵盔 + + + 鑽石盔 + + + 黃金盔 + + + 黃金護甲 + + + 黃金護脛 + + + 皮靴 + + + 鐵靴 + + + 皮褲 + + + 鐵護脛 + + + 鑽石護脛 + + + 皮帽 + + + 石鋤 + + + 鐵鋤 + + + 鑽石鋤 + + + 鑽石斧 + + + 黃金斧 + + + 木鋤 + + + 黃金鋤 + + + 鎖鏈護甲 + + + 鎖鏈護脛 + + + 鎖鏈靴 + + + 木門 + + + 鐵門 + + + 鎖鏈盔 + + + 鑽石靴 + + + 羽毛 + + + 火藥 + + + 小麥種子 + + + + + + 燉蘑菇 + + + 絲線 + + + 小麥 + + + 熟豬肉 + + + 圖畫 + + + 金蘋果 + + + 麵包 + + + 打火石 + + + 生豬肉 + + + 木棍 + + + 桶子 + + + 水桶 + + + 熔岩桶 + + + 黃金靴 + + + 鐵錠塊 + + + 黃金錠塊 + + + 打火鐮 + + + 煤塊 + + + 木炭 + + + 鑽石 + + + 蘋果 + + + + + + + + + 唱片: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*} 來選取您要精製的物品。 + + + + 精製介面現在會列出精製所選取物品的所需材料。 + + + 精製介面現在會顯示目前所選取物品的說明,告訴您該物品的用途。 + + + 精製介面的右下區域會顯示您的物品欄。這裡也會顯示目前所選取物品的說明,以及精製該物品所需的材料。 + + + 某些物品無法用精製台來製造,必須靠熔爐來產生。現在請製造 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 淚水 + + + 南瓜子 + + + 西瓜子 + + + 生雞肉 + + + 唱片:11 + + + 唱片:Where are we now + + + 大剪刀 + + + 熟雞肉 + + + 終界珍珠 + + + 西瓜片 + + + Blaze 棒 + + + 生牛肉 + + + 牛排 + + + 腐肉 + + + 經驗藥水瓶 + + + 橡樹厚木板 + + + 杉樹厚木板 + + + 樺樹厚木板 + + + 青草方塊 + + + 泥土 + + + 鵝卵石 + + + 熱帶叢林厚木板 + + + 樺樹樹苗 + + + 熱帶叢林樹苗 + + + 基岩 + + + 樹苗 + + + 橡樹樹苗 + + + 杉樹樹苗 + + + 石頭 + + + 物品框架 + + + 再生 {*CREATURE*} + + + 地獄磚塊 + + + 火彈 + + + 火彈 (木炭) + + + 火彈 (煤塊) + + + 骷髏 + + + 頭顱 + + + %s 頭顱 + + + Creeper 頭顱 + + + 骷髏頭 + + + 凋零骷髏 + + + 殭屍頭顱 + + + 煤炭的緊湊存放方式。可以在熔爐中用作燃料。 巨毒 - - 敏捷 + + 飢餓 緩慢 - - 快速 + + 敏捷 - - 遲鈍 + + 隱形 - - 力量 + + 水中呼吸 - - 虛弱 + + 夜視 - - 治療 + + 眼盲 傷害 - - 跳躍 + + 治療 噁心 @@ -5044,29 +5965,38 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 復原 + + 遲鈍 + + + 快速 + + + 虛弱 + + + 力量 + + + 防火 + + + 飽和 + 抗性 - - 防火 + + 跳躍 - - 水中呼吸 + + 凋零怪 - - 隱形 + + 提升生命 - - 眼盲 - - - 夜視 - - - 飢餓 - - - 巨毒 + + 吸收 @@ -5077,9 +6007,78 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 3 + + 隱形 + 4 + + 水中呼吸 + + + 防火 + + + 夜視 + + + 巨毒 + + + 飢餓 + + + 吸收 + + + 飽和 + + + 生命提升 + + + 眼盲 + + + 腐朽 + + + 拙劣 + + + 稀薄 + + + 擴散 + + + 清澈 + + + 乳狀 + + + 粗劣 + + + 奶油 + + + 滑順 + + + 粗製 + + + 走味 + + + 巨大 + + + 平淡 + 噴濺 @@ -5089,50 +6088,14 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 無趣 - - 平淡 + + 華麗 - - 清澈 + + 強烈 - - 乳狀 - - - 擴散 - - - 拙劣 - - - 稀薄 - - - 粗劣 - - - 走味 - - - 巨大 - - - 粗製 - - - 奶油 - - - 滑順 - - - 柔順 - - - 精緻 - - - 濃郁 + + 魅力 高雅 @@ -5140,149 +6103,152 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 高貴 - - 魅力 - - - 華麗 - - - 極緻 - - - 強烈 - 閃光 - - 強效 - - - 混濁 - - - 無臭 - 惡臭 刺鼻 + + 無臭 + + + 強效 + + + 混濁 + + + 柔順 + + + 極緻 + + + 濃郁 + + + 精緻 + + + 隨著時間自動回復受影響玩家、動物和怪物的生命值。 + + + 立即減少受影響玩家、動物和怪物的生命值。 + + + 讓受影響玩家、動物和怪物不受火、熔岩和 Blaze 遠距攻擊的傷害。 + + + 本身不具備任何效果,藉由在釀製台中添加其他材料來製造藥水。 + 刺激 + + 減少受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + + + 增加受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + + + 增加受影響玩家和怪物攻擊時所造成的傷害。 + + + 立即增加受影響玩家、動物和怪物的生命值。 + + + 減少受影響玩家和怪物攻擊時所造成的傷害。 + + + 所有藥水的基本配方,用來在釀製台中製造藥水。 + 濃稠 - 黏性 - - - 所有藥水的基本配方,用來在釀製台中製造藥水。 - - - 本身不具備任何效果,藉由在釀製台中添加其他材料來製造藥水。 - - - 增加受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 - - - 減少受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 - - - 增加受影響玩家和怪物攻擊時所造成的傷害。 - - - 減少受影響玩家和怪物攻擊時所造成的傷害。 - - - 立即增加受影響玩家、動物和怪物的生命值。 - - - 立即減少受影響玩家、動物和怪物的生命值。 - - - 隨著時間自動回復受影響玩家、動物和怪物的生命值。 - - - 讓受影響玩家、動物和怪物不受火、熔岩和 Blaze 遠距攻擊的傷害。 - - - 隨著時間自動減少受影響玩家、動物和怪物的生命值。 - - - 鋒利 + 臭的 重擊 - - 節足剋星 + + 鋒利 + + + 隨著時間自動減少受影響玩家、動物和怪物的生命值。 + + + 攻擊傷害 擊退 - - 烈火 + + 節足剋星 - - 防護 + + 速度 - - 防火 + + 僵屍強化 - - 輕盈 + + 馬匹跳躍強度 - - 防爆 + + 應用後: - - 防彈 + + 擊退抵抗 - - 水中呼吸 + + 怪物跟隨範圍 - - 水中挖掘 - - - 效率 + + 最大生命 聚寶 - - 耐力 + + 效率 - - 奪寶 + + 水中挖掘 財富 - - 力量 + + 奪寶 - - 火焰 + + 耐力 - - 猛擊 + + 防火 - - 無限 + + 防護 - - 1 + + 烈火 - - 2 + + 輕盈 - - 3 + + 水中呼吸 + + + 防彈 + + + 防爆 4 @@ -5293,23 +6259,29 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 6 + + 猛擊 + 7 - - 8 + + 3 - - 9 + + 火焰 - - 10 + + 力量 - - 可用鐵鎬或材質更堅硬的十字鎬開採來收集翡翠。 + + 無限 - - 與箱子類似,不過玩家從任何一個終界箱都可以拿取存放在其他終界箱裡的物品,即使處在不同的世界也沒有問題。 + + 2 + + + 1 任何實體走過連接好的絆索後就會將其啟動。 @@ -5320,44 +6292,59 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 壓縮存放翡翠的方式。 - - 由鵝卵石建造而成的牆。 + + 與箱子類似,不過玩家從任何一個終界箱都可以拿取存放在其他終界箱裡的物品,即使處在不同的世界也沒有問題。 - - 可用來維修武器、工具和護甲。 + + 9 - - 在熔爐中熔煉成地獄石英。 + + 8 - - 可當做裝飾品。 + + 可用鐵鎬或材質更堅硬的十字鎬開採來收集翡翠。 - - 可和村民進行交易。 - - - 可當做裝飾品。裡面可以種花朵、樹苗、仙人掌和蘑菇。 + + 10 可回復 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*}。由胡蘿蔔和碎金塊製作而成。 + 可回復 1 個 {*ICON_SHANK_01*},食用這個物品可能會讓你中毒。 騎在裝有豬鞍的豬身上時,可用來控制方向。 - - 可回復 4 個 {*ICON_SHANK_01*}。 + + 可回復 3 個 {*ICON_SHANK_01*}。在熔爐烹煮馬鈴薯即可獲得。 + + + 可回復 3 個 {*ICON_SHANK_01*}。由胡蘿蔔和碎金塊製作而成。 搭配鐵砧使用可為武器、工具或護甲附加能力。 @@ -5365,6 +6352,15 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 透過開凱地獄石英礦石所製作而成。可精製成石英方塊。 + + 馬鈴薯 + + + 烤馬鈴薯 + + + 胡蘿蔔 + 由羊毛製作而成。可當做裝飾品。 @@ -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,72 +6499,77 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 鑿刻沙岩 - - 滑順沙岩 - {*PLAYER*} 在嘗試傷害 {*SOURCE*} 的時候被殺死了 + + 滑順沙岩 + {*PLAYER*} 被掉落的鐵砧壓扁了。 {*PLAYER*} 被掉落的方塊壓扁了。 - - 將 {*PLAYER*} 傳送到 {*DESTINATION*} 了 - {*PLAYER*} 將您傳送到他們的所在位置了 - - {*PLAYER*} 被傳送到您的所在位置了 + + 將 {*PLAYER*} 傳送到 {*DESTINATION*} 了 荊棘 - - 石英板 + + {*PLAYER*} 被傳送到您的所在位置了 讓黑暗的地區看起來像在白天一樣,即使在水面下也可以作用。 + + 石英板 + 讓作用範圍內的玩家、動物和怪物隱形。 維修並命名 - - 附加能力費用:%d - 太貴了! - - 重新命名 + + 附加能力費用:%d 您有: - - 交易的所需物品 + + 重新命名 {*VILLAGER_TYPE*} 提供 %s - - 維修 + + 交易的所需物品 交易 - - 幫項圈染色 + + 維修 這是鐵砧介面,可讓您花費經驗等級點數來幫武器、護甲或工具重新命名、維修並附加特殊能力。 + + + + 幫項圈染色 + + + + 若要開始處理物品,請將物品放在第一個輸入格。 @@ -5587,9 +6579,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 如果您已經了解鐵砧介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 - + - 若要開始處理物品,請將物品放在第一個輸入格。 + 此外,您也可以將第二個相同的物品放在第二個空格中來結合這兩樣物品。 @@ -5597,24 +6589,14 @@ 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,14 +6678,24 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 您可以在畫面左側的兩個方塊中查看交易所需的物品總數。 - + - 按下 {*CONTROLLER_VK_A*} 即可與村民交換此次交易所指定的物品。 + 您提供給村民的物品數量和類型會顯示在畫面左側的兩個方塊中。 在這個地區有一位村民和一個箱子,箱子裡有紙張讓您購買物品。 + + + + + 按下 {*CONTROLLER_VK_A*} 即可與村民交換此次交易所指定的物品。 + + + + + 玩家也可以拿物品欄中的物品與村民交易。 @@ -5713,19 +6705,14 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 如果您已經了解交易的相關知識,請按下{*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,37 +1,123 @@  - + + 想要登入 "PSN" 嗎? + + + 若玩家使用與主持人玩家不同的 "PlayStation Vita" 主機,則對該玩家選取此選項會將該玩家及其 "PlayStation Vita" 主機上的所有其他玩家踢出遊戲。在遊戲重新開始前,此玩家無法重新加入遊戲。 + + + SELECT + + + 當遊戲中或載入遊戲的存檔有啟用此選項時,將會停用獎盃及排行榜的更新功能。 + + + "PlayStation Vita" 主机 + + + 選擇 [無線隨意網路] 來與附近的其他 "PlayStation Vita" 主機連線,或選擇 ["PSN"] 來與世界各地的好友連線。 + + + 無線隨意網路 + + + 變更網路模式 + + + 選取網路模式 + + + 分割畫面線上 ID + + + 獎盃 + + + 這個遊戲有自動儲存進度的功能。當畫面出現這個圖示時,代表系統正在儲存您的遊戲資料。 +請勿在畫面出現這個圖示時關閉 "PlayStation Vita" 主機。 + + + 啟用此選項時,主持人可以從遊戲選單切換自己的飛翔能力、不會疲勞,或是讓自己隱形,但將會無法使用獎盃及排行榜更新功能。 + + + 線上 ID: + + + 您目前所使用的是試用版的材質套件。您可以使用材質套件中的完整內容,但是無法儲存遊戲進度。 +如果您嘗試在使用試用版時存檔,系統會提供選項讓您購買完整版。 + + + 修補程式 1.04 (遊戲更新 14) + + + 遊戲中的線上 ID + + + 來看看我在 Minecraft: "PlayStation Vita" Edition 遊戲世界中的製作成果! + + + 下載失敗。請稍後重試。 + + + 由於 NAT 類型有所限制,因此無法加入遊戲。請檢查您的網路設定。 + + + 上傳失敗。請稍後重試。 + + + 下載完成! + + + +存檔傳輸區域目前沒有可用的遊戲存檔。 +你可以使用 Minecraft:"PlayStation 3" Edition 上傳世界存檔到存檔傳輸區域,然後使用 Minecraft:"PlayStation Vita" Edition 下載該存檔。 + + + + 存檔不完整 + + + Minecraft: "PlayStation Vita" Edition 已沒有空間可用來保存資料。若要清出空間,請刪除其他的 Minecraft: "PlayStation Vita" Edition 存檔。 + + + 已取消上傳 + + + 您已取消將此遊戲存檔上傳至存檔傳輸區域。 + + + 上傳 PS3™/PS4™ 的遊戲存檔 + + + 正在上傳資料:%d%% + + + "PSN" + + + 下載 PS3™ 存檔 + + + 正在下載資料:%d%% + + + 正在存檔 + + + 上傳完成! + + + 是否確定要上傳此遊戲存檔,並且覆寫存檔傳輸區域中保留的任何現有存檔? + + + 正在轉換資料 + + NOT USED - - 你可以使用 PlayStation(R)Vita 主機上的觸控螢幕來瀏覽選單! - - - Minecraft 的論壇上有個特別保留給 PlayStation(R)Vita Edition 的地方喔! - - - 只要在 Twitter 上追蹤 @4JStudios 和 @Kappische 的動態,就能獲得 Minecraft 的最新消息! - - - 千萬別直接和 Enderman 對看! - - - 我們認為 4J Studios 已經把 PlayStation(R)Vita 版本中的 Herobrine 拿掉了,不過我們不確定這個消息是真是假。 - - - 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 不會顯示在螢幕擷取畫面中。 + + NOT USED {*T3*}遊戲方式:創造模式{*ETW*}{*B*}{*B*} @@ -46,16 +132,16 @@ PlayStation(R)Vita 主機上的 Minecraft 預設為多人遊戲。{*B*}{*B*} 快速按兩下 {*CONTROLLER_ACTION_JUMP*} 即可飛翔,重複這個動作則可結束飛翔。飛翔時,往前快速按兩下 {*CONTROLLER_ACTION_MOVE*} 即可加快飛行的速度。 在飛翔模式下,只要按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 則可往下飛。您也可用方向鍵操控方向,往上、下、左或右飛。 - - NOT USED - - - NOT USED - 檢視玩家卡 + + 如果您在創造模式中建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這個情況。確定要繼續嗎? + + + 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。確定要繼續嗎? + 檢視玩家個人資料 @@ -63,17 +149,65 @@ PlayStation(R)Vita 主機上的 Minecraft 預設為多人遊戲。{*B*}{*B*} 邀請好友 - - 如果您在創造模式中建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這個情況。確定要繼續嗎? + + Minecraft 的論壇上有個特別保留給 "PlayStation Vita" Edition 的地方喔! - - 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。確定要繼續嗎? + + 只要在 Twitter 上追蹤 @4JStudios 和 @Kappische 的動態,就能獲得 Minecraft 的最新消息! - - 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。 + + NOT USED - - 如果您在啟用主持人特權的情況下建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後關閉那些選項並再次載入該世界,也無法改變這個情況。確定要繼續嗎? + + 你可以使用 "PlayStation 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 不會顯示在螢幕擷取畫面中。 + + + 我們認為 4J Studios 已經把 "PlayStation Vita" 版本中的 Herobrine 拿掉了,不過我們不確定這個消息是真是假。 + + + Minecraft: "PlayStation Vita" Edition 打破了許多紀錄! + + + Minecraft: "PlayStation Vita" Edition 試玩版的遊戲時間已經結束!您想要解除完整版遊戲鎖定來繼續玩這個好玩的遊戲嗎? + + + 無法載入「Minecraft: PlayStation(R)Vita Edition」,因此無法繼續。 + + + 釀製 + + + 您已經被登出 "PSN",因此系統將您返回標題畫面。 + + + 無法加入遊戲,因為至少有 1 位玩家受 Sony Entertainment Network 帳戶交談功能限制而無法在進行線上遊戲。 + + + 您無法加入此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 + + + 您無法建立此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 + + + 無法建立線上遊戲,因為至少有 1 位玩家因受到 Sony Entertainment Network 帳戶交談限制而無法進行線上遊戲。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 + + + 您無法加入此遊戲階段,因為您的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。 與 "PSN" 的連線中斷。即將離開遊戲並返回主畫面。 @@ -81,18 +215,15 @@ PlayStation(R)Vita 主機上的 Minecraft 預設為多人遊戲。{*B*}{*B*} 與 "PSN" 的連線中斷。 + + 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。 + + + 如果您在啟用主持人特權的情況下建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後關閉那些選項並再次載入該世界,也無法改變這個情況。確定要繼續嗎? + - 這是 Minecraft: PlayStation(R)Vita Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! -解除完整版遊戲鎖定即可享受 Minecraft: PlayStation(R)Vita Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 -您想要解除完整版遊戲鎖定嗎? - - - 這是 Minecraft: PlayStation(R)Vita Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個主題! -解除完整版遊戲鎖定即可享受 Minecraft: PlayStation(R)Vita Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 -您想要解除完整版遊戲鎖定嗎? - - - 這是 Minecraft: PlayStation(R)Vita Edition 試玩版遊戲。您必須擁有完整版遊戲才能接受這個邀請。 + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation Vita" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 您想要解除完整版遊戲鎖定嗎? @@ -101,145 +232,16 @@ PlayStation(R)Vita 主機上的 Minecraft 預設為多人遊戲。{*B*}{*B*} 線上 ID - - 釀製 + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個主題! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation Vita" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? - - 您已經被登出 "PSN",因此系統將您返回標題畫面。 + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。您必須擁有完整版遊戲才能接受這個邀請。 +您想要解除完整版遊戲鎖定嗎? - - Minecraft: PlayStation(R)Vita Edition 試玩版的遊戲時間已經結束!您想要解除完整版遊戲鎖定來繼續玩這個好玩的遊戲嗎? - - - 無法載入「Minecraft: PlayStation(R)Vita Edition」,因此無法繼續。 - - - 無法加入遊戲,因為至少有 1 位玩家受 Sony Entertainment Network 帳戶交談功能限制而無法在進行線上遊戲。 - - - 無法建立線上遊戲,因為至少有 1 位玩家因受到 Sony Entertainment Network 帳戶交談限制而無法進行線上遊戲。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 - - - 您無法加入此遊戲階段,因為您的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。 - - - 您無法加入此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 - - - 您無法建立此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 - - - 這個遊戲有自動儲存進度的功能。當畫面出現這個圖示時,代表系統正在儲存您的遊戲資料。 -請勿在畫面出現這個圖示時關閉 PlayStation(R)Vita 主機。 - - - 啟用此選項時,主持人可以從遊戲選單切換自己的飛翔能力、不會疲勞,或是讓自己隱形,但將會無法使用獎盃及排行榜更新功能。 - - - 分割畫面線上 ID - - - 獎盃 - - - 線上 ID: - - - 遊戲中的線上 ID - - - 來看看我在 Minecraft: PlayStation(R)Vita Edition 遊戲世界中的製作成果! - - - 您目前所使用的是試用版的材質套件。您可以使用材質套件中的完整內容,但是無法儲存遊戲進度。 -如果您嘗試在使用試用版時存檔,系統會提供選項讓您購買完整版。 - - - - 修補程式 1.04 (遊戲更新 14) - - - SELECT - - - 當遊戲中或載入遊戲的存檔有啟用此選項時,將會停用獎盃及排行榜的更新功能。 - - - 想要登入 "PSN" 嗎? - - - 若玩家使用與主持人玩家不同的 PlayStation(R)Vita 主機,則對該玩家選取此選項會將該玩家及其 PlayStation(R)Vita 主機上的所有其他玩家踢出遊戲。在遊戲重新開始前,此玩家無法重新加入遊戲。 - - - PlayStation(R)Vita 主机 - - - 變更網路模式 - - - 選取網路模式 - - - 選擇 [無線隨意網路] 來與附近的其他 PlayStation(R)Vita 主機連線,或選擇 ["PSN"] 來與世界各地的好友連線。 - - - 無線隨意網路 - - - "PSN" - - - 下載 PlayStation(R)3 存檔 - - - 上傳 PlayStation(R)3/PlayStation(R)4 的遊戲存檔 - - - 已取消上傳 - - - 您已取消將此遊戲存檔上傳至存檔傳輸區域。 - - - 正在上傳資料:%d%% - - - 正在下載資料:%d%% - - - 是否確定要上傳此遊戲存檔,並且覆寫存檔傳輸區域中保留的任何現有存檔? - - - 正在轉換資料 - - - 正在存檔 - - - 上傳完成! - - - 上傳失敗。請稍後重試。 - - - 下載完成! - - - 下載失敗。請稍後重試。 - - - 由於 NAT 類型有所限制,因此無法加入遊戲。請檢查您的網路設定。 - - - - 存檔傳輸區域目前沒有可用的遊戲存檔。 - 您可以使用 Minecraft: PlayStation(R)3 Edition 上傳世界存檔到存檔傳輸區域,然後使用 Minecraft: PlayStation(R)Vita Edition 下載該存檔。 - - - - 存檔不完整 - - - Minecraft: PlayStation(R)Vita Edition 已沒有空間可用來保存資料。若要清出空間,請刪除其他的 Minecraft: PlayStation(R)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 xx0 = -w / 2.0f; + float yy0 = -h / 2.0f; - float z0 = -0.5f; - float z1 = +0.5f; + float edgeWidth = 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; + // 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; - setBrightness(painting, (x0 + x1) / 2, (y0 + y1) / 2); + // 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; - 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; + // 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; - float bu0 = (12 * 16) / 256.0f; - float bu1 = (12 * 16 + 16) / 256.0f; - float bv0 = (0) / 256.0f; - float bv1 = (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; - 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; + setBrightness(painting, (x0 + x1) / 2, (y0 + y1) / 2); - 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; + // 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((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)); + 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((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(); - } + 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]; - - if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 - { - t->tex2(p->getLightColor(a)); + case TRANSLUCENT_LIST: + glDepthMask(false); + break; + case OPAQUE_LIST: + glDepthMask(true); + break; } - 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 + + 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); + + t->begin(); + for (unsigned int i = 0; i < particles[l][tt][list].size(); i++) + { + 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..8034dff2 100644 --- a/Minecraft.Client/PendingConnection.cpp +++ b/Minecraft.Client/PendingConnection.cpp @@ -20,18 +20,22 @@ Random *PendingConnection::random = new Random(); +#ifdef _WINDOWS64 +bool g_bRejectDuplicateNames = true; +#endif + PendingConnection::PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id) { // 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 +45,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 +110,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 +129,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 ) @@ -166,35 +170,59 @@ void PendingConnection::handleLogin(shared_ptr packet) { disconnect(DisconnectPacket::eDisconnect_Banned); } +#ifdef _WINDOWS64 + else if (g_bRejectDuplicateNames) + { + bool nameTaken = false; + vector >& pl = server->getPlayers()->players; + for (unsigned int i = 0; i < pl.size(); i++) + { + if (pl[i] != NULL && pl[i]->name == name) + { + nameTaken = true; + break; + } + } + if (nameTaken) + { + app.DebugPrintf("Rejecting duplicate name: %ls\n", name.c_str()); + disconnect(DisconnectPacket::eDisconnect_Banned); + } + else + { + handleAcceptedLogin(packet); + } + } +#endif 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 +239,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 +287,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) + 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->interact(target); - } - else if (packet->action == InteractPacket::ATTACK) - { - 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..3cf47a1c 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -24,7 +24,8 @@ #include "..\Minecraft.World\net.minecraft.world.level.storage.h" #include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" #include "..\Minecraft.World\JavaMath.h" -#ifdef _XBOX +#include "..\Minecraft.World\EntityIO.h" +#if defined(_XBOX) || defined(_WINDOWS64) #include "Xbox\Network\NetworkPlayerXbox.h" #elif defined(__PS3__) || defined(__ORBIS__) #include "Common\Network\Sony\NetworkPlayerSony.h" @@ -36,7 +37,7 @@ PlayerList::PlayerList(MinecraftServer *server) { playerIo = NULL; - this->server = server; + this->server = server; sendAllPlayerInfoIn = 0; overrideGameMode = NULL; @@ -50,11 +51,16 @@ 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; + +#ifdef _WINDOWS64 + maxPlayers = MINECRAFT_NET_MAX_PLAYERS; +#else + maxPlayers = server->settings->getInt(L"max-players", 20); +#endif InitializeCriticalSection(&m_kickPlayersCS); InitializeCriticalSection(&m_closePlayersCS); } @@ -74,190 +80,243 @@ 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 +#ifdef _WINDOWS64 + if (networkPlayer != NULL && !networkPlayer->IsLocal()) + { + NetworkPlayerXbox* nxp = (NetworkPlayerXbox*)networkPlayer; + IQNetPlayer* qnp = nxp->GetQNetPlayer(); + wcsncpy_s(qnp->m_gamertag, 32, player->name.c_str(), _TRUNCATE); + } +#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) + { + if(!usedIndexes[i]) { - usedIndexes[ (int)(*it)->getPlayerIndex() ] = true; - } - for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++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); - } - } - - if(!player->customTextureUrl.empty() && player->customTextureUrl.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl)) + // 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( 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) + // 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 + + // 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; + + 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)) ); + playerConnection->send( shared_ptr( new SetCarriedItemPacket(player->inventory->selected))); + delete spawnPos; + + updateEntireScoreboard((ServerScoreboard *) level->getScoreboard(), player); + + sendLevelInfo(player, level); + + // 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) ) ); + + MemSect(14); + add(player); + MemSect(0); + + 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); + + 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) { - player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,player->gameMode->getGameModeForPlayer()->getId() ); + mount->forcedLoading = true; + level->addEntity(mount); + player->ride(mount); + mount->forcedLoading = false; } + } - //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; - - // 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 ); - - 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; - - sendLevelInfo(player, level); - - // 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) ) ); - - MemSect(14); - add(player); - MemSect(0); - - 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); - - server->getConnection()->addPlayerConnection(playerConnection); - playerConnection->send( shared_ptr( new SetTimePacket(level->getTime()) ) ); - - AUTO_VAR(activeEffects, player->getActiveEffects()); - for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + // 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) { - MobEffectInstance *effect = *it; - playerConnection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); - } - - 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 ) - { - 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 +339,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 +359,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 +376,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 +402,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 +414,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 +427,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 @@ -380,9 +440,9 @@ void PlayerList::add(shared_ptr player) // Some code from here has been moved to the above validatePlayerSpawnPosition function // 4J Stu - Swapped these lines about so that we get the chunk visiblity packet way ahead of all the add tracked entity packets - // Fix for #9169 - ART : Sign text is replaced with the words Awaiting approval. - changeDimension(player, NULL); - level->addEntity(player); + // Fix for #9169 - ART : Sign text is replaced with the words �Awaiting approval�. + changeDimension(player, NULL); + level->addEntity(player); for (int i = 0; i < players.size(); i++) { @@ -417,12 +477,18 @@ 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) + { + level->removeEntityImmediately(player->riding); + app.DebugPrintf("removing player mount"); + } + level->getTracker()->removeEntity(player); + level->removeEntity(player); + level->getChunkMap()->remove(player); AUTO_VAR(it, find(players.begin(),players.end(),player)); if( it != players.end() ) { @@ -441,17 +507,30 @@ void PlayerList::remove(shared_ptr player) shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID onlineXuid) { - if (players.size() >= maxPlayers) +#ifdef _WINDOWS64 + if (players.size() >= (unsigned int)MINECRAFT_NET_MAX_PLAYERS) +#else + if (players.size() >= (unsigned int)maxPlayers) +#endif { - 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 player->setOnlineXuid( onlineXuid ); // 4J Added - +#ifdef _WINDOWS64 + { + INetworkPlayer* np = pendingConnection->connection->getSocket()->getPlayer(); + if (np != NULL) + { + PlayerUID realXuid = np->GetUID(); + player->setXuid(realXuid); + player->setOnlineXuid(realXuid); + } + } +#endif // Work out the base server player settings INetworkPlayer *networkPlayer = pendingConnection->connection->getSocket()->getPlayer(); if(networkPlayer != NULL && !networkPlayer->IsHost()) @@ -466,7 +545,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 +604,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 +633,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 +650,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 +662,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 +710,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 +732,7 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->displayClientMessage(IDS_PLAYER_LEFT_END); } - return player; + return player; } @@ -704,7 +786,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 +800,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,74 +811,14 @@ 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; + oldLevel->removeEntityImmediately(player); + player->removed = false; - 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) - { - xt /= scale; - zt /= scale; - player->moveTo(xt, player->y, zt, player->yRot, player->xRot); - if (player->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(player, false); - } - } - else - { - Pos *p = newLevel->getDimensionSpecificSpawn(); - - xt = p->x; - player->y = p->y; - zt = p->z; - delete p; - player->moveTo(xt, player->y, zt, 90, 0); - if (player->isAlive()) - { - oldLevel->tick(player, false); - } - } - - removePlayerFromReceiving(player, false, lastDimension); - addPlayerToReceiving(player); - - if (lastDimension == 1) - { - } - else - { - 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()) - { - newLevel->addEntity(player); - player->moveTo(xt, player->y, zt, player->yRot, player->xRot); - newLevel->tick(player, false); - newLevel->cache->autoCreate = true; - (new PortalForcer())->force(newLevel, player); - newLevel->cache->autoCreate = false; - } - } - - - player->setLevel(newLevel); - changeDimension(player, oldLevel); + repositionAcrossDimension(player, lastDimension, oldLevel, newLevel); + changeDimension(player, oldLevel); player->gameMode->setLevel(newLevel); @@ -807,7 +829,7 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime // 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 @@ -821,17 +843,97 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime delete activeEffects; player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); - sendLevelInfo(player, newLevel); - sendAllPlayerInfo(player); + 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(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(entity, false); + } + } + else + { + Pos *p; + + if (lastDimension == 1) + { + // Coming from the end + p = newLevel->getSharedSpawnPos(); + } + else + { + // Going to the end + p = newLevel->getDimensionSpecificSpawn(); + } + + xt = p->x; + entity->y = p->y; + zt = p->z; + delete p; + entity->moveTo(xt, entity->y, zt, 90, 0); + if (entity->isAlive()) + { + oldLevel->tick(entity, false); + } + } + + if(entity->GetType() == eTYPE_SERVERPLAYER) + { + shared_ptr player = dynamic_pointer_cast(entity); + removePlayerFromReceiving(player, false, lastDimension); + addPlayerToReceiving(player); + } + + 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 (entity->isAlive()) + { + newLevel->addEntity(entity); + entity->moveTo(xt, entity->y, zt, entity->yRot, entity->xRot); + newLevel->tick(entity, false); + newLevel->cache->autoCreate = true; + newLevel->getPortalForcer()->force(entity, xOriginal, yOriginal, zOriginal, yRotOriginal); + newLevel->cache->autoCreate = false; + } + } + + 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 +981,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 +1005,7 @@ void PlayerList::tick() player->connection->setWasKicked(); player->connection->send( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Kicked) )); } -//#endif + //#endif } } } @@ -941,31 +1043,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 +1093,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 +1249,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 +1283,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,37 +1299,13 @@ 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*/) { if(progressListener != NULL) progressListener->progressStart(IDS_PROGRESS_SAVING_PLAYERS); @@ -1131,7 +1316,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 +1341,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 +1362,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 +1401,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 +1575,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); + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : _mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); - 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()]); - } - } - } - } - -} - -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::scale(shared_ptr player, float a) +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) { 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 *)(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); - - 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); + // 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); + //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; + 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.level.h" -#include "..\Minecraft.World\net.minecraft.world.level.dimension.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.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.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.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.tile.entity.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) + for( AUTO_VAR(it, tickNextTickList.begin()); it != tickNextTickList.end(); ) { - tickNextTickList.erase(td); - it = tickNextTickSet.erase(it); - } - else - { - it++; - } + TickNextTickData td = *it; - results->push_back(td); - } + 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); + } + 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; -// gameMode->player = this; // 4J - removed to avoid use of shared_from_this in ctor, now set up externally - this->gameMode = gameMode; + viewDistance = server->getPlayers()->getViewDistance(); - Pos *spawnPos = level->getSharedSpawnPos(); - int xx = spawnPos->x; - int zz = spawnPos->z; - int yy = spawnPos->y; + // 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; 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,60 +523,33 @@ void ServerPlayer::doTickB(bool ignorePortal) } #endif - if(!ignorePortal) - { - 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; - - int targetDimension = 0; - if (dimension == -1) targetDimension = 0; - else targetDimension = -1; - - server->getPlayers()->toggleDimension( dynamic_pointer_cast( shared_from_this() ), targetDimension ); - lastSentExp = -1; - lastSentHealth = -1; - lastSentFood = -1; - - //awardStat(Achievements::portal); - } - } - isInsidePortal = false; - } - } - 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)) + 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(); + lastSentHealth = getHealth(); lastSentFood = foodData.getFoodLevel(); lastFoodSaturationZero = foodData.getSaturationLevel() == 0; - } + } + + if (getHealth() + getAbsorptionAmount() != lastRecordedHealthAndAbsorption) + { + lastRecordedHealthAndAbsorption = getHealth() + getAbsorptionAmount(); + + vector *objectives = getScoreboard()->findObjectiveFor(ObjectiveCriteria::HEALTH); + if(objectives) + { + vector< shared_ptr > players = vector< shared_ptr >(); + players.push_back(dynamic_pointer_cast(shared_from_this())); + + for (AUTO_VAR(it,objectives->begin()); it != objectives->end(); ++it) + { + Objective *objective = *it; + getScoreboard()->getPlayerScore(getAName(), objective)->updateFor(&players); + } + delete objectives; + } + } if (totalExperience != lastSentExp) { @@ -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()); - - Pos *pos = server->getLevel(i)->getDimensionSpecificSpawn(); - if (pos != NULL) + if (dimension == 0 && i == 1) { - connection->teleport(pos->x, pos->y, pos->z, 0, 0); - delete pos; + awardStat(GenericStats::theEnd(), GenericStats::param_theEnd()); + + Pos *pos = server->getLevel(i)->getDimensionSpecificSpawn(); + if (pos != NULL) + { + connection->teleport(pos->x, pos->y, pos->z, 0, 0); + delete pos; + } + + i = 1; } - server->getPlayers()->toggleDimension( dynamic_pointer_cast(shared_from_this()), 1); + else + { + // 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()), 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) + 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 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()) { - return false; + if (!player->mayDestroyBlockAt(x, y, z)) + { + 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)); - + if (gameModeForPlayer->isCreative()) + { + 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)); + // 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) + if (itemInstance->count == 0) { - player->inventory->items[player->inventory->selected] = nullptr; - } - return true; - } - return false; + player->inventory->items[player->inventory->selected] = nullptr; + } + if (!player->isUsingItem()) + { + 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 (t > 0 && player->isAllowedToUse(Tile::tiles[t])) { - if (Tile::tiles[t]->TestUse()) return true; - } - else - { - if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) + if(bTestUseOnOnly) { - if(m_gameRules != NULL) m_gameRules->onUseTile(t,x,y,z); - return true; + if (Tile::tiles[t]->TestUse()) return true; + } + else + { + 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/Settings.cpp b/Minecraft.Client/Settings.cpp index 89946773..4223b001 100644 --- a/Minecraft.Client/Settings.cpp +++ b/Minecraft.Client/Settings.cpp @@ -1,18 +1,90 @@ #include "stdafx.h" #include "Settings.h" +#include "..\Minecraft.World\File.h" #include "..\Minecraft.World\StringHelpers.h" +#include + +static wstring ParsePropertyText(const string &text) +{ + return trimString(convStringToWstring(text)); +} + +static bool TryParseBoolean(const wstring &text, bool defaultValue) +{ + wstring lowered = toLower(trimString(text)); + if (lowered == L"true" || lowered == L"1" || lowered == L"yes" || lowered == L"on") + return true; + if (lowered == L"false" || lowered == L"0" || lowered == L"no" || lowered == L"off") + return false; + return defaultValue; +} -// 4J - TODO - serialise/deserialise from file Settings::Settings(File *file) { + if (file != NULL) + { + filePath = file->getPath(); + } + + if (filePath.empty()) + return; + + std::ifstream stream(wstringtofilename(filePath), std::ios::in | std::ios::binary); + if (!stream.is_open()) + return; + + string line; + while (std::getline(stream, line)) + { + if (!line.empty() && line[line.size() - 1] == '\r') + line.erase(line.size() - 1); + + if (line.size() >= 3 && + (unsigned char)line[0] == 0xEF && + (unsigned char)line[1] == 0xBB && + (unsigned char)line[2] == 0xBF) + { + line.erase(0, 3); + } + + size_t commentPos = line.find_first_of("#;"); + if (commentPos != string::npos && line.find_first_not_of(" \t") == commentPos) + continue; + + size_t separatorPos = line.find('='); + if (separatorPos == string::npos) + continue; + + wstring key = ParsePropertyText(line.substr(0, separatorPos)); + if (key.empty()) + continue; + + wstring value = ParsePropertyText(line.substr(separatorPos + 1)); + properties[key] = value; + } } void Settings::generateNewProperties() { + saveProperties(); } void Settings::saveProperties() { + if (filePath.empty()) + return; + + std::ofstream stream(wstringtofilename(filePath), std::ios::out | std::ios::binary | std::ios::trunc); + if (!stream.is_open()) + return; + + stream << "# MinecraftConsoles dedicated server properties\r\n"; + for (unordered_map::const_iterator it = properties.begin(); it != properties.end(); ++it) + { + string key = string(wstringtochararray(it->first)); + string value = string(wstringtochararray(it->second)); + stream << key << "=" << value << "\r\n"; + } } wstring Settings::getString(const wstring& key, const wstring& defaultValue) @@ -39,17 +111,17 @@ bool Settings::getBoolean(const wstring& key, bool defaultValue) { if(properties.find(key) == properties.end()) { - properties[key] = _toString(defaultValue); + properties[key] = defaultValue ? L"true" : L"false"; saveProperties(); } MemSect(35); - bool retval = _fromString(properties[key]); + bool retval = TryParseBoolean(properties[key], defaultValue); MemSect(0); return retval; } void Settings::setBooleanAndSave(const wstring& key, bool value) { - properties[key] = _toString(value); + properties[key] = value ? L"true" : L"false"; saveProperties(); } \ No newline at end of file diff --git a/Minecraft.Client/Settings.h b/Minecraft.Client/Settings.h index b6a2c018..4a3c130b 100644 --- a/Minecraft.Client/Settings.h +++ b/Minecraft.Client/Settings.h @@ -7,8 +7,8 @@ class Settings // public static Logger logger = Logger.getLogger("Minecraft"); // private Properties properties = new Properties(); private: - unordered_map properties; // 4J - TODO was Properties type, will need to implement something we can serialise/deserialise too - //File *file; + unordered_map properties; + wstring filePath; public: Settings(File *file); @@ -18,4 +18,4 @@ public: int getInt(const wstring& key, int defaultValue); bool getBoolean(const wstring& key, bool defaultValue); void setBooleanAndSave(const wstring& key, bool value); -}; +}; \ 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 "..\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 "SkeletonHeadModel.h" +#include "PlayerRenderer.h" +#include "..\Minecraft.World\SkullTileEntity.h" +#include "..\Minecraft.World\net.minecraft.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/TextureHolder.h b/Minecraft.Client/TextureHolder.h index 304d03e7..6c600d63 100644 --- a/Minecraft.Client/TextureHolder.h +++ b/Minecraft.Client/TextureHolder.h @@ -30,7 +30,8 @@ public: int compareTo(const TextureHolder *other) const; }; -typedef struct +struct TextureHolderLessThan { - bool operator() (const TextureHolder *first, const TextureHolder *second) const { return first->compareTo(second) >= 0; } -} TextureHolderLessThan; \ No newline at end of file + inline bool operator()(const TextureHolder *first, const TextureHolder *second) const + { return first->compareTo(second) >= 0; } +}; \ 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=getUsrDirPath(); - - wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); - - if(bTitleUpdateTexture) + char *pchUsrDir=NULL; + if(app.GetBootedFromDiscPatch() && pchBDPatchFileName!=NULL) { - // Make the content package point to to the UPDATE: drive is needed - wDrive= wstr + L"\\Common\\res\\TitleUpdate\\"; + pchUsrDir = app.GetBDUsrDirPath(pchBDPatchFileName); + wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); + + if(bTitleUpdateTexture) + { + 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..b4817ee3 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,125 @@ 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()); + + // Hack: 4JLibs on Windows does not currently reproduce Minecraft's layered horse texture path reliably. + // Merge the layers on the CPU and bind the cached result as a normal single texture instead. + wstring cacheKey = L"%layered%"; + int layers = resource->getTextureCount(); + for( int i = 0; i < layers; i++ ) + { + cacheKey += std::to_wstring(resource->getTexture(i)); + cacheKey += L"/"; + } + + int id = -1; + bool inMap = ( idMap.find(cacheKey) != idMap.end() ); + if( inMap ) + { + id = idMap[cacheKey]; + } + else + { + // Cache by layer signature so the merge cost is only paid once per horse texture combination. + intArray mergedPixels; + int mergedWidth = 0; + int mergedHeight = 0; + bool hasMergedPixels = false; + + for( int i = 0; i < layers; i++ ) + { + TEXTURE_NAME textureName = resource->getTexture(i); + if( textureName == (_TEXTURE_NAME)-1 ) + { + continue; + } + + wstring resourceName = wstring(preLoaded[textureName]) + L".png"; + BufferedImage *image = readImage(textureName, resourceName); + if( image == NULL ) + { + continue; + } + + int width = image->getWidth(); + int height = image->getHeight(); + intArray layerPixels = loadTexturePixels(image); + delete image; + + if( !hasMergedPixels ) + { + mergedWidth = width; + mergedHeight = height; + mergedPixels = intArray(width * height); + memcpy(mergedPixels.data, layerPixels.data, width * height * sizeof(int)); + hasMergedPixels = true; + } + else if( width == mergedWidth && height == mergedHeight ) + { + for( int p = 0; p < width * height; p++ ) + { + int dst = mergedPixels[p]; + int src = layerPixels[p]; + + float srcAlpha = ((src >> 24) & 0xff) / 255.0f; + if( srcAlpha <= 0.0f ) + { + continue; + } + + float dstAlpha = ((dst >> 24) & 0xff) / 255.0f; + float outAlpha = srcAlpha + dstAlpha * (1.0f - srcAlpha); + if( outAlpha <= 0.0f ) + { + mergedPixels[p] = 0; + continue; + } + + float srcFactor = srcAlpha / outAlpha; + float dstFactor = (dstAlpha * (1.0f - srcAlpha)) / outAlpha; + + int outA = (int)(outAlpha * 255.0f + 0.5f); + int outR = (int)((((src >> 16) & 0xff) * srcFactor) + (((dst >> 16) & 0xff) * dstFactor) + 0.5f); + int outG = (int)((((src >> 8) & 0xff) * srcFactor) + (((dst >> 8) & 0xff) * dstFactor) + 0.5f); + int outB = (int)(((src & 0xff) * srcFactor) + ((dst & 0xff) * dstFactor) + 0.5f); + mergedPixels[p] = (outA << 24) | (outR << 16) | (outG << 8) | outB; + } + } + + delete[] layerPixels.data; + } + + if( hasMergedPixels ) + { + BufferedImage *mergedImage = new BufferedImage(mergedWidth, mergedHeight, BufferedImage::TYPE_INT_ARGB); + memcpy(mergedImage->getData(), mergedPixels.data, mergedWidth * mergedHeight * sizeof(int)); + delete[] mergedPixels.data; + id = getTexture(mergedImage, C4JRender::TEXTURE_FORMAT_RxGyBzAw, false); + } + else + { + id = 0; + } + + idMap[cacheKey] = id; + } + + RenderManager.TextureBind(id); } void Textures::bind(int id) @@ -382,6 +539,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 +1477,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 +1537,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()); - clearFixedTexture(); + // 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; - Tesselator *t = Tesselator::getInstance(); + clearFixedTexture(); - float br; - if (SharedConstants::TEXTURE_LIGHTING) + Tesselator *t = Tesselator::getInstance(); + + 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,36 +1517,36 @@ 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; + 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; @@ -1389,7 +1562,7 @@ bool TileRenderer::tesselatePistonBaseInWorld( Tile* tt, int x, int y, int z, bo } 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 ); + 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 ); + 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 ); + 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 + 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, + 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 ) ); // 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 ) ); + 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 + 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; + bool i = false; + float ll1 = 0; + float ll2 = 0; + float ll3 = 0; + float ll4 = 0; + bool tintSides = 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 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 ) { - if ( tileShapeY0 <= 0 ) pY--; // 4J - condition brought forward from 1.2.3 - - 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 ); - - 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 ( 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 ); + 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 = ccxy0; + 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 ( tileShapeY0 <= 0 ) pY++; + + 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); + + 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 ); + + if (tintSides) + { + c1r = c2r = c3r = c4r = pBaseRed * 0.5f; + c1g = c2g = c3g = c4g = pBaseGreen * 0.5f; + c1b = c2b = c3b = c4b = pBaseBlue * 0.5f; + } + else + { + 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 ); + + 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 ); + + 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 ) { - 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 ); - - 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 ); - - 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 - - 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 ); + 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 ( 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 ); + + 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 ); + + 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 ) { - 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 ); + 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++; - 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 ); + 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 ( 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 - - 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 _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++; + + 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 ); + + 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 ) { - if ( tileShapeZ1 >= 1 ) pZ++; // 4J - condition brought forward from 1.2.3 + 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--; - 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 ); + 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); - 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 + { + 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 ) { - 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 = 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 - 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; + 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 ); + 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++; + 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 ( llTransXy0 || llTransX0z ) { - 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 ); + 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 - 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 (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 ( 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 + { + 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)) { + 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, 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, 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 + 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; - } + // 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, 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; - } + 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, 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 ); - } + // 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); - 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; - } - - 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; - } - - 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; + bool changed = false; - int y0 = 0; - for (int i = 0; i < 8; i++) + 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) + 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); - tesselateBlockInWorld(tt, x, y, z); - } - changed = true; + 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); + setShape(0, 0, 0, 1, 1, 1); - return changed; + 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); + 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); + 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); + 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); - } + 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) @@ -6127,10 +6692,10 @@ bool TileRenderer::tesselateFenceGateInWorld(FenceGateTile *tt, int x, int y, in 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); + 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) { @@ -6215,11 +6780,250 @@ bool TileRenderer::tesselateFenceGateInWorld(FenceGateTile *tt, int x, int y, in } } noCulling = false; - upFlip = FLIP_NONE; + upFlip = FLIP_NONE; - setShape(0, 0, 0, 1, 1, 1); + 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(); + + t->begin(); + t->normal(0, 0, 1); + renderSouth(tt, 0, 0, -1.0f + cWidth, hopperTex); + t->end(); + + t->begin(); + t->normal(0, 0, -1); + renderNorth(tt, 0, 0, 1.0f - cWidth, hopperTex); + t->end(); + + 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); + } + + // 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); + + if (render) + { + t->begin(); + t->normal(1, 0, 0); + renderEast(tt, 0, 0, 0, hopperTex); + t->end(); + + t->begin(); + t->normal(-1, 0, 0); + renderWest(tt, 0, 0, 0, hopperTex); + t->end(); + + t->begin(); + t->normal(0, 0, 1); + renderSouth(tt, 0, 0, 0, hopperTex); + t->end(); + + t->begin(); + t->normal(0, 0, -1); + renderNorth(tt, 0, 0, 0, hopperTex); + t->end(); + + t->begin(); + t->normal(0, 1, 0); + renderFaceUp(tt, 0, 0, 0, hopperTex); + t->end(); + + t->begin(); + t->normal(0, -1, 0); + renderFaceDown(tt, 0, 0, 0, hopperTex); + t->end(); + } + else + { + 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) + { + setShape(pipe, 0, pipe, 1.0 - pipe, 4.0 / 16.0, 1.0 - pipe); + tesselateBlockInWorld(tt, x, y, z); + } + // north + if (facing == Facing::NORTH) + { + setShape(pipe, lboxy0, 0, 1.0 - pipe, lboxy0 + pipeW, inset); + tesselateBlockInWorld(tt, x, y, z); + } + // south + if (facing == Facing::SOUTH) + { + setShape(pipe, lboxy0, 1.0 - inset, 1.0 - pipe, lboxy0 + pipeW, 1.0); + tesselateBlockInWorld(tt, x, y, z); + } + // west + if (facing == Facing::WEST) + { + setShape(0, lboxy0, pipe, inset, lboxy0 + pipeW, 1.0 - pipe); + tesselateBlockInWorld(tt, x, y, z); + } + // east + if (facing == Facing::EAST) + { + setShape(1.0 - inset, lboxy0, pipe, 1.0, lboxy0 + pipeW, 1.0 - pipe); + tesselateBlockInWorld(tt, x, y, z); + } + } + + 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 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 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/Timer.cpp b/Minecraft.Client/Timer.cpp index b451c034..15a2c2f1 100644 --- a/Minecraft.Client/Timer.cpp +++ b/Minecraft.Client/Timer.cpp @@ -22,8 +22,9 @@ void Timer::advanceTime() { __int64 nowMs = System::currentTimeMillis(); __int64 passedMs = nowMs - lastMs; - __int64 msSysTime = System::nanoTime() / 1000000; - double now = msSysTime / 1000.0; + + // 4J - Use high-resolution timer for 'now' in seconds + double now = System::nanoTime() / 1000000000.0; if (passedMs > 1000) @@ -39,6 +40,7 @@ void Timer::advanceTime() accumMs += passedMs; if (accumMs > 1000) { + __int64 msSysTime = (__int64)(now * 1000.0); __int64 passedMsSysTime = msSysTime - lastMsSysTime; double adjustTimeT = accumMs / (double) passedMsSysTime; @@ -49,7 +51,7 @@ void Timer::advanceTime() } if (accumMs < 0) { - lastMsSysTime = msSysTime; + lastMsSysTime = (__int64)(now * 1000.0); } } lastMs = nowMs; @@ -68,7 +70,6 @@ void Timer::advanceTime() if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE; a = passedTime; - } void Timer::advanceTimeQuickly() 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) + 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); - } + 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(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); + + // 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; + + bool rot = abs(yRota) >= TOLERANCE_LEVEL || abs(xRota) >= TOLERANCE_LEVEL; + + // 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) + + // 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 (tickCount > 0 || e->instanceof(eTYPE_ARROW) || e->instanceof(eTYPE_PLAYER)) // 4J: Modifed, see above { - 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 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; - // 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; - - bool rot = abs(yRota) >= TOLERANCE_LEVEL || abs(xRota) >= TOLERANCE_LEVEL; - - if (xa < -128 || xa >= 128 || ya < -128 || ya >= 128 || za < -128 || za >= 128 + 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) + 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 (diff > max * max || (diff > 0 && e->xd == 0 && e->yd == 0 && e->zd == 0)) { - 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 (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) ) ); - } - + xap = e->xd; + yap = e->yd; + zap = e->zd; + broadcast( shared_ptr( new SetEntityMotionPacket(e->entityId, xap, yap, zap) ) ); } - if (packet != NULL) - { - broadcast(packet); - } + } - shared_ptr entityData = e->getEntityData(); + if (packet != NULL) + { + broadcast(packet); + } - if (entityData->isDirty()) - { - broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); - } + sendDirtyEntityData(); - 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; - } + 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) - { - // broadcast(new AnimatePacket(e, AnimatePacket.HURT)); - broadcastAndSend( shared_ptr( new SetEntityMotionPacket(e) ) ); - e->hurtMarked = false; - } + 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) ) + { + 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) ) { - sp->connection->send( shared_ptr( new SetEntityMotionPacket(e->entityId, e->xd, e->yd, e->zd) ) ); - } + 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) ) ); + } 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) - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); - } - if (dynamic_pointer_cast(e) != NULL) - { - return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_ENDERDRAGON) - { - return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp ) ); + // 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 ) ); } - if (e->GetType() == eTYPE_FISHINGHOOK) + else if (e->instanceof(eTYPE_MINECART)) + { + 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 AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_ENDERDRAGON)) + { + yHeadRotp = Mth::floor(e->getYHeadRot() * 256 / 360); + return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp ) ); + } + 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)) { - shared_ptr fb = dynamic_pointer_cast(e); - shared_ptr aep = NULL; + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREWORKS, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_FIREBALL)) + { + 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) + else if (e->instanceof(eTYPE_THROWNEGG)) { - 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) + 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::EGG, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == 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)) { - return shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); - } - assert(false); - */ + 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)) ); + } + 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/KeyboardMouseInput.cpp b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp index fc763394..df57db44 100644 --- a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp +++ b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp @@ -103,6 +103,7 @@ void KeyboardMouseInput::OnRawMouseInput(LPARAM lParam) void KeyboardMouseInput::OnMouseButton(int button, bool down) { + if (ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) { return; } if (button >= 0 && button < 3) { if (down && !m_mouseButtons[button]) m_mousePressedAccum[button] = true; diff --git a/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp b/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp new file mode 100644 index 00000000..ca1d62af --- /dev/null +++ b/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp @@ -0,0 +1,920 @@ +// Code implemented by LCEMP, credit if used on other repos +// https://github.com/LCEMP/LCEMP + +#include "stdafx.h" + +#ifdef _WINDOWS64 + +#include "WinsockNetLayer.h" +#include "..\..\Common\Network\PlatformNetworkManagerStub.h" +#include "..\..\..\Minecraft.World\Socket.h" + +SOCKET WinsockNetLayer::s_listenSocket = INVALID_SOCKET; +SOCKET WinsockNetLayer::s_hostConnectionSocket = INVALID_SOCKET; +HANDLE WinsockNetLayer::s_acceptThread = NULL; +HANDLE WinsockNetLayer::s_clientRecvThread = NULL; + +bool WinsockNetLayer::s_isHost = false; +bool WinsockNetLayer::s_connected = false; +bool WinsockNetLayer::s_active = false; +bool WinsockNetLayer::s_initialized = false; + +BYTE WinsockNetLayer::s_localSmallId = 0; +BYTE WinsockNetLayer::s_hostSmallId = 0; +BYTE WinsockNetLayer::s_nextSmallId = 1; + +CRITICAL_SECTION WinsockNetLayer::s_sendLock; +CRITICAL_SECTION WinsockNetLayer::s_connectionsLock; + +std::vector WinsockNetLayer::s_connections; + +SOCKET WinsockNetLayer::s_advertiseSock = INVALID_SOCKET; +HANDLE WinsockNetLayer::s_advertiseThread = NULL; +volatile bool WinsockNetLayer::s_advertising = false; +Win64LANBroadcast WinsockNetLayer::s_advertiseData = {}; +CRITICAL_SECTION WinsockNetLayer::s_advertiseLock; +int WinsockNetLayer::s_hostGamePort = WIN64_NET_DEFAULT_PORT; + +SOCKET WinsockNetLayer::s_discoverySock = INVALID_SOCKET; +HANDLE WinsockNetLayer::s_discoveryThread = NULL; +volatile bool WinsockNetLayer::s_discovering = false; +CRITICAL_SECTION WinsockNetLayer::s_discoveryLock; +std::vector WinsockNetLayer::s_discoveredSessions; + +CRITICAL_SECTION WinsockNetLayer::s_disconnectLock; +std::vector WinsockNetLayer::s_disconnectedSmallIds; + +CRITICAL_SECTION WinsockNetLayer::s_freeSmallIdLock; +std::vector WinsockNetLayer::s_freeSmallIds; + +bool g_Win64MultiplayerHost = false; +bool g_Win64MultiplayerJoin = false; +int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; +char g_Win64MultiplayerIP[256] = "127.0.0.1"; +bool g_Win64DedicatedServer = false; +int g_Win64DedicatedServerPort = WIN64_NET_DEFAULT_PORT; +char g_Win64DedicatedServerBindIP[256] = ""; + +bool WinsockNetLayer::Initialize() +{ + if (s_initialized) return true; + + WSADATA wsaData; + int result = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (result != 0) + { + app.DebugPrintf("WSAStartup failed: %d\n", result); + return false; + } + + InitializeCriticalSection(&s_sendLock); + InitializeCriticalSection(&s_connectionsLock); + InitializeCriticalSection(&s_advertiseLock); + InitializeCriticalSection(&s_discoveryLock); + InitializeCriticalSection(&s_disconnectLock); + InitializeCriticalSection(&s_freeSmallIdLock); + + s_initialized = true; + + StartDiscovery(); + + return true; +} + +void WinsockNetLayer::Shutdown() +{ + StopAdvertising(); + StopDiscovery(); + + s_active = false; + s_connected = false; + + if (s_listenSocket != INVALID_SOCKET) + { + closesocket(s_listenSocket); + s_listenSocket = INVALID_SOCKET; + } + + if (s_hostConnectionSocket != INVALID_SOCKET) + { + closesocket(s_hostConnectionSocket); + s_hostConnectionSocket = INVALID_SOCKET; + } + + EnterCriticalSection(&s_connectionsLock); + for (size_t i = 0; i < s_connections.size(); i++) + { + s_connections[i].active = false; + if (s_connections[i].tcpSocket != INVALID_SOCKET) + { + closesocket(s_connections[i].tcpSocket); + } + } + s_connections.clear(); + LeaveCriticalSection(&s_connectionsLock); + + if (s_acceptThread != NULL) + { + WaitForSingleObject(s_acceptThread, 2000); + CloseHandle(s_acceptThread); + s_acceptThread = NULL; + } + + if (s_clientRecvThread != NULL) + { + WaitForSingleObject(s_clientRecvThread, 2000); + CloseHandle(s_clientRecvThread); + s_clientRecvThread = NULL; + } + + if (s_initialized) + { + DeleteCriticalSection(&s_sendLock); + DeleteCriticalSection(&s_connectionsLock); + DeleteCriticalSection(&s_advertiseLock); + DeleteCriticalSection(&s_discoveryLock); + DeleteCriticalSection(&s_disconnectLock); + s_disconnectedSmallIds.clear(); + DeleteCriticalSection(&s_freeSmallIdLock); + s_freeSmallIds.clear(); + WSACleanup(); + s_initialized = false; + } +} + +bool WinsockNetLayer::HostGame(int port, const char* bindIp) +{ + if (!s_initialized && !Initialize()) return false; + + s_isHost = true; + s_localSmallId = 0; + s_hostSmallId = 0; + s_nextSmallId = 1; + s_hostGamePort = port; + + EnterCriticalSection(&s_freeSmallIdLock); + s_freeSmallIds.clear(); + LeaveCriticalSection(&s_freeSmallIdLock); + + struct addrinfo hints = {}; + struct addrinfo* result = NULL; + + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = (bindIp == NULL || bindIp[0] == 0) ? AI_PASSIVE : 0; + + char portStr[16]; + sprintf_s(portStr, "%d", port); + + const char* resolvedBindIp = (bindIp != NULL && bindIp[0] != 0) ? bindIp : NULL; + int iResult = getaddrinfo(resolvedBindIp, portStr, &hints, &result); + if (iResult != 0) + { + app.DebugPrintf("getaddrinfo failed for %s:%d - %d\n", + resolvedBindIp != NULL ? resolvedBindIp : "*", + port, + iResult); + return false; + } + + s_listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); + if (s_listenSocket == INVALID_SOCKET) + { + app.DebugPrintf("socket() failed: %d\n", WSAGetLastError()); + freeaddrinfo(result); + return false; + } + + int opt = 1; + setsockopt(s_listenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)); + + iResult = ::bind(s_listenSocket, result->ai_addr, (int)result->ai_addrlen); + freeaddrinfo(result); + if (iResult == SOCKET_ERROR) + { + app.DebugPrintf("bind() failed: %d\n", WSAGetLastError()); + closesocket(s_listenSocket); + s_listenSocket = INVALID_SOCKET; + return false; + } + + iResult = listen(s_listenSocket, SOMAXCONN); + if (iResult == SOCKET_ERROR) + { + app.DebugPrintf("listen() failed: %d\n", WSAGetLastError()); + closesocket(s_listenSocket); + s_listenSocket = INVALID_SOCKET; + return false; + } + + s_active = true; + s_connected = true; + + s_acceptThread = CreateThread(NULL, 0, AcceptThreadProc, NULL, 0, NULL); + + app.DebugPrintf("Win64 LAN: Hosting on %s:%d\n", + resolvedBindIp != NULL ? resolvedBindIp : "*", + port); + return true; +} + +bool WinsockNetLayer::JoinGame(const char* ip, int port) +{ + if (!s_initialized && !Initialize()) return false; + + s_isHost = false; + s_hostSmallId = 0; + s_connected = false; + s_active = false; + + if (s_hostConnectionSocket != INVALID_SOCKET) + { + closesocket(s_hostConnectionSocket); + s_hostConnectionSocket = INVALID_SOCKET; + } + + struct addrinfo hints = {}; + struct addrinfo* result = NULL; + + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + char portStr[16]; + sprintf_s(portStr, "%d", port); + + int iResult = getaddrinfo(ip, portStr, &hints, &result); + if (iResult != 0) + { + app.DebugPrintf("getaddrinfo failed for %s:%d - %d\n", ip, port, iResult); + return false; + } + + bool connected = false; + BYTE assignedSmallId = 0; + const int maxAttempts = 12; + + for (int attempt = 0; attempt < maxAttempts; ++attempt) + { + s_hostConnectionSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); + if (s_hostConnectionSocket == INVALID_SOCKET) + { + app.DebugPrintf("socket() failed: %d\n", WSAGetLastError()); + break; + } + + int noDelay = 1; + setsockopt(s_hostConnectionSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&noDelay, sizeof(noDelay)); + + iResult = connect(s_hostConnectionSocket, result->ai_addr, (int)result->ai_addrlen); + if (iResult == SOCKET_ERROR) + { + int err = WSAGetLastError(); + app.DebugPrintf("connect() to %s:%d failed (attempt %d/%d): %d\n", ip, port, attempt + 1, maxAttempts, err); + closesocket(s_hostConnectionSocket); + s_hostConnectionSocket = INVALID_SOCKET; + Sleep(200); + continue; + } + + BYTE assignBuf[1]; + int bytesRecv = recv(s_hostConnectionSocket, (char*)assignBuf, 1, 0); + if (bytesRecv != 1) + { + app.DebugPrintf("Failed to receive small ID assignment from host (attempt %d/%d)\n", attempt + 1, maxAttempts); + closesocket(s_hostConnectionSocket); + s_hostConnectionSocket = INVALID_SOCKET; + Sleep(200); + continue; + } + + assignedSmallId = assignBuf[0]; + connected = true; + break; + } + freeaddrinfo(result); + + if (!connected) + { + return false; + } + s_localSmallId = assignedSmallId; + + app.DebugPrintf("Win64 LAN: Connected to %s:%d, assigned smallId=%d\n", ip, port, s_localSmallId); + + s_active = true; + s_connected = true; + + s_clientRecvThread = CreateThread(NULL, 0, ClientRecvThreadProc, NULL, 0, NULL); + + return true; +} + +bool WinsockNetLayer::SendOnSocket(SOCKET sock, const void* data, int dataSize) +{ + if (sock == INVALID_SOCKET || dataSize <= 0) return false; + + EnterCriticalSection(&s_sendLock); + + BYTE header[4]; + header[0] = (BYTE)((dataSize >> 24) & 0xFF); + header[1] = (BYTE)((dataSize >> 16) & 0xFF); + header[2] = (BYTE)((dataSize >> 8) & 0xFF); + header[3] = (BYTE)(dataSize & 0xFF); + + int totalSent = 0; + int toSend = 4; + while (totalSent < toSend) + { + int sent = send(sock, (const char*)header + totalSent, toSend - totalSent, 0); + if (sent == SOCKET_ERROR || sent == 0) + { + LeaveCriticalSection(&s_sendLock); + return false; + } + totalSent += sent; + } + + totalSent = 0; + while (totalSent < dataSize) + { + int sent = send(sock, (const char*)data + totalSent, dataSize - totalSent, 0); + if (sent == SOCKET_ERROR || sent == 0) + { + LeaveCriticalSection(&s_sendLock); + return false; + } + totalSent += sent; + } + + LeaveCriticalSection(&s_sendLock); + return true; +} + +bool WinsockNetLayer::SendToSmallId(BYTE targetSmallId, const void* data, int dataSize) +{ + if (!s_active) return false; + + if (s_isHost) + { + SOCKET sock = GetSocketForSmallId(targetSmallId); + if (sock == INVALID_SOCKET) return false; + return SendOnSocket(sock, data, dataSize); + } + else + { + return SendOnSocket(s_hostConnectionSocket, data, dataSize); + } +} + +SOCKET WinsockNetLayer::GetSocketForSmallId(BYTE smallId) +{ + EnterCriticalSection(&s_connectionsLock); + for (size_t i = 0; i < s_connections.size(); i++) + { + if (s_connections[i].smallId == smallId && s_connections[i].active) + { + SOCKET sock = s_connections[i].tcpSocket; + LeaveCriticalSection(&s_connectionsLock); + return sock; + } + } + LeaveCriticalSection(&s_connectionsLock); + return INVALID_SOCKET; +} + +static bool RecvExact(SOCKET sock, BYTE* buf, int len) +{ + int totalRecv = 0; + while (totalRecv < len) + { + int r = recv(sock, (char*)buf + totalRecv, len - totalRecv, 0); + if (r <= 0) return false; + totalRecv += r; + } + return true; +} + +void WinsockNetLayer::HandleDataReceived(BYTE fromSmallId, BYTE toSmallId, unsigned char* data, unsigned int dataSize) +{ + INetworkPlayer* pPlayerFrom = g_NetworkManager.GetPlayerBySmallId(fromSmallId); + INetworkPlayer* pPlayerTo = g_NetworkManager.GetPlayerBySmallId(toSmallId); + + if (pPlayerFrom == NULL || pPlayerTo == NULL) return; + + if (s_isHost) + { + ::Socket* pSocket = pPlayerFrom->GetSocket(); + if (pSocket != NULL) + pSocket->pushDataToQueue(data, dataSize, false); + } + else + { + ::Socket* pSocket = pPlayerTo->GetSocket(); + if (pSocket != NULL) + pSocket->pushDataToQueue(data, dataSize, true); + } +} + +DWORD WINAPI WinsockNetLayer::AcceptThreadProc(LPVOID param) +{ + while (s_active) + { + SOCKET clientSocket = accept(s_listenSocket, NULL, NULL); + if (clientSocket == INVALID_SOCKET) + { + if (s_active) + app.DebugPrintf("accept() failed: %d\n", WSAGetLastError()); + break; + } + + int noDelay = 1; + setsockopt(clientSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&noDelay, sizeof(noDelay)); + + extern QNET_STATE _iQNetStubState; + if (_iQNetStubState != QNET_STATE_GAME_PLAY) + { + app.DebugPrintf("Win64 LAN: Rejecting connection, game not ready\n"); + closesocket(clientSocket); + continue; + } + + BYTE assignedSmallId; + EnterCriticalSection(&s_freeSmallIdLock); + if (!s_freeSmallIds.empty()) + { + assignedSmallId = s_freeSmallIds.back(); + s_freeSmallIds.pop_back(); + } + else if (s_nextSmallId < MINECRAFT_NET_MAX_PLAYERS) + { + assignedSmallId = s_nextSmallId++; + } + else + { + LeaveCriticalSection(&s_freeSmallIdLock); + app.DebugPrintf("Win64 LAN: Server full, rejecting connection\n"); + closesocket(clientSocket); + continue; + } + LeaveCriticalSection(&s_freeSmallIdLock); + + BYTE assignBuf[1] = { assignedSmallId }; + int sent = send(clientSocket, (const char*)assignBuf, 1, 0); + if (sent != 1) + { + app.DebugPrintf("Failed to send small ID to client\n"); + closesocket(clientSocket); + continue; + } + + Win64RemoteConnection conn; + conn.tcpSocket = clientSocket; + conn.smallId = assignedSmallId; + conn.active = true; + conn.recvThread = NULL; + + EnterCriticalSection(&s_connectionsLock); + s_connections.push_back(conn); + int connIdx = (int)s_connections.size() - 1; + LeaveCriticalSection(&s_connectionsLock); + + app.DebugPrintf("Win64 LAN: Client connected, assigned smallId=%d\n", assignedSmallId); + + IQNetPlayer* qnetPlayer = &IQNet::m_player[assignedSmallId]; + + extern void Win64_SetupRemoteQNetPlayer(IQNetPlayer * player, BYTE smallId, bool isHost, bool isLocal); + Win64_SetupRemoteQNetPlayer(qnetPlayer, assignedSmallId, false, false); + + extern CPlatformNetworkManagerStub* g_pPlatformNetworkManager; + g_pPlatformNetworkManager->NotifyPlayerJoined(qnetPlayer); + + DWORD* threadParam = new DWORD; + *threadParam = connIdx; + HANDLE hThread = CreateThread(NULL, 0, RecvThreadProc, threadParam, 0, NULL); + + EnterCriticalSection(&s_connectionsLock); + if (connIdx < (int)s_connections.size()) + s_connections[connIdx].recvThread = hThread; + LeaveCriticalSection(&s_connectionsLock); + } + return 0; +} + +DWORD WINAPI WinsockNetLayer::RecvThreadProc(LPVOID param) +{ + DWORD connIdx = *(DWORD*)param; + delete (DWORD*)param; + + EnterCriticalSection(&s_connectionsLock); + if (connIdx >= (DWORD)s_connections.size()) + { + LeaveCriticalSection(&s_connectionsLock); + return 0; + } + SOCKET sock = s_connections[connIdx].tcpSocket; + BYTE clientSmallId = s_connections[connIdx].smallId; + LeaveCriticalSection(&s_connectionsLock); + + std::vector recvBuf; + recvBuf.resize(WIN64_NET_RECV_BUFFER_SIZE); + + while (s_active) + { + BYTE header[4]; + if (!RecvExact(sock, header, 4)) + { + app.DebugPrintf("Win64 LAN: Client smallId=%d disconnected (header)\n", clientSmallId); + break; + } + + int packetSize = + ((uint32_t)header[0] << 24) | + ((uint32_t)header[1] << 16) | + ((uint32_t)header[2] << 8) | + ((uint32_t)header[3]); + + if (packetSize <= 0 || packetSize > WIN64_NET_MAX_PACKET_SIZE) + { + app.DebugPrintf("Win64 LAN: Invalid packet size %d from client smallId=%d (max=%d)\n", + packetSize, + clientSmallId, + (int)WIN64_NET_MAX_PACKET_SIZE); + break; + } + + if ((int)recvBuf.size() < packetSize) + { + recvBuf.resize(packetSize); + app.DebugPrintf("Win64 LAN: Resized host recv buffer to %d bytes for client smallId=%d\n", packetSize, clientSmallId); + } + + if (!RecvExact(sock, &recvBuf[0], packetSize)) + { + app.DebugPrintf("Win64 LAN: Client smallId=%d disconnected (body)\n", clientSmallId); + break; + } + + HandleDataReceived(clientSmallId, s_hostSmallId, &recvBuf[0], packetSize); + } + + EnterCriticalSection(&s_connectionsLock); + for (size_t i = 0; i < s_connections.size(); i++) + { + if (s_connections[i].smallId == clientSmallId) + { + s_connections[i].active = false; + if (s_connections[i].tcpSocket != INVALID_SOCKET) + { + closesocket(s_connections[i].tcpSocket); + s_connections[i].tcpSocket = INVALID_SOCKET; + } + break; + } + } + LeaveCriticalSection(&s_connectionsLock); + + EnterCriticalSection(&s_disconnectLock); + s_disconnectedSmallIds.push_back(clientSmallId); + LeaveCriticalSection(&s_disconnectLock); + + return 0; +} + +bool WinsockNetLayer::PopDisconnectedSmallId(BYTE* outSmallId) +{ + bool found = false; + EnterCriticalSection(&s_disconnectLock); + if (!s_disconnectedSmallIds.empty()) + { + *outSmallId = s_disconnectedSmallIds.back(); + s_disconnectedSmallIds.pop_back(); + found = true; + } + LeaveCriticalSection(&s_disconnectLock); + return found; +} + +void WinsockNetLayer::PushFreeSmallId(BYTE smallId) +{ + EnterCriticalSection(&s_freeSmallIdLock); + s_freeSmallIds.push_back(smallId); + LeaveCriticalSection(&s_freeSmallIdLock); +} + +void WinsockNetLayer::CloseConnectionBySmallId(BYTE smallId) +{ + EnterCriticalSection(&s_connectionsLock); + for (size_t i = 0; i < s_connections.size(); i++) + { + if (s_connections[i].smallId == smallId && s_connections[i].active && s_connections[i].tcpSocket != INVALID_SOCKET) + { + closesocket(s_connections[i].tcpSocket); + s_connections[i].tcpSocket = INVALID_SOCKET; + app.DebugPrintf("Win64 LAN: Force-closed TCP connection for smallId=%d\n", smallId); + break; + } + } + LeaveCriticalSection(&s_connectionsLock); +} + +DWORD WINAPI WinsockNetLayer::ClientRecvThreadProc(LPVOID param) +{ + std::vector recvBuf; + recvBuf.resize(WIN64_NET_RECV_BUFFER_SIZE); + + while (s_active && s_hostConnectionSocket != INVALID_SOCKET) + { + BYTE header[4]; + if (!RecvExact(s_hostConnectionSocket, header, 4)) + { + app.DebugPrintf("Win64 LAN: Disconnected from host (header)\n"); + break; + } + + int packetSize = (header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3]; + + if (packetSize <= 0 || packetSize > WIN64_NET_MAX_PACKET_SIZE) + { + app.DebugPrintf("Win64 LAN: Invalid packet size %d from host (max=%d)\n", + packetSize, + (int)WIN64_NET_MAX_PACKET_SIZE); + break; + } + + if ((int)recvBuf.size() < packetSize) + { + recvBuf.resize(packetSize); + app.DebugPrintf("Win64 LAN: Resized client recv buffer to %d bytes\n", packetSize); + } + + if (!RecvExact(s_hostConnectionSocket, &recvBuf[0], packetSize)) + { + app.DebugPrintf("Win64 LAN: Disconnected from host (body)\n"); + break; + } + + HandleDataReceived(s_hostSmallId, s_localSmallId, &recvBuf[0], packetSize); + } + + s_connected = false; + return 0; +} + +bool WinsockNetLayer::StartAdvertising(int gamePort, const wchar_t* hostName, unsigned int gameSettings, unsigned int texPackId, unsigned char subTexId, unsigned short netVer) +{ + if (s_advertising) return true; + if (!s_initialized) return false; + + EnterCriticalSection(&s_advertiseLock); + memset(&s_advertiseData, 0, sizeof(s_advertiseData)); + s_advertiseData.magic = WIN64_LAN_BROADCAST_MAGIC; + s_advertiseData.netVersion = netVer; + s_advertiseData.gamePort = (WORD)gamePort; + wcsncpy_s(s_advertiseData.hostName, 32, hostName, _TRUNCATE); + s_advertiseData.playerCount = 1; + s_advertiseData.maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + s_advertiseData.gameHostSettings = gameSettings; + s_advertiseData.texturePackParentId = texPackId; + s_advertiseData.subTexturePackId = subTexId; + s_advertiseData.isJoinable = 0; + s_hostGamePort = gamePort; + LeaveCriticalSection(&s_advertiseLock); + + s_advertiseSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (s_advertiseSock == INVALID_SOCKET) + { + app.DebugPrintf("Win64 LAN: Failed to create advertise socket: %d\n", WSAGetLastError()); + return false; + } + + BOOL broadcast = TRUE; + setsockopt(s_advertiseSock, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcast, sizeof(broadcast)); + + s_advertising = true; + s_advertiseThread = CreateThread(NULL, 0, AdvertiseThreadProc, NULL, 0, NULL); + + app.DebugPrintf("Win64 LAN: Started advertising on UDP port %d\n", WIN64_LAN_DISCOVERY_PORT); + return true; +} + +void WinsockNetLayer::StopAdvertising() +{ + s_advertising = false; + + if (s_advertiseSock != INVALID_SOCKET) + { + closesocket(s_advertiseSock); + s_advertiseSock = INVALID_SOCKET; + } + + if (s_advertiseThread != NULL) + { + WaitForSingleObject(s_advertiseThread, 2000); + CloseHandle(s_advertiseThread); + s_advertiseThread = NULL; + } +} + +void WinsockNetLayer::UpdateAdvertisePlayerCount(BYTE count) +{ + EnterCriticalSection(&s_advertiseLock); + s_advertiseData.playerCount = count; + LeaveCriticalSection(&s_advertiseLock); +} + +void WinsockNetLayer::UpdateAdvertiseJoinable(bool joinable) +{ + EnterCriticalSection(&s_advertiseLock); + s_advertiseData.isJoinable = joinable ? 1 : 0; + LeaveCriticalSection(&s_advertiseLock); +} + +DWORD WINAPI WinsockNetLayer::AdvertiseThreadProc(LPVOID param) +{ + struct sockaddr_in broadcastAddr; + memset(&broadcastAddr, 0, sizeof(broadcastAddr)); + broadcastAddr.sin_family = AF_INET; + broadcastAddr.sin_port = htons(WIN64_LAN_DISCOVERY_PORT); + broadcastAddr.sin_addr.s_addr = INADDR_BROADCAST; + + while (s_advertising) + { + EnterCriticalSection(&s_advertiseLock); + Win64LANBroadcast data = s_advertiseData; + LeaveCriticalSection(&s_advertiseLock); + + int sent = sendto(s_advertiseSock, (const char*)&data, sizeof(data), 0, + (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr)); + + if (sent == SOCKET_ERROR && s_advertising) + { + app.DebugPrintf("Win64 LAN: Broadcast sendto failed: %d\n", WSAGetLastError()); + } + + Sleep(1000); + } + + return 0; +} + +bool WinsockNetLayer::StartDiscovery() +{ + if (s_discovering) return true; + if (!s_initialized) return false; + + s_discoverySock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (s_discoverySock == INVALID_SOCKET) + { + app.DebugPrintf("Win64 LAN: Failed to create discovery socket: %d\n", WSAGetLastError()); + return false; + } + + BOOL reuseAddr = TRUE; + setsockopt(s_discoverySock, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseAddr, sizeof(reuseAddr)); + + struct sockaddr_in bindAddr; + memset(&bindAddr, 0, sizeof(bindAddr)); + bindAddr.sin_family = AF_INET; + bindAddr.sin_port = htons(WIN64_LAN_DISCOVERY_PORT); + bindAddr.sin_addr.s_addr = INADDR_ANY; + + if (::bind(s_discoverySock, (struct sockaddr*)&bindAddr, sizeof(bindAddr)) == SOCKET_ERROR) + { + app.DebugPrintf("Win64 LAN: Discovery bind failed: %d\n", WSAGetLastError()); + closesocket(s_discoverySock); + s_discoverySock = INVALID_SOCKET; + return false; + } + + DWORD timeout = 500; + setsockopt(s_discoverySock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); + + s_discovering = true; + s_discoveryThread = CreateThread(NULL, 0, DiscoveryThreadProc, NULL, 0, NULL); + + app.DebugPrintf("Win64 LAN: Listening for LAN games on UDP port %d\n", WIN64_LAN_DISCOVERY_PORT); + return true; +} + +void WinsockNetLayer::StopDiscovery() +{ + s_discovering = false; + + if (s_discoverySock != INVALID_SOCKET) + { + closesocket(s_discoverySock); + s_discoverySock = INVALID_SOCKET; + } + + if (s_discoveryThread != NULL) + { + WaitForSingleObject(s_discoveryThread, 2000); + CloseHandle(s_discoveryThread); + s_discoveryThread = NULL; + } + + EnterCriticalSection(&s_discoveryLock); + s_discoveredSessions.clear(); + LeaveCriticalSection(&s_discoveryLock); +} + +std::vector WinsockNetLayer::GetDiscoveredSessions() +{ + std::vector result; + EnterCriticalSection(&s_discoveryLock); + result = s_discoveredSessions; + LeaveCriticalSection(&s_discoveryLock); + return result; +} + +DWORD WINAPI WinsockNetLayer::DiscoveryThreadProc(LPVOID param) +{ + char recvBuf[512]; + + while (s_discovering) + { + struct sockaddr_in senderAddr; + int senderLen = sizeof(senderAddr); + + int recvLen = recvfrom(s_discoverySock, recvBuf, sizeof(recvBuf), 0, + (struct sockaddr*)&senderAddr, &senderLen); + + if (recvLen == SOCKET_ERROR) + { + continue; + } + + if (recvLen < (int)sizeof(Win64LANBroadcast)) + continue; + + Win64LANBroadcast* broadcast = (Win64LANBroadcast*)recvBuf; + if (broadcast->magic != WIN64_LAN_BROADCAST_MAGIC) + continue; + + char senderIP[64]; + inet_ntop(AF_INET, &senderAddr.sin_addr, senderIP, sizeof(senderIP)); + + DWORD now = GetTickCount(); + + EnterCriticalSection(&s_discoveryLock); + + bool found = false; + for (size_t i = 0; i < s_discoveredSessions.size(); i++) + { + if (strcmp(s_discoveredSessions[i].hostIP, senderIP) == 0 && + s_discoveredSessions[i].hostPort == (int)broadcast->gamePort) + { + s_discoveredSessions[i].netVersion = broadcast->netVersion; + wcsncpy_s(s_discoveredSessions[i].hostName, 32, broadcast->hostName, _TRUNCATE); + s_discoveredSessions[i].playerCount = broadcast->playerCount; + s_discoveredSessions[i].maxPlayers = broadcast->maxPlayers; + s_discoveredSessions[i].gameHostSettings = broadcast->gameHostSettings; + s_discoveredSessions[i].texturePackParentId = broadcast->texturePackParentId; + s_discoveredSessions[i].subTexturePackId = broadcast->subTexturePackId; + s_discoveredSessions[i].isJoinable = (broadcast->isJoinable != 0); + s_discoveredSessions[i].lastSeenTick = now; + found = true; + break; + } + } + + if (!found) + { + Win64LANSession session; + memset(&session, 0, sizeof(session)); + strncpy_s(session.hostIP, sizeof(session.hostIP), senderIP, _TRUNCATE); + session.hostPort = (int)broadcast->gamePort; + session.netVersion = broadcast->netVersion; + wcsncpy_s(session.hostName, 32, broadcast->hostName, _TRUNCATE); + session.playerCount = broadcast->playerCount; + session.maxPlayers = broadcast->maxPlayers; + session.gameHostSettings = broadcast->gameHostSettings; + session.texturePackParentId = broadcast->texturePackParentId; + session.subTexturePackId = broadcast->subTexturePackId; + session.isJoinable = (broadcast->isJoinable != 0); + session.lastSeenTick = now; + s_discoveredSessions.push_back(session); + + app.DebugPrintf("Win64 LAN: Discovered game \"%ls\" at %s:%d\n", + session.hostName, session.hostIP, session.hostPort); + } + + for (size_t i = s_discoveredSessions.size(); i > 0; i--) + { + if (now - s_discoveredSessions[i - 1].lastSeenTick > 5000) + { + app.DebugPrintf("Win64 LAN: Session \"%ls\" at %s timed out\n", + s_discoveredSessions[i - 1].hostName, s_discoveredSessions[i - 1].hostIP); + s_discoveredSessions.erase(s_discoveredSessions.begin() + (i - 1)); + } + } + + LeaveCriticalSection(&s_discoveryLock); + } + + return 0; +} + +#endif diff --git a/Minecraft.Client/Windows64/Network/WinsockNetLayer.h b/Minecraft.Client/Windows64/Network/WinsockNetLayer.h new file mode 100644 index 00000000..fd1280f7 --- /dev/null +++ b/Minecraft.Client/Windows64/Network/WinsockNetLayer.h @@ -0,0 +1,154 @@ +// Code implemented by LCEMP, credit if used on other repos +// https://github.com/LCEMP/LCEMP +#pragma once + +#ifdef _WINDOWS64 + +#include +#include +#include +#include "..\..\Common\Network\NetworkPlayerInterface.h" + +#pragma comment(lib, "Ws2_32.lib") + +#define WIN64_NET_DEFAULT_PORT 25565 +#define WIN64_NET_MAX_CLIENTS 7 +#define WIN64_NET_RECV_BUFFER_SIZE 65536 +#define WIN64_NET_MAX_PACKET_SIZE (4 * 1024 * 1024) +#define WIN64_LAN_DISCOVERY_PORT 25566 +#define WIN64_LAN_BROADCAST_MAGIC 0x4D434C4E + +class Socket; + +#pragma pack(push, 1) +struct Win64LANBroadcast +{ + DWORD magic; + WORD netVersion; + WORD gamePort; + wchar_t hostName[32]; + BYTE playerCount; + BYTE maxPlayers; + DWORD gameHostSettings; + DWORD texturePackParentId; + BYTE subTexturePackId; + BYTE isJoinable; +}; +#pragma pack(pop) + +struct Win64LANSession +{ + char hostIP[64]; + int hostPort; + wchar_t hostName[32]; + unsigned short netVersion; + unsigned char playerCount; + unsigned char maxPlayers; + unsigned int gameHostSettings; + unsigned int texturePackParentId; + unsigned char subTexturePackId; + bool isJoinable; + DWORD lastSeenTick; +}; + +struct Win64RemoteConnection +{ + SOCKET tcpSocket; + BYTE smallId; + HANDLE recvThread; + volatile bool active; +}; + +class WinsockNetLayer +{ +public: + static bool Initialize(); + static void Shutdown(); + + static bool HostGame(int port, const char* bindIp = NULL); + static bool JoinGame(const char* ip, int port); + + static bool SendToSmallId(BYTE targetSmallId, const void* data, int dataSize); + static bool SendOnSocket(SOCKET sock, const void* data, int dataSize); + + static bool IsHosting() { return s_isHost; } + static bool IsConnected() { return s_connected; } + static bool IsActive() { return s_active; } + + static BYTE GetLocalSmallId() { return s_localSmallId; } + static BYTE GetHostSmallId() { return s_hostSmallId; } + + static SOCKET GetSocketForSmallId(BYTE smallId); + + static void HandleDataReceived(BYTE fromSmallId, BYTE toSmallId, unsigned char* data, unsigned int dataSize); + + static bool PopDisconnectedSmallId(BYTE* outSmallId); + static void PushFreeSmallId(BYTE smallId); + static void CloseConnectionBySmallId(BYTE smallId); + + static bool StartAdvertising(int gamePort, const wchar_t* hostName, unsigned int gameSettings, unsigned int texPackId, unsigned char subTexId, unsigned short netVer); + static void StopAdvertising(); + static void UpdateAdvertisePlayerCount(BYTE count); + static void UpdateAdvertiseJoinable(bool joinable); + + static bool StartDiscovery(); + static void StopDiscovery(); + static std::vector GetDiscoveredSessions(); + + static int GetHostPort() { return s_hostGamePort; } + +private: + static DWORD WINAPI AcceptThreadProc(LPVOID param); + static DWORD WINAPI RecvThreadProc(LPVOID param); + static DWORD WINAPI ClientRecvThreadProc(LPVOID param); + static DWORD WINAPI AdvertiseThreadProc(LPVOID param); + static DWORD WINAPI DiscoveryThreadProc(LPVOID param); + + static SOCKET s_listenSocket; + static SOCKET s_hostConnectionSocket; + static HANDLE s_acceptThread; + static HANDLE s_clientRecvThread; + + static bool s_isHost; + static bool s_connected; + static bool s_active; + static bool s_initialized; + + static BYTE s_localSmallId; + static BYTE s_hostSmallId; + static BYTE s_nextSmallId; + + static CRITICAL_SECTION s_sendLock; + static CRITICAL_SECTION s_connectionsLock; + + static std::vector s_connections; + + static SOCKET s_advertiseSock; + static HANDLE s_advertiseThread; + static volatile bool s_advertising; + static Win64LANBroadcast s_advertiseData; + static CRITICAL_SECTION s_advertiseLock; + static int s_hostGamePort; + + static SOCKET s_discoverySock; + static HANDLE s_discoveryThread; + static volatile bool s_discovering; + static CRITICAL_SECTION s_discoveryLock; + static std::vector s_discoveredSessions; + + static CRITICAL_SECTION s_disconnectLock; + static std::vector s_disconnectedSmallIds; + + static CRITICAL_SECTION s_freeSmallIdLock; + static std::vector s_freeSmallIds; +}; + +extern bool g_Win64MultiplayerHost; +extern bool g_Win64MultiplayerJoin; +extern int g_Win64MultiplayerPort; +extern char g_Win64MultiplayerIP[256]; +extern bool g_Win64DedicatedServer; +extern int g_Win64DedicatedServerPort; +extern char g_Win64DedicatedServerBindIP[256]; + +#endif diff --git a/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h b/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h index 77d39a39..5a5a709f 100644 --- a/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h +++ b/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h @@ -8,8 +8,8 @@ EnemyWeaponID What weapon the enemy is holding or what counter/AI the enemy is t EnrollmentType How did players enroll? (Using Kinect) LandscapeOrPortrait Are you currently showing in landscape or portrait mode? (Win8 only) LevelDurationInSeconds How long, total, has the user been playing in this level - whatever best represents this duration for attempting the level you'd like to track. -LevelExitProgressStat1 Refers to the highest level performance metric for your game. For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed in the level before exiting. -LevelExitProgressStat2 Refers to the highest level performance metric for your game. For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed in the level before exiting. +LevelExitProgressStat1 Refers to the highest level performance metric for your game.� For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed �in the level before exiting. +LevelExitProgressStat2 Refers to the highest level performance metric for your game.� For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed �in the level before exiting. LevelID This is a more granular view of mode, allowing teams to get a sense of the levels or maps players are playing and providing some insight into how players progress through a game. Teams will have to provide the game mappings that correspond to the integers. The intent is that a level is highest level at which modes can be dissected and provides an indication of player progression in a game. The intent is that level start and ends do not occur more than every 2 minutes or so, otherwise the data reported will be difficult to understand. Levels are unique only within a given modeID - so you can have a ModeID =1, LevelID =1 and a different ModeID=2, LevelID = 1 indicate two completely different levels. LevelID = 0 means undefined or unknown. LevelInstanceID Generated by the game every time LevelStart or LevelResume is called. This should be a unique ID (can be sequential) within a session. LowResMapX Player position normalized to 0-255 @@ -18,7 +18,7 @@ LowResMapZ Player position normalized to 0-255 MapID Unique ID for the current map the player is on MarketplaceOfferID Unique ID for the Xbox LIVE marketplace offer that the upsell links to MicroGoodTypeID Describes the type of consumable or microgood -MultiplayerInstanceID multiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session. +MultiplayerInstanceID multiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session.� NumberOfLocalPlayers the number of players that are playing together in the game locally in the current session (on the same piece of hardware) NumberOfOnlinePlayers the number of players that are playing together in the game online in the current session (not on the same piece of hardware) NumberOfSkeletonsInView the max and min of skeletons that were in view, regardless of enrollment @@ -28,7 +28,7 @@ PlayerLevelUpProgressStat1 Refers to a performance metric for your player when t PlayerLevelUpProgressStat2 Refers to a performance metric for your player when they level or rank up. This is entirely up to you and will help us understand how well the player performed, or how far the player has progressed. PlayerWeaponID What weapon the player is holding or what approach/tact the player is taking to overcome a challenge PlayspaceFeedbackWarningDirection identifies which side of the playspace players are getting too close to that results in the playspace feedback -SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the players experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a players experience in your title and provide an accurate measure of time in level. +SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the player�s experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a player�s experience in your title and provide an accurate measure of time in level. SecondsSinceInitialize Number of seconds elapsed since Sentient initialize. SecondsSinceInitializeMax Number of seconds elapsed since Sentient initialize. SecondsSinceInitializeMin Number of seconds elapsed since Sentient initialize. @@ -224,6 +224,12 @@ enum ETelemetryChallenges eTelemetryTutorial_Trading, eTelemetryTutorial_TradingMenu, eTelemetryTutorial_Enderchest, + eTelemetryTutorial_Hopper, + eTelemetryTutorial_Beacon, + eTelemetryTutorial_Horse, + eTelemetryTutorial_HorseMenu, + eTelemetryTutorial_FireworksMenu, + eTelemetryTutorial_BeaconMenu // Sent over network as a byte }; \ No newline at end of file diff --git a/Minecraft.Client/Windows64/Windows64_App.cpp b/Minecraft.Client/Windows64/Windows64_App.cpp index bba33cad..ad9e1f24 100644 --- a/Minecraft.Client/Windows64/Windows64_App.cpp +++ b/Minecraft.Client/Windows64/Windows64_App.cpp @@ -35,9 +35,27 @@ void CConsoleMinecraftApp::FatalLoadError() void CConsoleMinecraftApp::CaptureSaveThumbnail() { + RenderManager.CaptureThumbnail(&m_ThumbnailBuffer); } void CConsoleMinecraftApp::GetSaveThumbnail(PBYTE *pbData,DWORD *pdwSize) { + // On a save caused by a create world, the thumbnail capture won't have happened + if (m_ThumbnailBuffer.Allocated()) + { + if (pbData) + { + *pbData = new BYTE[m_ThumbnailBuffer.GetBufferSize()]; + *pdwSize = m_ThumbnailBuffer.GetBufferSize(); + memcpy(*pbData, m_ThumbnailBuffer.GetBufferPointer(), *pdwSize); + } + m_ThumbnailBuffer.Release(); + } + else + { + // No capture happened (e.g. first save on world creation) leave thumbnail as NULL + if (pbData) *pbData = NULL; + if (pdwSize) *pdwSize = 0; + } } void CConsoleMinecraftApp::ReleaseSaveThumbnail() { @@ -57,7 +75,8 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() Minecraft *pMinecraft=Minecraft::GetInstance(); app.ReleaseSaveThumbnail(); ProfileManager.SetLockedProfile(0); - pMinecraft->user->name = L"Windows"; + extern wchar_t g_Win64UsernameW[17]; + pMinecraft->user->name = g_Win64UsernameW; app.ApplyGameSettingsChanged(0); ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameJoinLoad::OnInit diff --git a/Minecraft.Client/Windows64/Windows64_App.h b/Minecraft.Client/Windows64/Windows64_App.h index de8f6d85..bff916ec 100644 --- a/Minecraft.Client/Windows64/Windows64_App.h +++ b/Minecraft.Client/Windows64/Windows64_App.h @@ -1,7 +1,9 @@ #pragma once +#include "4JLibs\inc\4J_Render.h" class CConsoleMinecraftApp : public CMinecraftApp { + ImageFileBuffer m_ThumbnailBuffer; public: CConsoleMinecraftApp(); diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 1bffe317..ed6781a3 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -4,6 +4,9 @@ #include "stdafx.h" #include +#include +#include +#include #include "GameConfig\Minecraft.spa.h" #include "..\MinecraftServer.h" #include "..\LocalPlayer.h" @@ -33,9 +36,11 @@ #include "Sentient\SentientManager.h" #include "..\..\Minecraft.World\IntCache.h" #include "..\Textures.h" +#include "..\Settings.h" #include "Resource.h" #include "..\..\Minecraft.World\compression.h" #include "..\..\Minecraft.World\OldChunkStorage.h" +#include "Network\WinsockNetLayer.h" #include "Xbox/resource.h" @@ -83,10 +88,158 @@ BOOL g_bWidescreen = TRUE; int g_iScreenWidth = 1920; int g_iScreenHeight = 1080; +UINT g_ScreenWidth = 1920; +UINT g_ScreenHeight = 1080; + +char g_Win64Username[17] = { 0 }; +wchar_t g_Win64UsernameW[17] = { 0 }; + // Fullscreen toggle state static bool g_isFullscreen = false; static WINDOWPLACEMENT g_wpPrev = { sizeof(g_wpPrev) }; +struct Win64LaunchOptions +{ + int screenMode; + bool serverMode; +}; + +static void CopyWideArgToAnsi(LPCWSTR source, char* dest, size_t destSize) +{ + if (destSize == 0) + return; + + dest[0] = 0; + if (source == NULL) + return; + + WideCharToMultiByte(CP_ACP, 0, source, -1, dest, (int)destSize, NULL, NULL); + dest[destSize - 1] = 0; +} + +static void ApplyScreenMode(int screenMode) +{ + switch (screenMode) + { + case 1: + g_iScreenWidth = 1280; + g_iScreenHeight = 720; + break; + case 2: + g_iScreenWidth = 640; + g_iScreenHeight = 480; + break; + case 3: + g_iScreenWidth = 720; + g_iScreenHeight = 408; + break; + default: + break; + } +} + +static Win64LaunchOptions ParseLaunchOptions() +{ + Win64LaunchOptions options = {}; + options.screenMode = 0; + options.serverMode = false; + + g_Win64MultiplayerJoin = false; + g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; + g_Win64DedicatedServer = false; + g_Win64DedicatedServerPort = WIN64_NET_DEFAULT_PORT; + g_Win64DedicatedServerBindIP[0] = 0; + + int argc = 0; + LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); + if (argv == NULL) + return options; + + if (argc > 1 && lstrlenW(argv[1]) == 1) + { + if (argv[1][0] >= L'1' && argv[1][0] <= L'3') + options.screenMode = argv[1][0] - L'0'; + } + + for (int i = 1; i < argc; ++i) + { + if (_wcsicmp(argv[i], L"-server") == 0) + { + options.serverMode = true; + break; + } + } + + g_Win64DedicatedServer = options.serverMode; + + for (int i = 1; i < argc; ++i) + { + if (_wcsicmp(argv[i], L"-name") == 0 && (i + 1) < argc) + { + CopyWideArgToAnsi(argv[++i], g_Win64Username, sizeof(g_Win64Username)); + } + else if (_wcsicmp(argv[i], L"-ip") == 0 && (i + 1) < argc) + { + char ipBuf[256]; + CopyWideArgToAnsi(argv[++i], ipBuf, sizeof(ipBuf)); + if (options.serverMode) + { + strncpy_s(g_Win64DedicatedServerBindIP, sizeof(g_Win64DedicatedServerBindIP), ipBuf, _TRUNCATE); + } + else + { + strncpy_s(g_Win64MultiplayerIP, sizeof(g_Win64MultiplayerIP), ipBuf, _TRUNCATE); + g_Win64MultiplayerJoin = true; + } + } + else if (_wcsicmp(argv[i], L"-port") == 0 && (i + 1) < argc) + { + wchar_t* endPtr = NULL; + long port = wcstol(argv[++i], &endPtr, 10); + if (endPtr != argv[i] && *endPtr == 0 && port > 0 && port <= 65535) + { + if (options.serverMode) + g_Win64DedicatedServerPort = (int)port; + else + g_Win64MultiplayerPort = (int)port; + } + } + } + + LocalFree(argv); + return options; +} + +static BOOL WINAPI HeadlessServerCtrlHandler(DWORD ctrlType) +{ + switch (ctrlType) + { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + case CTRL_CLOSE_EVENT: + case CTRL_SHUTDOWN_EVENT: + app.m_bShutdown = true; + MinecraftServer::HaltServer(); + return TRUE; + default: + return FALSE; + } +} + +static void SetupHeadlessServerConsole() +{ + if (AllocConsole()) + { + FILE* stream = NULL; + freopen_s(&stream, "CONIN$", "r", stdin); + freopen_s(&stream, "CONOUT$", "w", stdout); + freopen_s(&stream, "CONOUT$", "w", stderr); + SetConsoleTitleA("Minecraft Server"); + } + + SetConsoleCtrlHandler(HeadlessServerCtrlHandler, TRUE); +} + void DefineActions(void) { // The app needs to define the actions required, and the possible mappings for these @@ -402,6 +555,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (LOWORD(wParam) == WA_INACTIVE) KMInput.SetCapture(false); break; + case WM_SETFOCUS: + { + // Re-capture when window receives focus (e.g., after clicking on it) + Minecraft *pMinecraft = Minecraft::GetInstance(); + bool shouldCapture = pMinecraft && app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL; + if (shouldCapture) + KMInput.SetCapture(true); + } + break; case WM_KILLFOCUS: KMInput.SetCapture(false); KMInput.ClearAllState(); @@ -415,7 +577,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; } return DefWindowProc(hWnd, message, wParam, lParam); - default: return DefWindowProc(hWnd, message, wParam, lParam); } @@ -443,7 +604,7 @@ ATOM MyRegisterClass(HINSTANCE hInstance) wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = "Minecraft"; wcex.lpszClassName = "MinecraftClass"; - wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_MINECRAFTWINDOWS)); return RegisterClassEx(&wcex); } @@ -706,7 +867,224 @@ void CleanupDevice() if( g_pd3dDevice ) g_pd3dDevice->Release(); } +static Minecraft* InitialiseMinecraftRuntime() +{ + app.loadMediaArchive(); + RenderManager.Initialise(g_pd3dDevice, g_pSwapChain); + + app.loadStringTable(); + ui.init(g_pd3dDevice, g_pImmediateContext, g_pRenderTargetView, g_pDepthStencilView, g_iScreenWidth, g_iScreenHeight); + + InputManager.Initialise(1, 3, MINECRAFT_ACTION_MAX, ACTION_MAX_MENU); + KMInput.Init(g_hWnd); + DefineActions(); + InputManager.SetJoypadMapVal(0, 0); + InputManager.SetKeyRepeatRate(0.3f, 0.2f); + + ProfileManager.Initialise(TITLEID_MINECRAFT, + app.m_dwOfferID, + PROFILE_VERSION_10, + NUM_PROFILE_VALUES, + NUM_PROFILE_SETTINGS, + dwProfileSettingsA, + app.GAME_DEFINED_PROFILE_DATA_BYTES * XUSER_MAX_COUNT, + &app.uiGameDefinedDataChangedBitmask + ); + ProfileManager.SetDefaultOptionsCallback(&CConsoleMinecraftApp::DefaultOptionsCallback, (LPVOID)&app); + + g_NetworkManager.Initialise(); + + for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++) + { + IQNet::m_player[i].m_smallId = (BYTE)i; + IQNet::m_player[i].m_isRemote = false; + IQNet::m_player[i].m_isHostPlayer = (i == 0); + swprintf_s(IQNet::m_player[i].m_gamertag, 32, L"Player%d", i); + } + wcscpy_s(IQNet::m_player[0].m_gamertag, 32, g_Win64UsernameW); + + WinsockNetLayer::Initialize(); + + ProfileManager.SetDebugFullOverride(true); + + Tesselator::CreateNewThreadStorage(1024 * 1024); + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Compression::CreateNewThreadStorage(); + OldChunkStorage::CreateNewThreadStorage(); + Level::enableLightingCache(); + Tile::CreateNewThreadStorage(); + + Minecraft::main(); + Minecraft* pMinecraft = Minecraft::GetInstance(); + if (pMinecraft == NULL) + return NULL; + + app.InitGameSettings(); + app.InitialiseTips(); + + pMinecraft->options->set(Options::Option::MUSIC, 1.0f); + pMinecraft->options->set(Options::Option::SOUND, 1.0f); + + return pMinecraft; +} + +static int HeadlessServerConsoleThreadProc(void* lpParameter) +{ + UNREFERENCED_PARAMETER(lpParameter); + + std::string line; + while (!app.m_bShutdown) + { + if (!std::getline(std::cin, line)) + { + if (std::cin.eof()) + { + break; + } + + std::cin.clear(); + Sleep(50); + continue; + } + + wstring command = trimString(convStringToWstring(line)); + if (command.empty()) + continue; + + MinecraftServer* server = MinecraftServer::getInstance(); + if (server != NULL) + { + server->handleConsoleInput(command, server); + } + } + + return 0; +} + +static int RunHeadlessServer() +{ + SetupHeadlessServerConsole(); + + Settings serverSettings(new File(L"server.properties")); + wstring configuredBindIp = serverSettings.getString(L"server-ip", L""); + + const char* bindIp = "*"; + if (g_Win64DedicatedServerBindIP[0] != 0) + { + bindIp = g_Win64DedicatedServerBindIP; + } + else if (!configuredBindIp.empty()) + { + bindIp = wstringtochararray(configuredBindIp); + } + + const int port = g_Win64DedicatedServerPort > 0 ? g_Win64DedicatedServerPort : serverSettings.getInt(L"server-port", WIN64_NET_DEFAULT_PORT); + + printf("Starting headless server on %s:%d\n", bindIp, port); + fflush(stdout); + + Minecraft* pMinecraft = InitialiseMinecraftRuntime(); + if (pMinecraft == NULL) + { + fprintf(stderr, "Failed to initialise the Minecraft runtime.\n"); + return 1; + } + + app.SetGameHostOption(eGameHostOption_Difficulty, serverSettings.getInt(L"difficulty", 1)); + app.SetGameHostOption(eGameHostOption_Gamertags, 1); + app.SetGameHostOption(eGameHostOption_GameType, serverSettings.getInt(L"gamemode", 0)); + app.SetGameHostOption(eGameHostOption_LevelType, 0); + app.SetGameHostOption(eGameHostOption_Structures, serverSettings.getBoolean(L"generate-structures", true) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_BonusChest, serverSettings.getBoolean(L"bonus-chest", false) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_PvP, serverSettings.getBoolean(L"pvp", true) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_TrustPlayers, serverSettings.getBoolean(L"trust-players", true) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_FireSpreads, serverSettings.getBoolean(L"fire-spreads", true) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_TNT, serverSettings.getBoolean(L"tnt", true) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_HostCanFly, 1); + 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); + + MinecraftServer::resetFlags(); + g_NetworkManager.HostGame(0, false, true, MINECRAFT_NET_MAX_PLAYERS, 0); + + if (!WinsockNetLayer::IsActive()) + { + fprintf(stderr, "Failed to bind the server socket on %s:%d.\n", bindIp, port); + return 1; + } + + g_NetworkManager.FakeLocalPlayerJoined(); + + NetworkGameInitData* param = new NetworkGameInitData(); + param->seed = 0; + param->settings = app.GetGameHostOption(eGameHostOption_All); + + g_NetworkManager.ServerStoppedCreate(true); + g_NetworkManager.ServerReadyCreate(true); + + C4JThread* thread = new C4JThread(&CGameNetworkManager::ServerThreadProc, param, "Server", 256 * 1024); + thread->SetProcessor(CPU_CORE_SERVER); + thread->Run(); + + g_NetworkManager.ServerReadyWait(); + g_NetworkManager.ServerReadyDestroy(); + + if (MinecraftServer::serverHalted()) + { + fprintf(stderr, "The server halted during startup.\n"); + g_NetworkManager.LeaveGame(false); + return 1; + } + + app.SetGameStarted(true); + g_NetworkManager.DoWork(); + + printf("Server ready on %s:%d\n", bindIp, port); + printf("Type 'help' for server commands.\n"); + fflush(stdout); + + C4JThread* consoleThread = new C4JThread(&HeadlessServerConsoleThreadProc, NULL, "Server console", 128 * 1024); + consoleThread->Run(); + + MSG msg = { 0 }; + while (WM_QUIT != msg.message && !app.m_bShutdown && !MinecraftServer::serverHalted()) + { + if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + continue; + } + + app.UpdateTime(); + ProfileManager.Tick(); + StorageManager.Tick(); + RenderManager.Tick(); + ui.tick(); + g_NetworkManager.DoWork(); + app.HandleXuiActions(); + + Sleep(10); + } + + printf("Stopping server...\n"); + fflush(stdout); + + app.m_bShutdown = true; + MinecraftServer::HaltServer(); + g_NetworkManager.LeaveGame(false); + return 0; +} int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, @@ -716,47 +1094,36 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); + // 4J-Win64: set CWD to exe dir so asset paths resolve correctly + { + char szExeDir[MAX_PATH] = {}; + GetModuleFileNameA(NULL, szExeDir, MAX_PATH); + char *pSlash = strrchr(szExeDir, '\\'); + if (pSlash) { *(pSlash + 1) = '\0'; SetCurrentDirectoryA(szExeDir); } + } + // Declare DPI awareness so GetSystemMetrics returns physical pixels SetProcessDPIAware(); g_iScreenWidth = GetSystemMetrics(SM_CXSCREEN); g_iScreenHeight = GetSystemMetrics(SM_CYSCREEN); + Win64LaunchOptions launchOptions = ParseLaunchOptions(); + ApplyScreenMode(launchOptions.screenMode); + if (g_Win64Username[0] == 0) { - char buf[128]; - sprintf(buf, "Screen resolution: %dx%d\n", g_iScreenWidth, g_iScreenHeight); - OutputDebugStringA(buf); - } - - if(lpCmdLine) - { - if(lpCmdLine[0] == '1') - { - g_iScreenWidth = 1280; - g_iScreenHeight = 720; - } - else if(lpCmdLine[0] == '2') - { - g_iScreenWidth = 640; - g_iScreenHeight = 480; - } - else if(lpCmdLine[0] == '3') - { - // Vita - g_iScreenWidth = 720; - g_iScreenHeight = 408; - - // Vita native - //g_iScreenWidth = 960; - //g_iScreenHeight = 544; - } + DWORD sz = 17; + if (!GetUserNameA(g_Win64Username, &sz)) + strncpy_s(g_Win64Username, 17, "Player", _TRUNCATE); + g_Win64Username[16] = 0; } + MultiByteToWideChar(CP_ACP, 0, g_Win64Username, -1, g_Win64UsernameW, 17); // Initialize global strings MyRegisterClass(hInstance); // Perform application initialization: - if (!InitInstance (hInstance, nCmdShow)) + if (!InitInstance (hInstance, launchOptions.serverMode ? SW_HIDE : nCmdShow)) { return FALSE; } @@ -769,6 +1136,13 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, return 0; } + if (launchOptions.serverMode) + { + int serverResult = RunHeadlessServer(); + CleanupDevice(); + return serverResult; + } + #if 0 // Main message loop MSG msg = {0}; @@ -821,193 +1195,13 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } #endif - app.loadMediaArchive(); - - RenderManager.Initialise(g_pd3dDevice, g_pSwapChain); - - app.loadStringTable(); - ui.init(g_pd3dDevice,g_pImmediateContext,g_pRenderTargetView,g_pDepthStencilView,g_iScreenWidth,g_iScreenHeight); - - //////////////// - // Initialise // - //////////////// - - // Set the number of possible joypad layouts that the user can switch between, and the number of actions - InputManager.Initialise(1,3,MINECRAFT_ACTION_MAX, ACTION_MAX_MENU); - - // Initialize keyboard/mouse input - KMInput.Init(g_hWnd); - - // Set the default joypad action mappings for Minecraft - DefineActions(); - InputManager.SetJoypadMapVal(0,0); - InputManager.SetKeyRepeatRate(0.3f,0.2f); - - // Initialise the profile manager with the game Title ID, Offer ID, a profile version number, and the number of profile values and settings - ProfileManager.Initialise(TITLEID_MINECRAFT, - app.m_dwOfferID, - PROFILE_VERSION_10, - NUM_PROFILE_VALUES, - NUM_PROFILE_SETTINGS, - dwProfileSettingsA, - app.GAME_DEFINED_PROFILE_DATA_BYTES*XUSER_MAX_COUNT, - &app.uiGameDefinedDataChangedBitmask - ); -#if 0 - // register the awards - ProfileManager.RegisterAward(eAward_TakingInventory, ACHIEVEMENT_01, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_GettingWood, ACHIEVEMENT_02, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_Benchmarking, ACHIEVEMENT_03, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_TimeToMine, ACHIEVEMENT_04, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_HotTopic, ACHIEVEMENT_05, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_AquireHardware, ACHIEVEMENT_06, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_TimeToFarm, ACHIEVEMENT_07, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_BakeBread, ACHIEVEMENT_08, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_TheLie, ACHIEVEMENT_09, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_GettingAnUpgrade, ACHIEVEMENT_10, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_DeliciousFish, ACHIEVEMENT_11, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_OnARail, ACHIEVEMENT_12, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_TimeToStrike, ACHIEVEMENT_13, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_MonsterHunter, ACHIEVEMENT_14, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_CowTipper, ACHIEVEMENT_15, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_WhenPigsFly, ACHIEVEMENT_16, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_LeaderOfThePack, ACHIEVEMENT_17, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_MOARTools, ACHIEVEMENT_18, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_DispenseWithThis, ACHIEVEMENT_19, eAwardType_Achievement); - ProfileManager.RegisterAward(eAward_InToTheNether, ACHIEVEMENT_20, eAwardType_Achievement); - - ProfileManager.RegisterAward(eAward_mine100Blocks, GAMER_PICTURE_GAMERPIC1, eAwardType_GamerPic,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_GAMERPIC1,IDS_CONFIRM_OK); - ProfileManager.RegisterAward(eAward_kill10Creepers, GAMER_PICTURE_GAMERPIC2, eAwardType_GamerPic,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_GAMERPIC2,IDS_CONFIRM_OK); - - ProfileManager.RegisterAward(eAward_eatPorkChop, AVATARASSETAWARD_PORKCHOP_TSHIRT, eAwardType_AvatarItem,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_AVATAR1,IDS_CONFIRM_OK); - ProfileManager.RegisterAward(eAward_play100Days, AVATARASSETAWARD_WATCH, eAwardType_AvatarItem,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_AVATAR2,IDS_CONFIRM_OK); - ProfileManager.RegisterAward(eAward_arrowKillCreeper, AVATARASSETAWARD_CAP, eAwardType_AvatarItem,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_AVATAR3,IDS_CONFIRM_OK); - - ProfileManager.RegisterAward(eAward_socialPost, 0, eAwardType_Theme,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_THEME,IDS_CONFIRM_OK,THEME_NAME,THEME_FILESIZE); - - // Rich Presence init - number of presences, number of contexts - ProfileManager.RichPresenceInit(4,1); - ProfileManager.RegisterRichPresenceContext(CONTEXT_GAME_STATE); - - // initialise the storage manager with a default save display name, a Minimum save size, and a callback for displaying the saving message - StorageManager.Init(app.GetString(IDS_DEFAULT_SAVENAME),"savegame.dat",FIFTY_ONE_MB,&CConsoleMinecraftApp::DisplaySavingMessage,(LPVOID)&app); - // Set up the global title storage path - StorageManager.StoreTMSPathName(); - - // set a function to be called when there's a sign in change, so we can exit a level if the primary player signs out - ProfileManager.SetSignInChangeCallback(&CConsoleMinecraftApp::SignInChangeCallback,(LPVOID)&app); - - // set a function to be called when the ethernet is disconnected, so we can back out if required - ProfileManager.SetNotificationsCallback(&CConsoleMinecraftApp::NotificationsCallback,(LPVOID)&app); - -#endif - // Set a callback for the default player options to be set - when there is no profile data for the player - ProfileManager.SetDefaultOptionsCallback(&CConsoleMinecraftApp::DefaultOptionsCallback,(LPVOID)&app); -#if 0 - // Set a callback to deal with old profile versions needing updated to new versions - ProfileManager.SetOldProfileVersionCallback(&CConsoleMinecraftApp::OldProfileVersionCallback,(LPVOID)&app); - - // Set a callback for when there is a read error on profile data - ProfileManager.SetProfileReadErrorCallback(&CConsoleMinecraftApp::ProfileReadErrorCallback,(LPVOID)&app); - -#endif - // QNet needs to be setup after profile manager, as we do not want its Notify listener to handle - // XN_SYS_SIGNINCHANGED notifications. This does mean that we need to have a callback in the - // ProfileManager for XN_LIVE_INVITE_ACCEPTED for QNet. - g_NetworkManager.Initialise(); - - - - // 4J-PB moved further down - //app.InitGameSettings(); - - // debug switch to trial version - ProfileManager.SetDebugFullOverride(true); - -#if 0 - //ProfileManager.AddDLC(2); - StorageManager.SetDLCPackageRoot("DLCDrive"); - StorageManager.RegisterMarketplaceCountsCallback(&CConsoleMinecraftApp::MarketplaceCountsCallback,(LPVOID)&app); - // Kinect ! - - if(XNuiGetHardwareStatus()!=0) + Minecraft *pMinecraft = InitialiseMinecraftRuntime(); + if (pMinecraft == NULL) { - // If the Kinect Sensor is not physically connected, this function returns 0. - NuiInitialize(NUI_INITIALIZE_FLAG_USES_HIGH_QUALITY_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH | - NUI_INITIALIZE_FLAG_EXTRAPOLATE_FLOOR_PLANE | NUI_INITIALIZE_FLAG_USES_FITNESS | NUI_INITIALIZE_FLAG_NUI_GUIDE_DISABLED | NUI_INITIALIZE_FLAG_SUPPRESS_AUTOMATIC_UI,NUI_INITIALIZE_DEFAULT_HARDWARE_THREAD ); + CleanupDevice(); + return 1; } - // Sentient ! - hr = TelemetryManager->Init(); - -#endif - // Initialise TLS for tesselator, for this main thread - Tesselator::CreateNewThreadStorage(1024*1024); - // Initialise TLS for AABB and Vec3 pools, for this main thread - AABB::CreateNewThreadStorage(); - Vec3::CreateNewThreadStorage(); - IntCache::CreateNewThreadStorage(); - Compression::CreateNewThreadStorage(); - OldChunkStorage::CreateNewThreadStorage(); - Level::enableLightingCache(); - Tile::CreateNewThreadStorage(); - - Minecraft::main(); - Minecraft *pMinecraft=Minecraft::GetInstance(); - - app.InitGameSettings(); - -#if 0 - //bool bDisplayPauseMenu=false; - - // set the default gamma level - float fVal=50.0f*327.68f; - RenderManager.UpdateGamma((unsigned short)fVal); - - // load any skins - //app.AddSkinsToMemoryTextureFiles(); - - // set the achievement text for a trial achievement, now we have the string table loaded - ProfileManager.SetTrialTextStringTable(app.GetStringTable(),IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL); - ProfileManager.SetTrialAwardText(eAwardType_Achievement,IDS_UNLOCK_TITLE,IDS_UNLOCK_ACHIEVEMENT_TEXT); - ProfileManager.SetTrialAwardText(eAwardType_GamerPic,IDS_UNLOCK_TITLE,IDS_UNLOCK_GAMERPIC_TEXT); - ProfileManager.SetTrialAwardText(eAwardType_AvatarItem,IDS_UNLOCK_TITLE,IDS_UNLOCK_AVATAR_TEXT); - ProfileManager.SetTrialAwardText(eAwardType_Theme,IDS_UNLOCK_TITLE,IDS_UNLOCK_THEME_TEXT); - ProfileManager.SetUpsellCallback(&app.UpsellReturnedCallback,&app); - - // Set up a debug character press sequence -#ifndef _FINAL_BUILD - app.SetDebugSequence("LRLRYYY"); -#endif - - // Initialise the social networking manager. - CSocialManager::Instance()->Initialise(); - - // Update the base scene quick selects now that the minecraft class exists - //CXuiSceneBase::UpdateScreenSettings(0); -#endif - app.InitialiseTips(); -#if 0 - - DWORD initData=0; - -#ifndef _FINAL_BUILD -#ifndef _DEBUG -#pragma message(__LOC__"Need to define the _FINAL_BUILD before submission") -#endif -#endif - - // Set the default sound levels - pMinecraft->options->set(Options::Option::MUSIC,1.0f); - pMinecraft->options->set(Options::Option::SOUND,1.0f); - - app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_Intro,&initData); -#endif - - // Set the default sound levels - pMinecraft->options->set(Options::Option::MUSIC,1.0f); - pMinecraft->options->set(Options::Option::SOUND,1.0f); - //app.TemporaryCreateGameStart(); //Sleep(10000); @@ -1088,7 +1282,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Network manager do work #1"); - // g_NetworkManager.DoWork(); + g_NetworkManager.DoWork(); PIXEndNamedEvent(); // LeaderboardManager::Instance()->Tick(); @@ -1214,12 +1408,68 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } } - // F11 toggles fullscreen + // F1 toggles the HUD + if (KMInput.IsKeyPressed(VK_F1)) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + unsigned char displayHud = app.GetGameSettings(primaryPad, eGameSetting_DisplayHUD); + app.SetGameSettings(primaryPad, eGameSetting_DisplayHUD, displayHud ? 0 : 1); + app.SetGameSettings(primaryPad, eGameSetting_DisplayHand, displayHud ? 0 : 1); + } + + // F3 toggles onscreen debug info + if (KMInput.IsKeyPressed(VK_F3)) + { + if (Minecraft* pMinecraft = Minecraft::GetInstance()) + { + if (pMinecraft->options) + { + pMinecraft->options->renderDebug = !pMinecraft->options->renderDebug; + } + } + } + +#ifdef _DEBUG_MENUS_ENABLED + // F4 Open debug overlay + if (KMInput.IsKeyPressed(VK_F4)) + { + if (Minecraft *pMinecraft = Minecraft::GetInstance()) + { + if (pMinecraft->options && + app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL) + { + ui.NavigateToScene(0, eUIScene_DebugOverlay, NULL, eUILayer_Debug); + } + } + } + + // F6 Open debug console + if (KMInput.IsKeyPressed(VK_F6)) + { + static bool s_debugConsole = false; + s_debugConsole = !s_debugConsole; + ui.ShowUIDebugConsole(s_debugConsole); + } +#endif + + // F11 Toggle fullscreen if (KMInput.IsKeyPressed(VK_F11)) { ToggleFullscreen(); } + // TAB opens game info menu. - Vvis :3 - Updated by detectiveren + if (KMInput.IsKeyPressed(VK_TAB) && !ui.GetMenuDisplayed(0)) + { + if (Minecraft* pMinecraft = Minecraft::GetInstance()) + { + { + ui.NavigateToScene(0, eUIScene_InGameInfoMenu); + + } + } + } + #if 0 // has the game defined profile data been changed (by a profile load) if(app.uiGameDefinedDataChangedBitmask!=0) @@ -1506,4 +1756,4 @@ void MemPixStuff() PIXAddNamedCounter(((float)allSectsTotal)/(4096.0f),"MemSect total pages"); } -#endif \ No newline at end of file +#endif 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/Media/Tutorial.pck b/Minecraft.Client/Windows64Media/Tutorial/Tutorial.pck similarity index 100% rename from Minecraft.Client/Windows64Media/Media/Tutorial.pck rename to Minecraft.Client/Windows64Media/Tutorial/Tutorial.pck 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. - + + A compact way of storing Gold. + - + + A compact way of storing Iron. + + + Block of Iron - + - - A compact way of storing 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,6 +3649,374 @@ Can also be used for low-level lighting. Skull + + Command Block + + + + Beacon + + + + Trapped Chest + + + + Weighted Pressure Plate (Light) + + + + Weighted Pressure Plate (Heavy) + + + + Redstone Comparator + + + + Daylight Sensor + + + + Block of Redstone + + + + 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 @@ -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. @@ -4438,17 +4877,13 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -4472,9 +4907,7 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -4482,17 +4915,13 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -4568,9 +4997,7 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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! @@ -4591,7 +5018,7 @@ At night monsters come out, make sure to build a shelter before that happens. {*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. @@ -4603,17 +5030,233 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. @@ -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/Docs/Ratings_Submission_Form.doc b/Minecraft.Client/Xbox/Docs/Ratings_Submission_Form.doc index 91d965bd..2b87aa85 100644 Binary files a/Minecraft.Client/Xbox/Docs/Ratings_Submission_Form.doc and b/Minecraft.Client/Xbox/Docs/Ratings_Submission_Form.doc differ diff --git a/Minecraft.Client/Xbox/MinecraftWindows.ico b/Minecraft.Client/Xbox/MinecraftWindows.ico index 449296f4..f171b2a6 100644 Binary files a/Minecraft.Client/Xbox/MinecraftWindows.ico and b/Minecraft.Client/Xbox/MinecraftWindows.ico differ 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/Xbox/Xbox_App.cpp b/Minecraft.Client/Xbox/Xbox_App.cpp index b252035e..a342d8c2 100644 --- a/Minecraft.Client/Xbox/Xbox_App.cpp +++ b/Minecraft.Client/Xbox/Xbox_App.cpp @@ -1658,7 +1658,8 @@ HRESULT CConsoleMinecraftApp::NavigateToScene(int iPad,EUIScene eScene, void *in // 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((eScene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0)) + // todo: re-enable if we fix this menu, for now its just blank! + if(false && (eScene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0)) { eScene=eUIScene_NewUpdateMessage; bSeenUpdateTextThisSession=true; 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/glWrapper.cpp b/Minecraft.Client/glWrapper.cpp index b120d30b..540271b9 100644 --- a/Minecraft.Client/glWrapper.cpp +++ b/Minecraft.Client/glWrapper.cpp @@ -48,9 +48,13 @@ void glLoadIdentity() RenderManager.MatrixSetIdentity(); } +extern int g_iScreenWidth; +extern int g_iScreenHeight; + void gluPerspective(float fovy, float aspect, float zNear, float zFar) { - RenderManager.MatrixPerspective(fovy,aspect,zNear,zFar); + float dynamicAspect = (float)g_iScreenWidth / (float)g_iScreenHeight; + RenderManager.MatrixPerspective(fovy, dynamicAspect, zNear, zFar); } void glOrtho(float left,float right,float bottom,float top,float zNear,float zFar) 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/postbuild.ps1 b/Minecraft.Client/postbuild.ps1 new file mode 100644 index 00000000..1c965758 --- /dev/null +++ b/Minecraft.Client/postbuild.ps1 @@ -0,0 +1,42 @@ +param( + [string]$OutDir, + [string]$ProjectDir +) + +Write-Host "Post-build script started. Output Directory: $OutDir, Project Directory: $ProjectDir" + +$directories = @( + "music", + "Windows64\GameHDD", + "Common\Media", + "Common\res", + "Common\Trial", + "Common\Tutorial", + "Windows64Media" +) + +foreach ($dir in $directories) { + New-Item -ItemType Directory -Path (Join-Path $OutDir $dir) -Force | Out-Null +} + +$copies = @( + @{ Source = "music"; Dest = "music" }, + @{ Source = "Common\Media"; Dest = "Common\Media" }, + @{ Source = "Common\res"; Dest = "Common\res" }, + @{ Source = "Common\Trial"; Dest = "Common\Trial" }, + @{ Source = "Common\Tutorial"; Dest = "Common\Tutorial" }, + @{ Source = "Windows64\GameHDD"; Dest = "Windows64\GameHDD" }, + @{ Source = "Windows64\Sound"; Dest = "Windows64\Sound" }, + @{ Source = "DurangoMedia"; Dest = "Windows64Media" }, + @{ Source = "Windows64Media"; Dest = "Windows64Media" } +) + +foreach ($copy in $copies) { + $src = Join-Path $ProjectDir $copy.Source + $dst = Join-Path $OutDir $copy.Dest + + if (Test-Path $src) { + # Copy the files using xcopy, forcing overwrite and suppressing errors, and only copying if the source is newer than the destination + xcopy /q /y /i /s /e /d "$src" "$dst" 2>$null + } +} 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/ARM64EC_Debug/Minecraft.World.vcxproj.FileListAbsolute.txt b/Minecraft.World/ARM64EC_Debug/Minecraft.World.vcxproj.FileListAbsolute.txt new file mode 100644 index 00000000..ee3f8228 --- /dev/null +++ b/Minecraft.World/ARM64EC_Debug/Minecraft.World.vcxproj.FileListAbsolute.txt @@ -0,0 +1 @@ +C:\Users\manea\Documents\MinecraftConsoles\Minecraft.World\ARM64EC_Debug\Minecraft.World.lib 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) { - if (slotIndex == CLICKED_OUTSIDE) + 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 == 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) + int error; + shared_ptr result = SpawnEggItem::canSpawn(item->getAuxValue(), level, &error); + + if (result != NULL) { - offspring->setAge(-20 * 60 * 20); - offspring->moveTo(x, y, z, 0, 0); - - level->addEntity(offspring); - - if (!player->abilities.instabuild) + 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); + virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual void clearColor(shared_ptr item); + virtual void setColor(shared_ptr item, int color); - //@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); - - //@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..7707635a 100644 --- a/Minecraft.World/ArmorSlot.cpp +++ b/Minecraft.World/ArmorSlot.cpp @@ -12,13 +12,17 @@ ArmorSlot::ArmorSlot(int slotNum, shared_ptr container, int id, int x { } -int ArmorSlot::getMaxStackSize() +int ArmorSlot::getMaxStackSize() const { return 1; } 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/ArmorSlot.h b/Minecraft.World/ArmorSlot.h index a9797be2..d9d769ce 100644 --- a/Minecraft.World/ArmorSlot.h +++ b/Minecraft.World/ArmorSlot.h @@ -16,7 +16,7 @@ public: ArmorSlot(int slotNum, shared_ptr container, int id, int x, int y); virtual ~ArmorSlot() {} - virtual int getMaxStackSize(); + virtual int getMaxStackSize() const; virtual bool mayPlace(shared_ptr item); Icon *getNoItemIcon(); //virtual bool mayCombine(shared_ptr item); // 4J Added 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..62908b4f --- /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() const +{ + 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..9394d83f --- /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() const; + }; + +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..9cfb0d67 --- /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() const +{ + 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..caab25e7 --- /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() const; + 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; - } + 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 (BedTile::isOccupied(data)) + 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); - } - } - } - } + if (skipCount > 0) { + skipCount--; + continue; + } + return new Pos(standX, y, standZ); + } + } + } + } - return NULL; + 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..eaf78329 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)) @@ -140,7 +140,7 @@ shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr pla { return nullptr; } - } + } else if (!moveItemStackTo(stack, INV_SLOT_START, INV_SLOT_END, false)) { return nullptr; @@ -183,16 +183,14 @@ bool BrewingStandMenu::PotionSlot::mayPlace(shared_ptr item) return mayPlaceItem(item); } -int BrewingStandMenu::PotionSlot::getMaxStackSize() +int BrewingStandMenu::PotionSlot::getMaxStackSize() const { return 1; } 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; @@ -233,7 +231,7 @@ bool BrewingStandMenu::IngredientsSlot::mayCombine(shared_ptr seco return false; } -int BrewingStandMenu::IngredientsSlot::getMaxStackSize() +int BrewingStandMenu::IngredientsSlot::getMaxStackSize() const { return 64; } diff --git a/Minecraft.World/BrewingStandMenu.h b/Minecraft.World/BrewingStandMenu.h index 1f8d705d..fded12d2 100644 --- a/Minecraft.World/BrewingStandMenu.h +++ b/Minecraft.World/BrewingStandMenu.h @@ -47,7 +47,7 @@ private: PotionSlot(shared_ptr player, shared_ptr container, int slot, int x, int y); virtual bool mayPlace(shared_ptr item); - virtual int getMaxStackSize(); + virtual int getMaxStackSize() const; virtual void onTake(shared_ptr player, shared_ptr carried); static bool mayPlaceItem(shared_ptr item); virtual bool mayCombine(shared_ptr item); // 4J Added @@ -59,7 +59,7 @@ private: IngredientsSlot(shared_ptr container, int slot, int x, int y); virtual bool mayPlace(shared_ptr item); - virtual int getMaxStackSize(); + virtual int getMaxStackSize() const; virtual bool mayCombine(shared_ptr item); // 4J Added }; }; \ No newline at end of file diff --git a/Minecraft.World/BrewingStandTile.cpp b/Minecraft.World/BrewingStandTile.cpp index 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; + 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()) + 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..5bc6fd27 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) @@ -333,7 +356,7 @@ shared_ptr BrewingStandTileEntity::removeItem(unsigned int slot, i if (slot >= 0 && slot < items.length && items[slot] != NULL) { - if (items[slot]->count <= count) + if (items[slot]->count <= count) { shared_ptr item = items[slot]; items[slot] = nullptr; @@ -341,8 +364,8 @@ shared_ptr BrewingStandTileEntity::removeItem(unsigned int slot, i // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; - } - else + } + else { shared_ptr i = items[slot]->remove(count); if (items[slot]->count == 0) items[slot] = nullptr; @@ -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() +int BrewingStandTileEntity::getMaxStackSize() const { - 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..c848767e 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() const; + 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->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); + level->setData(x, y, z, dir + open, Tile::UPDATE_ALL); + level->setTilesDirty(x, y, z, x, y, z); - updateNeighbours(level, x, y, z, dir); + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); - level->addToTickNextTick(x, y, z, id, getTickDelay()); + updateNeighbours(level, x, y, z, dir); - return true; + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + + 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; + yy = y0; + } + } + } + } + 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++) + 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); + 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(); + 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); + 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); + 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); + 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; + 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; - } + 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; - } + 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); + 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,46 +266,39 @@ 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); - shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); - if (container == NULL) return true; - - if (level->isSolidBlockingTile(x, y + 1, z)) return true; - if (isCatSittingOnChest(level,x, y, z)) return true; - - if (level->getTile(x - 1, y, z) == id && (level->isSolidBlockingTile(x - 1, y + 1, z) || isCatSittingOnChest(level, x - 1, y, z))) return true; - if (level->getTile(x + 1, y, z) == id && (level->isSolidBlockingTile(x + 1, y + 1, z) || isCatSittingOnChest(level, x + 1, y, z))) return true; - if (level->getTile(x, y, z - 1) == id && (level->isSolidBlockingTile(x, y + 1, z - 1) || isCatSittingOnChest(level, x, y, z - 1))) return true; - if (level->getTile(x, y, z + 1) == id && (level->isSolidBlockingTile(x, y + 1, z + 1) || isCatSittingOnChest(level, x, y, z + 1))) return true; - - if (level->getTile(x - 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x - 1, y, z) ), container) ); - if (level->getTile(x + 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x + 1, y, z) )) ); - if (level->getTile(x, y, z - 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x, y, z - 1) ), container) ); - if (level->getTile(x, y, z + 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x, y, z + 1) )) ); - - player->openContainer(container); - - return true; -} - -// 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)); - for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) + if (container != NULL) { - shared_ptr ocelot = dynamic_pointer_cast(*it); - if(ocelot->isSitting()) - { - return true; - } + player->openContainer(container); } - return false; + 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) )) ); + + return container; } shared_ptr ChestTile::newTileEntity(Level *level) @@ -308,9 +309,60 @@ shared_ptr ChestTile::newTileEntity(Level *level) return retval; } +bool ChestTile::isSignalSource() +{ + return type == TYPE_TRAP; +} + +int ChestTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +{ + if (!isSignalSource()) return Redstone::SIGNAL_NONE; + + int openCount = dynamic_pointer_cast( level->getTileEntity(x, y, z))->openCount; + return Mth::clamp(openCount, Redstone::SIGNAL_NONE, Redstone::SIGNAL_MAX); +} + +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; + } +} + +bool ChestTile::isCatSittingOnChest(Level *level, int x, int y, int z) +{ + 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); + if(ocelot->isSitting()) + { + delete entities; + return true; + } + } + delete entities; + return false; +} + +bool ChestTile::hasAnalogOutputSignal() +{ + 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..fded7d28 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() @@ -32,7 +53,7 @@ ChestTileEntity::~ChestTileEntity() delete items; } -unsigned int ChestTileEntity::getContainerSize() +unsigned int ChestTileEntity::getContainerSize() { return 9 * 3; } @@ -42,24 +63,24 @@ shared_ptr ChestTileEntity::getItem(unsigned int slot) return items->data[slot]; } -shared_ptr ChestTileEntity::removeItem(unsigned int slot, int count) +shared_ptr ChestTileEntity::removeItem(unsigned int slot, int count) { if (items->data[slot] != NULL) { - if (items->data[slot]->count <= count) + if (items->data[slot]->count <= count) { 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; - } - else + } + else { 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 IDS_TILE_CHEST; + return hasCustomName() ? name : app.GetString(IDS_TILE_CHEST); } +wstring ChestTileEntity::getCustomName() +{ + 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); @@ -118,7 +154,7 @@ void ChestTileEntity::save(CompoundTag *base) for (unsigned int i = 0; i < items->length; i++) { - if (items->data[i] != NULL) + if (items->data[i] != NULL) { CompoundTag *tag = new CompoundTag(); tag->putByte(L"Slot", (byte) i); @@ -127,10 +163,11 @@ void ChestTileEntity::save(CompoundTag *base) } } base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); base->putBoolean(L"bonus", isBonusChest); } -int ChestTileEntity::getMaxStackSize() +int ChestTileEntity::getMaxStackSize() const { return Container::LARGE_MAX_STACK_SIZE; } @@ -142,134 +179,224 @@ bool ChestTileEntity::stillValid(shared_ptr player) return true; } -void ChestTileEntity::setChanged() +void ChestTileEntity::setChanged() { TileEntity::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) - { - if (n.lock() == NULL && w.lock() == NULL) + 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) { - double xc = x + 0.5; - double zc = z + 0.5; - if (s.lock() != NULL) zc += 0.5; - if (e.lock() != NULL) xc += 0.5; + shared_ptr player = dynamic_pointer_cast(*it); - // 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)) + 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) + { + 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)) { 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); - } + // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit + level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); + } } - if (openness < 0) + 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..d655340f 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 int getMaxStackSize() const; 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/ChunkPos.h b/Minecraft.World/ChunkPos.h index f1d483c7..2a3fda02 100644 --- a/Minecraft.World/ChunkPos.h +++ b/Minecraft.World/ChunkPos.h @@ -28,13 +28,14 @@ public: ChunkPos & operator= (const ChunkPos & other) { x = other.x; z = other.z; return *this; } }; -typedef struct +struct ChunkPosKeyHash { - __int64 operator() (const ChunkPos &k) const { return ChunkPos::hash_fnct(k); } + inline __int64 operator()(const ChunkPos &k) const + { return ChunkPos::hash_fnct(k); } +}; -} ChunkPosKeyHash; - -typedef struct +struct ChunkPosKeyEq { - bool operator() (const ChunkPos &x, const ChunkPos &y) const { return ChunkPos::eq_test(x, y); } -} ChunkPosKeyEq; \ No newline at end of file + 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/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_ENTITY = BIT_ENTITY, - eTYPE_ANIMAL = 0x200, + eTYPE_LIVINGENTITY = eTYPE_ENTITY | BIT_LIVING_ENTITY, - // 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, + eTYPE_MOB = eTYPE_LIVINGENTITY | BIT_MOB, - // 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, + eTYPE_PATHFINDER_MOB = eTYPE_MOB | BIT_PATHFINDER_MOB, - // 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_AGABLE_MOB = eTYPE_PATHFINDER_MOB | BIT_AGABLE_MOB, - 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_VILLAGER = eTYPE_AGABLE_MOB | 0x1, //0x12000, - eTYPE_VILLAGERGOLEM = 0x1000, + // 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_AGABLE_MOB = 0x2000, + eTYPE_OCELOT = eTYPE_TAMABLE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1, + eTYPE_WOLF = eTYPE_TAMABLE_ANIMAL | 0x2, - eTYPE_PLAYER = 0x8000, - eTYPE_SERVERPLAYER= 0x8001, + 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, - // Include AGABLE_MOB - eTYPE_VILLAGER = 0x12000, + eTYPE_COW = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | BIT_COW, + eTYPE_MUSHROOMCOW = eTYPE_COW | 0x1, - 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_WATERANIMAL = eTYPE_PATHFINDER_MOB | BIT_WATER_MOB, //0x100, + eTYPE_SQUID = eTYPE_WATERANIMAL| 0x1, - eTYPE_ANIMALS_SPAWN_LIMIT_CHECK = 0x80000, + eTYPE_GOLEM = eTYPE_PATHFINDER_MOB | BIT_GOLEM, - // Never used, exists to ensure all later entities don't match the bitmasks above - eTYPE_OTHERS = 0x100000, + eTYPE_SNOWMAN = eTYPE_GOLEM | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1, //0x4, + eTYPE_VILLAGERGOLEM = eTYPE_GOLEM | 0x2, //0x1000, - eTYPE_NETHER_SPHERE, - eTYPE_ENDER_CRYSTAL, - eTYPE_ENDERDRAGON, - eTYPE_BOSS_MOB_PART, - eTYPE_ENTITY, + // 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_MOB, + eTYPE_SPIDER = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | BIT_SPIDER, + eTYPE_CAVESPIDER = eTYPE_SPIDER | 0x1, - eTYPE_LIGHTNINGBOLT, + eTYPE_ZOMBIE = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | BIT_ZOMBIE, + eTYPE_PIGZOMBIE = eTYPE_ZOMBIE | 0x1, - eTYPE_PAINTING, - eTYPE_ITEMENTITY, - eTYPE_FALLINGTILE, - eTYPE_BOAT, - eTYPE_MINECART, - eTYPE_PRIMEDTNT, + 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_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_NODE, + eTYPE_AMBIENT = eTYPE_MOB | BIT_AMBIENT_MOB, + eTYPE_BAT = eTYPE_AMBIENT | eTYPE_VALID_IN_SPAWNER_FLAG | 0x1, - eType_ITEM, - eType_ITEMINSTANCE, - eType_MAPITEM, - eType_TILE, - eType_FIRETILE, + 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'); - // some dye recipes - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::YELLOW), +#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), 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..39da0e58 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 name; + 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 c1->hasCustomName() || c2->hasCustomName(); } shared_ptr CompoundContainer::getItem(unsigned int slot) @@ -46,7 +70,7 @@ void CompoundContainer::setItem(unsigned int slot, shared_ptr item else c1->setItem(slot, item); } -int CompoundContainer::getMaxStackSize() +int CompoundContainer::getMaxStackSize() const { return c1->getMaxStackSize(); } @@ -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..906a0618 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() const; + 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 7a11b5e1..8e6f58c6 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..bfd7a9b7 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() const = 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..47a11eb4 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) @@ -85,7 +95,7 @@ void CraftingContainer::setItem(unsigned int slot, shared_ptr item if(menu) menu->slotsChanged(); } -int CraftingContainer::getMaxStackSize() +int CraftingContainer::getMaxStackSize() const { return Container::LARGE_MAX_STACK_SIZE; } @@ -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..489dc84d 100644 --- a/Minecraft.World/CraftingContainer.h +++ b/Minecraft.World/CraftingContainer.h @@ -18,15 +18,18 @@ 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); - virtual int getMaxStackSize(); + virtual int getMaxStackSize() const; virtual void setChanged(); bool stillValid(shared_ptr player); 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() { - return 20; + 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) +{ + 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; - - 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 br = Mth::cos(td * PI * 2) * 2 + 0.5f; + if (br < 0.0f) br = 0.0f; + if (br > 1.0f) br = 1.0f; - return Vec3::newTemp(r, g, b); + 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; + + 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; - LevelType *levelType; - BiomeSource *biomeSource; - bool ultraWarm ; - bool hasCeiling; - float *brightnessRamp; - int id; + static const float MOON_BRIGHTNESS_PER_PHASE[8]; - virtual void init(Level *level); + Level *level; + LevelType *levelType; + wstring levelTypeOptions; + BiomeSource *biomeSource; + bool ultraWarm ; + bool hasCeiling; + float *brightnessRamp; + int id; + + 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) + if (!isLocked(level, x, y, z, data)) { - level->setTileAndData(x, y, z, Tile::diode_off_Id, data); - } - else if (!on) - { - // 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) { - int delay = (data & DELAY_MASK) >> DELAY_SHIFT; - level->addToTickNextTick(x, y, z, Tile::diode_on_Id, DELAYS[delay] * 2); + level->setTileAndData(x, y, z, getOffTile()->id, data, Tile::UPDATE_CLIENTS); + } + else if (!on) + { + // 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) { - 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); - } return false; } -// 4J-PB - Adding a TestUse for tooltip display -bool DiodeTile::TestUse() +bool DiodeTile::shouldTurnOn(Level *level, int x, int y, int z, int data) { - return true; + return getInputSignal(level, x, y, z, data) > 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::getInputSignal(Level *level, int x, int y, int z, int data) { - if( soundOnly) return false; + int dir = getDirection(data); - int data = level->getData(x, y, z); - int delay = (data & DELAY_MASK) >> DELAY_SHIFT; - delay = ((delay + 1) << DELAY_SHIFT) & DELAY_MASK; + 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]); - level->setData(x, y, z, delay | (data & DIRECTION_MASK)); - return true; + 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: + 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 Redstone::SIGNAL_NONE; +} + +int DiodeTile::getAlternateSignalAt(LevelSource *level, int x, int y, int z, int facing) +{ + int tile = level->getTile(x, y, z); + + if (isAlternateInput(tile)) + { + if (tile == Tile::redStoneDust_Id) + { + return level->getData(x, y, z); + } + else + { + return level->getDirectSignal(x, y, z, facing); + } + } + + 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) +{ + return Redstone::SIGNAL_MAX; +} + +bool DiodeTile::isDiode(int id) +{ + return Tile::diode_off->isSameDiode(id) || Tile::comparator_off->isSameDiode(id); +} + +bool DiodeTile::isSameDiode(int id) +{ + return id == getOnTile()->id || id == getOffTile()->id; +} + +bool DiodeTile::shouldPrioritize(Level *level, int x, int y, int z, int data) { - 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) + if (isDiode(level->getTile(x - Direction::STEP_X[dir], y, z - Direction::STEP_Z[dir]))) { - // 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; - } + int odata = level->getData(x - Direction::STEP_X[dir], y, z - Direction::STEP_Z[dir]); + int odir = getDirection(odata); + return odir != dir; } - else - { - // 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; - } - } - 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; -public: - static const int DELAY_MASK = DIRECTION_INV_MASK; - static const int DELAY_SHIFT = 2; - - static const double DELAY_RENDER_OFFSETS[4]; - static const int DELAYS[4]; - -private: - bool on; +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); - //@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 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: + 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); + +protected: + virtual void checkTickOnNeighbor(Level *level, int x, int y, int z, int type); + +public: + virtual bool isLocked(LevelSource *level, int x, int y, int z, 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 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 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 item = trap->getItem(slot); + DispenseItemBehavior *behavior = getDispenseMethod(item); - shared_ptr trap = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); - if(trap != NULL) - { - int slot=trap->getRandomSlot(); - - 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 DISPENSE_ITEM; + return FacingEnum::fromData(data & FACING_MASK); } + +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..3e743e22 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,46 +11,46 @@ 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; } -unsigned int DispenserTileEntity::getContainerSize() +unsigned int DispenserTileEntity::getContainerSize() { return 9; } shared_ptr DispenserTileEntity::getItem(unsigned int slot) { - return items->data[slot]; + return items[slot]; } -shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int count) +shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int count) { - if (items->data[slot] != NULL) + if (items[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 + } + 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,45 +61,45 @@ 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; } // 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) +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(); } } /** * Removes an item with the given id and returns true if one was found. -* +* * @param itemId * @return */ 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; } @@ -125,20 +123,20 @@ int DispenserTileEntity::getRandomSlot() return replaceSlot; } -void DispenserTileEntity::setItem(unsigned int slot, shared_ptr item) +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 IDS_TILE_DISPENSER; + return hasCustomName() ? name : app.GetString(IDS_TILE_DISPENSER); +} + +wstring DispenserTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +void DispenserTileEntity::setCustomName(const wstring &name) +{ + 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,20 +184,21 @@ 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() +int DispenserTileEntity::getMaxStackSize() const { return Container::LARGE_MAX_STACK_SIZE; } @@ -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..6c87d924 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,22 +34,26 @@ 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 int getMaxStackSize() const; 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(); - void AddItemBack(shared_ptritem, unsigned int slot); + void AddItemBack(shared_ptritem, unsigned int slot); }; \ No newline at end of file diff --git a/Minecraft.World/DoorItem.cpp b/Minecraft.World/DoorItem.cpp index 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() -{ - return 15 + 14 * 16; -} - ePARTICLE_TYPE DragonFireball::getTrailParticleType() { return eParticleType_dragonbreath; +} + +bool DragonFireball::shouldBurn() +{ + 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; + 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; - } - } - - 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 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; - - 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 (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; - - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) { - for (int zz = z0; !detectedWater && zz < z1; zz++) + 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) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + return; + } + } + + 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 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; + + 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 (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; + + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) + { + for (int zz = z0; !detectedWater && zz < z1; zz++) + { + 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; + yy = y0; + } + } + } + } + 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++) + 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,137 +121,16 @@ 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--; - } - } - return true; - } - else if (tile == Tile::mushroom1_Id || tile == Tile::mushroom2_Id) - { - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - if (((Mushroom *) Tile::tiles[tile])->growTree(level, x, y, z, level->random)) - { - itemInstance->count--; - } - } - } - 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->isClientSide) - { - ((StemTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z); - itemInstance->count--; - } - } - return true; - } - else if (tile == Tile::carrots_Id || tile == Tile::potatoes_Id) - { - if (level->getData(x, y, z) == 7) return false; - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - ((CropTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z); - itemInstance->count--; - } - } - return true; - } - else if (tile == Tile::crops_Id) - { - if (level->getData(x, y, z) == 7) return false; - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - ((CropTile *) Tile::crops)->growCropsToMax(level, x, y, z); - itemInstance->count--; - } - } - return true; - } - else if (tile == Tile::cocoa_Id) - { - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - level->setData(x, y, z, (2 << 2) | DirectionalTile::getDirection(level->getData(x, y, z))); - itemInstance->count--; - } - } - return true; - } - else if (tile == Tile::grass_Id) - { - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - itemInstance->count--; - - 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++) - { - 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; - } - } - - 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); - } - 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); - } - } - - // 4J - Stops infinite loops. -mainloop: continue; - } - } - } - + if (!level->isClientSide) level->levelEvent(LevelEvent::PARTICLES_PLANT_GROWTH, x, y, z, 0); return true; } } @@ -276,7 +155,7 @@ mainloop: continue; 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); + level->setTileAndData(x, y, z, Tile::cocoa_Id, cocoaData, Tile::UPDATE_CLIENTS); if (!player->abilities.instabuild) { itemInstance->count--; @@ -289,13 +168,165 @@ mainloop: continue; return false; } -bool DyePowderItem::interactEnemy(shared_ptr itemInstance, shared_ptr mob) +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->random->nextFloat() < 0.45) ((Sapling *) Tile::sapling)->advanceTree(level, x, y, z, level->random); + itemInstance->count--; + } + } + return true; + } + else if (tile == Tile::mushroom_brown_Id || tile == Tile::mushroom_red_Id) + { + if(!bTestUseOnOnly) + { + if (!level->isClientSide) + { + 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::melonStem_Id || tile == Tile::pumpkinStem_Id) + { + if (level->getData(x, y, z) == 7) return false; + if(!bTestUseOnOnly) + { + if (!level->isClientSide) + { + ((StemTile *) Tile::tiles[tile])->growCrops(level, x, y, z); + itemInstance->count--; + } + } + return true; + } + else if (tile == Tile::carrots_Id || tile == Tile::potatoes_Id) + { + if (level->getData(x, y, z) == 7) return false; + if(!bTestUseOnOnly) + { + if (!level->isClientSide) + { + ((CropTile *) Tile::tiles[tile])->growCrops(level, x, y, z); + itemInstance->count--; + } + } + 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) + { + 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++) + { + 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)) + { + goto mainloop; + } + } + + 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 (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. +mainloop: continue; + } + } + } + + return true; + } + return false; +} + +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 == NULL) return; + tile->updateShape(level, x, y, z); + + 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 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; + // 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); - // } - // } + // 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..068b6672 100644 --- a/Minecraft.World/EnchantmentContainer.cpp +++ b/Minecraft.World/EnchantmentContainer.cpp @@ -2,11 +2,11 @@ #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 ) { } -int EnchantmentContainer::getMaxStackSize() +int EnchantmentContainer::getMaxStackSize() const { return 1; } @@ -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..4ccbea69 100644 --- a/Minecraft.World/EnchantmentContainer.h +++ b/Minecraft.World/EnchantmentContainer.h @@ -13,6 +13,7 @@ private: EnchantmentMenu *m_menu; public: EnchantmentContainer(EnchantmentMenu *menu); - virtual int getMaxStackSize(); + virtual int getMaxStackSize() const; 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::registerAttributes() +{ + Mob::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(200); +} + void EnderDragon::defineSynchedData() { - BossMob::defineSynchedData(); - - entityData->define(DATA_ID_SYNCHED_HEALTH, maxHealth); + 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; - } + count++; + n = n->cameFrom; + } - NodeArray nodes = NodeArray(count); - n = to; - nodes.data[--count] = n; - while (n->cameFrom != NULL) + 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); - runSpeed = attackTarget != NULL ? 6.5f : 0.3f; + if (lastAttackTarget != attackTarget) + { + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_ATTACKING); + + if (attackTarget != NULL) + { + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_ATTACKING)); + } + } + + 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..cfae1772 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 @@ -392,7 +420,7 @@ void Entity::remove() void Entity::setSize(float w, float h) { - if (w != bbWidth || h != bbHeight) + if (w != bbWidth || h != bbHeight) { float oldW = bbWidth; @@ -403,7 +431,7 @@ void Entity::setSize(float w, float h) bb->z1 = bb->z0 + bbWidth; bb->y1 = bb->y0 + bbHeight; - if (bbWidth > oldW && !firstTick && !level->isClientSide) + if (bbWidth > oldW && !firstTick && !level->isClientSide) { move(oldW - bbWidth, 0, oldW - bbWidth); } @@ -421,7 +449,7 @@ void Entity::setPos(EntityPos *pos) void Entity::setRot(float yRot, float xRot) { - /* JAVA: + /* JAVA: this->yRot = yRot % 360.0f; this->xRot = xRot % 360.0f; @@ -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,43 +579,13 @@ 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) { onFire = 0; } - else + else { if (onFire > 0) { @@ -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 (walkDist > nextStep && t > 0) + if (t != Tile::ladder_Id) { - nextStep = (int) walkDist + 1; + ym = 0; + } + + walkDist += Mth::sqrt(xm * xm + zm * zm) * 0.6; + moveDist += Mth::sqrt(xm * xm + ym * ym + zm * zm) * 0.6; + + if (moveDist > nextStep && t > 0) + { + 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,26 +1028,10 @@ 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; } - } + } else { if (ya < 0) fallDistance -= (float) ya; @@ -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,18 +1338,12 @@ bool Entity::shouldRenderAtSqrDistance(double distance) return distance < size * size; } -// 4J - used to be wstring return type, returning L"" -int Entity::getTexture() -{ - return -1; -} - bool Entity::isCreativeModeAllowed() { return false; } -bool Entity::save(CompoundTag *entityTag) +bool Entity::saveAsMount(CompoundTag *entityTag) { wstring id = getEncodeId(); if (removed || id.empty() ) @@ -1321,6 +1356,19 @@ bool Entity::save(CompoundTag *entityTag) return true; } +bool Entity::save(CompoundTag *entityTag) +{ + wstring id = getEncodeId(); + if (removed || id.empty() || (rider.lock() != NULL) ) + { + return false; + } + // TODO Is this fine to be casting to a non-const char pointer? + entityTag->putString(L"id", id ); + saveWithoutId(entityTag); + return true; +} + void Entity::saveWithoutId(CompoundTag *entityTag) { entityTag->put(L"Pos", newDoubleList(3, x, y + ySlideOffset, z)); @@ -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,38 +1431,54 @@ 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() ); } -ListTag *Entity::newDoubleList(unsigned int number, double firstValue, ...) +/** +* Called after load() has finished and the entity has been added to the +* world +*/ +void Entity::onLoadedFromSave() +{ + +} + +template +ListTag *Entity::newDoubleList(unsigned int, double firstValue, Args... args) { ListTag *res = new ListTag(); // Add the first parameter to the ListTag res->add( new DoubleTag(L"", firstValue ) ); - va_list vl; - va_start(vl,firstValue); - - double val; - - for (unsigned int i=1;iadd(new DoubleTag(L"", val)); - } - - va_end(vl); + // use pre-C++17 fold trick (TODO: once we drop C++14 support, use C++14 fold expression) + using expander = int[]; + (void)expander{0, (res->add(new DoubleTag(L"", static_cast(args))), 0)...}; return res; } @@ -1449,6 +1527,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 +1550,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)) { @@ -1483,7 +1565,7 @@ bool Entity::interact(shared_ptr player) return false; } -AABB *Entity::getCollideAgainstBox(shared_ptr entity) +AABB *Entity::getCollideAgainstBox(shared_ptr entity) { return NULL; } @@ -1525,24 +1607,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 +1642,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 +1657,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 +1695,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 +1732,6 @@ void Entity::animateHurt() { } -void Entity::prepareCustomTextures() -{ -} - ItemInstanceArray Entity::getEquipmentSlots() // ItemInstance[] { return ItemInstanceArray(); // Default ctor creates NULL internal array @@ -1696,12 +1744,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 +1819,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) + if( entityData ) { - entityData->set(DATA_SHARED_FLAGS_ID, (byte) (currentValue | (1 << flag))); - } - else - { - 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 +1864,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 +1878,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); + 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 = -1; + int dir = 3; double closest = 9999; if (west && xd < closest) { @@ -1842,12 +1900,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 +1925,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 +1939,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,23 +1972,154 @@ 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::setAnimOverrideBitmask(unsigned int uiBitmask) +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; app.DebugPrintf("!!! Setting anim override bitmask to %d\n",uiBitmask); } -unsigned int Entity::getAnimOverrideBitmask() -{ +unsigned int Entity::getAnimOverrideBitmask() +{ if(app.GetGameSettings(eGameSetting_CustomSkinAnim)==0 ) { // We have a force animation for some skins (claptrap) @@ -1953,4 +2140,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..a738c2ba 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,21 +284,28 @@ 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, ...); + template + ListTag *newDoubleList(unsigned int, double firstValue, Args... args); ListTag *newFloatList(unsigned int number, float firstValue, float secondValue); public: @@ -296,15 +323,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 +362,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 +372,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 +397,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)) { - shared_ptr sourcePlayer = dynamic_pointer_cast(entity); - if(sourcePlayer != NULL) additional = sourcePlayer->name; + 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()) + { + 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(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(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(FireworksRocketEntity::create, eTYPE_FIREWORKS_ROCKET, L"FireworksRocketEntity", 22); - setId(Mob::create, eTYPE_MOB, L"Mob", 48); - setId(Monster::create, eTYPE_MONSTER, L"Monster", 49); + 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(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(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(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(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); + } - return AABB::newTemp(x + west, y, z + north, x + east, y + 1.5f, z + south); + if (n) + { + north = 0; + } + if (s) + { + south = 1; + } + + 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 ae0cf96c..21bc3021 100644 --- a/Minecraft.World/File.cpp +++ b/Minecraft.World/File.cpp @@ -12,13 +12,13 @@ const wchar_t File::pathSeparator = L'\\'; #ifdef _XBOX -const wstring File::pathRoot = L"GAME:"; // Path root after pathSeparator has been removed +const std::wstring File::pathRoot = L"GAME:"; // Path root after pathSeparator has been removed #else -const wstring File::pathRoot = L""; // Path root after pathSeparator has been removed +const std::wstring File::pathRoot = L""; // Path root after pathSeparator has been removed #endif //Creates a new File instance from a parent abstract pathname and a child pathname string. -File::File( const File &parent, const wstring& child ) +File::File( const File &parent, const std::wstring& child ) { m_abstractPathName = parent.getPath() + pathSeparator + child; } @@ -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); @@ -67,7 +67,7 @@ File::File( const wstring& pathname ) //: parent( NULL ) */ } -File::File( const wstring& parent, const wstring& child ) //: m_abstractPathName( child ) +File::File( const std::wstring& parent, const std::wstring& child ) //: m_abstractPathName( child ) { m_abstractPathName = pathRoot + pathSeparator + parent + pathSeparator + child; //this->parent = new File( parent ); @@ -149,9 +149,9 @@ bool File::mkdir() const // bool File::mkdirs() const { - vector path = stringSplit( m_abstractPathName, pathSeparator ); + std::vector path = stringSplit( m_abstractPathName, pathSeparator ); - wstring pathToHere = L""; + std::wstring pathToHere = L""; AUTO_VAR(itEnd, path.end()); for( AUTO_VAR(it, path.begin()); it != itEnd; it++ ) { @@ -237,7 +237,7 @@ bool File::renameTo(File dest) // 4J Stu - The wstringtofilename function returns a pointer to the same location in memory every time it is // called, therefore we were getting sourcePath and destPath having the same value. The solution here is to // make a copy of the sourcePath by storing it in a std::string - string sourcePath = wstringtofilename(getPath()); + std::string sourcePath = wstringtofilename(getPath()); const char *destPath = wstringtofilename(dest.getPath()); #ifdef _DURANGO __debugbreak(); // TODO @@ -272,9 +272,9 @@ bool File::renameTo(File dest) //An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. //The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, //or if an I/O error occurs. -vector *File::listFiles() const +std::vector *File::listFiles() const { - vector *vOutput = new vector(); + std::vector *vOutput = new vector(); // TODO 4J Stu - Also need to check for I/O errors? if( !isDirectory() ) @@ -386,8 +386,8 @@ vector *File::listFiles() const FindClose( hFind); } #else - char path[MAX_PATH]; - sprintf( path, "%s\\*", wstringtofilename( getPath() ) ); + char path[MAX_PATH] {}; + snprintf( path, MAX_PATH, "%s\\*", wstringtofilename( getPath() ) ); HANDLE hFind = FindFirstFile( path, &wfd); if(hFind != INVALID_HANDLE_VALUE) { @@ -415,13 +415,13 @@ vector *File::listFiles() const //Returns: //An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. //The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs. -vector *File::listFiles(FileFilter *filter) const +std::vector *File::listFiles(FileFilter *filter) const { // TODO 4J Stu - Also need to check for I/O errors? if( !isDirectory() ) return NULL; - vector *vOutput = new vector(); + std::vector *vOutput = new std::vector(); #ifdef __PS3__ const char *lpFileName=wstringtofilename(getPath()); @@ -521,7 +521,7 @@ bool File::isDirectory() const //Returns the length of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory. //Returns: //The length, in bytes, of the file denoted by this abstract pathname, or 0L if the file does not exist -__int64 File::length() +int64_t File::length() { #ifdef __PS3__ //extern const char* getPS3HomePath(); @@ -624,7 +624,7 @@ __int64 File::length() //Returns: //A long value representing the time the file was last modified, measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970), //or 0L if the file does not exist or if an I/O error occurs -__int64 File::lastModified() +int64_t File::lastModified() { WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer; #ifdef _UNICODE @@ -657,7 +657,7 @@ __int64 File::lastModified() } } -const wstring File::getPath() const +const std::wstring File::getPath() const { /* wstring path; @@ -672,7 +672,7 @@ const wstring File::getPath() const return m_abstractPathName; } -wstring File::getName() const +std::wstring File::getName() const { unsigned int sep = (unsigned int )(m_abstractPathName.find_last_of( this->pathSeparator )); return m_abstractPathName.substr( sep + 1, m_abstractPathName.length() ); @@ -700,3 +700,9 @@ int File::hash_fnct(const File &k) return (int) hashCode; } + +int FileKeyHash::operator() (const File &k) const +{ return File::hash_fnct(k); } + +bool FileKeyEq::operator() (const File &x, const File &y) const +{ return File::eq_test(x,y); } \ No newline at end of file diff --git a/Minecraft.World/File.h b/Minecraft.World/File.h index 0b710cd4..ae07a4b7 100644 --- a/Minecraft.World/File.h +++ b/Minecraft.World/File.h @@ -1,5 +1,9 @@ #pragma once -using namespace std; + +#include +#include +#include + // 4J Stu - Represents java standard library class class FileFilter; @@ -24,11 +28,11 @@ public: bool exists() const; bool isFile() const; bool renameTo(File dest); - vector *listFiles() const; // Array - vector *listFiles(FileFilter *filter) const; + std::vector *listFiles() const; // Array + std::vector *listFiles(FileFilter *filter) const; bool isDirectory() const; - __int64 length(); - __int64 lastModified(); + int64_t length(); + int64_t lastModified(); const wstring getPath() const; // 4J Jev: TODO wstring getName() const; @@ -43,14 +47,12 @@ private: //File(vector *path); }; -typedef struct +struct FileKeyHash { - int operator() (const File &k) const { return File::hash_fnct(k); } + int operator() (const File &k) const; +}; -} FileKeyHash; - -typedef struct +struct FileKeyEq { - bool operator() (const File &x, const File &y) const {return File::eq_test(x,y); } - -} FileKeyEq; \ No newline at end of file + bool operator() (const File &x, const File &y) const; +}; \ No newline at end of file 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() -{ - return 14 + 2 * 16; -} - ePARTICLE_TYPE Fireball::getTrailParticleType() { return eParticleType_smoke; +} + +bool Fireball::shouldBurn() +{ + 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..1aa2c300 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 IDS_TILE_FURNACE; + return hasCustomName() ? name : app.GetString(IDS_TILE_FURNACE); +} + +wstring FurnaceTileEntity::getCustomName() +{ + 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,23 +144,23 @@ 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); } -int FurnaceTileEntity::getMaxStackSize() +int FurnaceTileEntity::getMaxStackSize() const { return Container::LARGE_MAX_STACK_SIZE; } @@ -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; + const 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++; + const 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..c77f8e44 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,10 +51,13 @@ 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(); + virtual int getMaxStackSize() const; int getBurnProgress(int max); int getLitProgress(int max); bool isLit(); @@ -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; - } - } + xTarget = x; + yTarget = y; + zTarget = z; + } + } - if (target != NULL && target->removed) target = nullptr; - if (target == NULL || retargetTime-- <= 0) + 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); - } + 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++) + 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); + 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); + 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 lperlinNoise1; + delete lperlinNoise2; + delete perlinNoise1; + delete perlinNoise2; + delete perlinNoise3; - delete scaleNoise; - delete depthNoise; + 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 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; + 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++) + 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; - } + tileId = Tile::netherRack_Id; + } - blocks[offs] = (byte) tileId; - offs += step; - val += vala; - } - _s0 += _s0a; - _s1 += _s1a; - } + blocks[offs] = (byte) tileId; + offs += step; + val += vala; + } + _s0 += _s0a; + _s1 += _s1a; + } - s0 += s0a; - s1 += s1a; - s2 += s2a; - s3 += s3a; - } - } - } - } + 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; - } - } + 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 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++; + if (depth > 1) depth = 1; + depth = depth / 6; + } + scale = (scale) + 0.5; + depth = depth * ySize / 16; + pp++; - for (int yy = 0; yy < ySize; yy++) + 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; - } + 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++; - } - } - } + 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); - } + 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++) + 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 + 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::hellRock_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::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 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++; + 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..38a0e817 --- /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() const +{ + 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..cfd2fabf --- /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() const; + 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; + 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) + 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--; - } + d--; + } - int xx0 = x0; - int xx1 = x0 + w - 1; - int zz0 = z0; - int zz1 = z0 + d - 1; - if (doorSide >= 2) + 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; - int side = random->nextInt(4); + 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); - if (side == 0) xx = xx0; - if (side == 1) xx = xx1; - if (side == 2) zz = zz0; - if (side == 3) zz = zz1; + int dir = 0; + if (doorSide == 0) dir = 0; + if (doorSide == 2) dir = 1; + if (doorSide == 1) dir = 2; + if (doorSide == 3) dir = 3; - 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); - } - } - } + DoorItem::place(level, xx, y0, zz, dir, Tile::door_wood); + } - int ww = xx1 - xx0; - int dd = zz1 - zz0; - for (int i = 0; i < (ww * 2 + dd * 2); i++) + for (int i = 0; i < (w * 2 + d * 2) * 3; i++) { - int xx = xx0 + random->nextInt(ww - 1) + 1; - int zz = zz0 + random->nextInt(dd - 1) + 1; - int yy = y0; + int xx = x0 + random->nextInt(w - 4) + 2; + int zz = z0 + random->nextInt(d - 4) + 2; + int side = random->nextInt(4); - if (level->getTile(xx, yy + 2, zz) == 0) + 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)) { - 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, 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 + 2, zz, Tile::torch_Id); - } - } - } + level->setTileAndData(xx, y0 + 1, zz, Tile::glass_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); + 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; - return true; + 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) + { + 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); + + 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; - } + return false; + } - if (!free) return false; + if (!free) return false; - //if (!Tile::mushroom1->mayPlace(level, x, y, z)) return false; - - //placeBlock(level, x, y - 1, z, Tile::dirt_Id, 0); - - 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/I18n.cpp b/Minecraft.World/I18n.cpp index 81d3dff5..4805cdfe 100644 --- a/Minecraft.World/I18n.cpp +++ b/Minecraft.World/I18n.cpp @@ -3,20 +3,3 @@ #include "I18n.h" Language *I18n::lang = Language::getInstance(); -wstring I18n::get(const wstring& id, ...) -{ -#ifdef __PSVITA__ // 4J - vita doesn't like having a reference type as the last parameter passed to va_start - we shouldn't need this method anyway - return L""; -#elif _MSC_VER >= 1930 // VS2022+ also disallows va_start with reference types - return id; -#else - va_list va; - va_start(va, id); - return I18n::get(id, va); -#endif -} - -wstring I18n::get(const wstring& id, va_list args) -{ - return lang->getElement(id, args); -} diff --git a/Minecraft.World/I18n.h b/Minecraft.World/I18n.h index 0a43fe20..f459f4de 100644 --- a/Minecraft.World/I18n.h +++ b/Minecraft.World/I18n.h @@ -10,6 +10,9 @@ private: static Language *lang; public: - static wstring get(const wstring& id, ...); - static wstring get(const wstring& id, va_list args); + template + static wstring get(Args... args) + { + return lang->getElement(std::forward(args)...); + } }; \ No newline at end of file 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..1b9ff630 100644 --- a/Minecraft.World/Inventory.cpp +++ b/Minecraft.World/Inventory.cpp @@ -87,7 +87,7 @@ int Inventory::getSlotWithRemainingSpace(shared_ptr item) { for (unsigned int i = 0; i < items.length; i++) { - if (items[i] != NULL && items[i]->id == item->id && items[i]->isStackable() + if (items[i] != NULL && items[i]->id == item->id && items[i]->isStackable() && items[i]->count < items[i]->getMaxStackSize() && items[i]->count < getMaxStackSize() && (!items[i]->isStackedByData() || items[i]->getAuxValue() == item->getAuxValue()) && ItemInstance::tagMatches(items[i], item)) @@ -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) { - int oldSlot = getSlot(item->id, data); - if (oldSlot >= 0) - { - items[oldSlot] = items[selected]; - } - - // It's too easy to accidentally pick block and lose enchanted - // items. + // It's too easy to accidentally pick block and lose enchanted items. if (heldItem != NULL && heldItem->isEnchantable() && getSlot(heldItem->id, heldItem->getDamageValue()) == selected) { return; } - items[selected] = shared_ptr(new ItemInstance(Item::items[item->id], 1, data)); + + 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) ); + } + else + { + items[selected] = shared_ptr(new ItemInstance(Item::items[item->id], 1, data)); + } } } @@ -200,7 +228,7 @@ int Inventory::addResource(shared_ptr itemInstance) if (slot < 0) return count; if (items[slot] == NULL) { - items[slot] = ItemInstance::clone(itemInstance); + items[slot] = ItemInstance::clone(itemInstance); player->handleCollectItem(itemInstance); } return 0; @@ -271,14 +299,14 @@ bool Inventory::removeResource(int type,int iAuxVal) void Inventory::removeResources(shared_ptr item) { - if(item == NULL) return; + if(item == NULL) return; int countToRemove = item->count; for (unsigned int i = 0; i < items.length; i++) { if (items[i] != NULL && items[i]->sameItemWithTags(item)) { - int slotCount = items[i]->count; + int slotCount = items[i]->count; items[i]->count -= countToRemove; if(slotCount < countToRemove) { @@ -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()) { @@ -359,12 +387,12 @@ bool Inventory::add(shared_ptr item) { player->handleCollectItem(item); - player->awardStat( + player->awardStat( GenericStats::itemsCollected(item->id, item->getAuxValue()), GenericStats::param_itemsCollected(item->id, item->getAuxValue(), item->GetCount())); items[slot] = ItemInstance::clone(item); - items[slot]->popTime = Inventory::POP_TIME_DURATION; + items[slot]->popTime = POP_TIME_DURATION; item->count = 0; return true; } @@ -447,7 +475,7 @@ void Inventory::setItem(unsigned int slot, shared_ptr item) else { items[slot] = item; - } + } player->handleCollectItem(item); /* ItemInstanceArray& pile = items; @@ -549,23 +577,26 @@ 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 L""; +} + +bool Inventory::hasCustomName() +{ + return false; +} + +int Inventory::getMaxStackSize() const { return MAX_INVENTORY_STACK_SIZE; } -int Inventory::getAttackDamage(shared_ptr entity) -{ - shared_ptr item = getItem(selected); - if (item != NULL) return item->getAttackDamage(entity); - return 1; -} - bool Inventory::canDestroy(Tile *tile) { if (tile->material->isAlwaysDestroyable()) return true; @@ -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..db5f42d6 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(); - - int getMaxStackSize(); - - int getAttackDamage(shared_ptr entity); - + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); + int getMaxStackSize() const; 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); } -// 4J-JEV: Added for achievement 'Iron Man'. -shared_ptr InventoryMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +bool InventoryMenu::canTakeItemForPickAll(shared_ptr carried, Slot *target) { - shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + 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, bool looped) // 4J Added looped param +{ + 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..2f23ab8c 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) ->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::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::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::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::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::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::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::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::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::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::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::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::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::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::chestplate_cloth = (ArmorItem *) ( ( new ArmorItem(43, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_cloth) ->setTextureName(L"chestplateCloth")->setDescriptionId(IDS_ITEM_CHESTPLATE_CLOTH)->setUseDescriptionId(IDS_DESC_CHESTPLATE_LEATHER) ); - Item::chestplate_iron = (ArmorItem *) ( ( new ArmorItem(51, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_iron) ->setTextureName(L"chestplateIron")->setDescriptionId(IDS_ITEM_CHESTPLATE_IRON)->setUseDescriptionId(IDS_DESC_CHESTPLATE_IRON) ); - Item::chestplate_diamond = (ArmorItem *) ( ( new ArmorItem(55, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_diamond) ->setTextureName(L"chestplateDiamond")->setDescriptionId(IDS_ITEM_CHESTPLATE_DIAMOND)->setUseDescriptionId(IDS_DESC_CHESTPLATE_DIAMOND) ); - Item::chestplate_gold = (ArmorItem *) ( ( new ArmorItem(59, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_gold) ->setTextureName(L"chestplateGold")->setDescriptionId(IDS_ITEM_CHESTPLATE_GOLD)->setUseDescriptionId(IDS_DESC_CHESTPLATE_GOLD) ); - - Item::leggings_cloth = (ArmorItem *) ( ( new ArmorItem(44, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_cloth) ->setTextureName(L"leggingsCloth")->setDescriptionId(IDS_ITEM_LEGGINGS_CLOTH)->setUseDescriptionId(IDS_DESC_LEGGINGS_LEATHER) ); - Item::leggings_iron = (ArmorItem *) ( ( new ArmorItem(52, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_iron) ->setTextureName(L"leggingsIron")->setDescriptionId(IDS_ITEM_LEGGINGS_IRON)->setUseDescriptionId(IDS_DESC_LEGGINGS_IRON) ); - Item::leggings_diamond = (ArmorItem *) ( ( new ArmorItem(56, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_diamond) ->setTextureName(L"leggingsDiamond")->setDescriptionId(IDS_ITEM_LEGGINGS_DIAMOND)->setUseDescriptionId(IDS_DESC_LEGGINGS_DIAMOND) ); - 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_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_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::bow = (BowItem *)( new BowItem(5) ) ->setTextureName(L"bow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_bow) ->setDescriptionId(IDS_ITEM_BOW)->setUseDescriptionId(IDS_DESC_BOW); - Item::arrow = ( new Item(6) ) ->setTextureName(L"arrow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_arrow) ->setDescriptionId(IDS_ITEM_ARROW)->setUseDescriptionId(IDS_DESC_ARROW); - - Item::compass = ( new CompassItem(89) ) ->setTextureName(L"compass")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_compass) ->setDescriptionId(IDS_ITEM_COMPASS)->setUseDescriptionId(IDS_DESC_COMPASS); - Item::clock = ( new ClockItem(91) ) ->setTextureName(L"clock")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_clock) ->setDescriptionId(IDS_ITEM_CLOCK)->setUseDescriptionId(IDS_DESC_CLOCK); - Item::map = (MapItem *) ( new MapItem(102) ) ->setTextureName(L"map")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_map) ->setDescriptionId(IDS_ITEM_MAP)->setUseDescriptionId(IDS_DESC_MAP); + 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::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::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::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::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) ) ->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) ) ->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::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::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::boat = ( new BoatItem(77) ) ->setIconName(L"boat")->setDescriptionId(IDS_ITEM_BOAT)->setUseDescriptionId(IDS_DESC_BOAT); - Item::dye_powder = ( new DyePowderItem(95) ) ->setBaseItemTypeAndMaterial(eBaseItemType_dyepowder, eMaterial_dye)->setTextureName(L"dyePowder")->setDescriptionId(IDS_ITEM_DYE_POWDER)->setUseDescriptionId(-1); + 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::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::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 @@ -473,10 +501,10 @@ void Item::staticCtor() void Item::staticInit() { Stats::buildItemStats(); -} +} -_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; } @@ -640,7 +668,7 @@ shared_ptr Item::useTimeDepleted(shared_ptr itemInst return itemInstance; } -int Item::getMaxStackSize() +int Item::getMaxStackSize() const { return maxStackSize; } @@ -683,20 +711,20 @@ bool Item::canBeDepleted() /** * Returns true when the item was used to deal more than default damage -* +* * @param itemInstance * @param mob * @param attacker * @return */ -bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { return false; } /** * Returns true when the item was used to mine more efficiently -* +* * @param itemInstance * @param tile * @param x @@ -705,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..22d0a9d1 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; @@ -68,8 +72,8 @@ public: eMaterial_stoneSmooth, eMaterial_netherbrick, eMaterial_ender, - eMaterial_glass, - eMaterial_blaze, + eMaterial_glass, + eMaterial_blaze, eMaterial_magic, eMaterial_melon, eMaterial_setfire, @@ -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; @@ -394,13 +421,13 @@ public: static const int bow_Id = 261; static const int arrow_Id = 262; static const int coal_Id = 263; - static const int diamond_Id = 264; + static const int diamond_Id = 264; static const int ironIngot_Id = 265; static const int goldIngot_Id = 266; static const int sword_iron_Id = 267; - static const int sword_wood_Id = 268; + static const int sword_wood_Id = 268; static const int shovel_wood_Id = 269; - static const int pickAxe_wood_Id = 270; + static const int pickAxe_wood_Id = 270; static const int hatchet_wood_Id = 271; static const int sword_stone_Id = 272; static const int shovel_stone_Id = 273; @@ -410,7 +437,7 @@ public: static const int shovel_diamond_Id = 277; static const int pickAxe_diamond_Id = 278; static const int hatchet_diamond_Id = 279; - static const int stick_Id = 280; + static const int stick_Id = 280; static const int bowl_Id = 281; static const int mushroomStew_Id = 282; static const int sword_gold_Id = 283; @@ -419,20 +446,20 @@ 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; static const int hoe_diamond_Id = 293; static const int hoe_gold_Id = 294; - static const int seeds_wheat_Id = 295; + static const int seeds_wheat_Id = 295; static const int wheat_Id = 296; static const int bread_Id = 297; - 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; @@ -458,7 +485,7 @@ public: static const int porkChop_raw_Id = 319; static const int porkChop_cooked_Id = 320; static const int painting_Id = 321; - static const int apple_gold_Id = 322; + static const int apple_gold_Id = 322; static const int sign_Id = 323; static const int door_wood_Id = 324; static const int bucket_empty_Id = 325; @@ -471,10 +498,10 @@ 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; + static const int reeds_Id = 338; static const int paper_Id = 339; static const int book_Id = 340; static const int slimeBall_Id = 341; @@ -487,12 +514,12 @@ public: static const int yellowDust_Id = 348; static const int fish_raw_Id = 349; static const int fish_cooked_Id = 350; - static const int dye_powder_Id = 351; + static const int dye_powder_Id = 351; static const int bone_Id = 352; static const int sugar_Id = 353; static const int cake_Id = 354; 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; @@ -547,12 +574,11 @@ public: static const int record_12_Id = 2266; // 4J-PB - this one isn't playable in the PC game, but is fine in ours - static const int record_08_Id = 2267; + static const int record_08_Id = 2267; // TU9 static const int fireball_Id = 385; 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,14 +663,12 @@ 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(); + virtual int getMaxStackSize() const; virtual int getLevelDataForAuxValue(int auxValue); bool isStackedByData(); @@ -645,17 +686,17 @@ public: /** * Returns true when the item was used to deal more than default damage - * + * * @param itemInstance * @param mob * @param attacker * @return */ - virtual bool hurtEnemy(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 - * + * * @param itemInstance * @param tile * @param x @@ -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) { - spawnAtLocation(shared_ptr(new ItemInstance(Item::frame)), 0.0f); - shared_ptr item = getItem(); - if (item != NULL) - { - shared_ptr data = Item::map->getSavedData(item, level); - data->removeItemFrameDecoration(item); + double size = 16; + size *= 64.0f * viewScale; + return distance < size * size; +} - shared_ptr itemToDrop = item->copy(); - itemToDrop->setFramed(nullptr); - spawnAtLocation(itemToDrop, 0.0f); +void ItemFrame::dropItem(shared_ptr causedBy) +{ + shared_ptr item = getItem(); + + if (causedBy != NULL && causedBy->instanceof(eTYPE_PLAYER)) + { + if (dynamic_pointer_cast(causedBy)->abilities.instabuild) + { + removeFramedMap(item); + return; + } } + + 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(); - virtual int getWidth() {return 9;} - virtual int getHeight() {return 9;} - virtual void dropItem(); public: + virtual int getWidth() {return 9;} + virtual int getHeight() {return 9;} + virtual bool shouldRenderAtSqrDistance(double distance); + virtual void dropItem(shared_ptr causedBy); +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..32367b12 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"; @@ -28,46 +31,50 @@ void ItemInstance::_init(int id, int count, int auxValue) this->m_bForceNumberDisplay=false; } -ItemInstance::ItemInstance(Tile *tile) +ItemInstance::ItemInstance(Tile *tile) { _init(tile->id, 1, 0); } -ItemInstance::ItemInstance(Tile *tile, int count) +ItemInstance::ItemInstance(Tile *tile, int count) { _init(tile->id, count, 0); } // 4J-PB - added -ItemInstance::ItemInstance(MapItem *item, int count) +ItemInstance::ItemInstance(MapItem *item, int count) { _init(item->id, count, 0); } ItemInstance::ItemInstance(Tile *tile, int count, int auxValue) { - _init(tile->id, count, auxValue); + _init(tile->id, count, auxValue); } -ItemInstance::ItemInstance(Item *item) +ItemInstance::ItemInstance(Item *item) { - _init(item->id, 1, 0); + _init(item->id, 1, 0); } -ItemInstance::ItemInstance(Item *item, int count) +ItemInstance::ItemInstance(Item *item, int count) { - _init(item->id, count, 0); + _init(item->id, count, 0); } -ItemInstance::ItemInstance(Item *item, int count, int auxValue) +ItemInstance::ItemInstance(Item *item, int count, int auxValue) { - _init(item->id, count, auxValue); + _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) @@ -82,7 +89,7 @@ ItemInstance::~ItemInstance() if(tag != NULL) delete tag; } -shared_ptr ItemInstance::remove(int count) +shared_ptr ItemInstance::remove(int count) { shared_ptr ii = shared_ptr( new ItemInstance(id, count, auxValue) ); if (tag != NULL) ii->tag = (CompoundTag *) tag->copy(); @@ -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() @@ -116,19 +123,19 @@ bool ItemInstance::useOn(shared_ptr player, Level *level, int x, int y, return getItem()->useOn(shared_from_this(), player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly); } -float ItemInstance::getDestroySpeed(Tile *tile) +float ItemInstance::getDestroySpeed(Tile *tile) { - return getItem()->getDestroySpeed(shared_from_this(), tile); + 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) +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) @@ -136,137 +143,161 @@ shared_ptr ItemInstance::useTimeDepleted(Level *level, shared_ptr< return getItem()->useTimeDepleted(shared_from_this(), level, player); } -CompoundTag *ItemInstance::save(CompoundTag *compoundTag) +CompoundTag *ItemInstance::save(CompoundTag *compoundTag) { - compoundTag->putShort(L"id", (short) id); - compoundTag->putByte(L"Count", (byte) count); - 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() +int ItemInstance::getMaxStackSize() const { - return getItem()->getMaxStackSize(); + return getItem()->getMaxStackSize(); } bool ItemInstance::isStackable() { - return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); + return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); } -bool ItemInstance::isDamageableItem() +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() +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; - } - - shared_ptr player = dynamic_pointer_cast(owner); - if (i > 0 && player != NULL) - { - 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) ) - { - // enchantment prevents damage - return; - } + 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()) + if (dmg > 0) + { + int level = EnchantmentHelper::getEnchantmentLevel(Enchantment::digDurability->id, shared_from_this()); + + int drop = 0; + for (int y = 0; level > 0 && y < dmg; y++) + { + if (DigDurabilityEnchantment::shouldIgnoreDurabilityDrop(shared_from_this(), level, random)) + { + drop++; + } + } + dmg -= drop; + + if (dmg <= 0) return false; + } + + auxValue += dmg; + + return auxValue > getMaxDamage(); +} + +void ItemInstance::hurtAndBreak(int dmg, shared_ptr owner) +{ + 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 (count < 0) count = 0; - auxValue = 0; - } + + 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::hurtEnemy(shared_ptr mob, shared_ptr attacker) +void ItemInstance::hurtEnemy(shared_ptr mob, shared_ptr attacker) { - //bool used = - Item::items[id]->hurtEnemy(shared_from_this(), mob, attacker); + //bool used = + Item::items[id]->hurtEnemy(shared_from_this(), mob, attacker); } -void ItemInstance::mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner) +void ItemInstance::mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner) { - //bool used = - Item::items[id]->mineBlock( shared_from_this(), level, tile, x, y, z, owner); -} - -int ItemInstance::getAttackDamage(shared_ptr entity) -{ - 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 @@ -311,18 +342,18 @@ bool ItemInstance::tagMatches(shared_ptr a, shared_ptr a, shared_ptr b) +bool ItemInstance::matches(shared_ptr a, shared_ptr b) { - if (a == NULL && b == NULL) return true; - if (a == NULL || b == NULL) return false; - return a->matches(b); + 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) +bool ItemInstance::sameItem_not_shared(const ItemInstance *b) { - return id == b->id && auxValue == b->auxValue; + return id == b->id && auxValue == b->auxValue; } -unsigned int ItemInstance::getUseDescriptionId() +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*/) +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() +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(); + HtmlString title = HtmlString(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""; - //} + if (hasCustomHoverName()) + { + title.italics = true; + } - // 4J Stu - Don't currently have this - //if (advanced) - //{ - // String suffix = ""; + // 4J: This is for showing aux values, not useful in console version + /* + if (advanced) + { + wstring suffix = L""; - // if (title.length() > 0) { - // title += " ("; - // suffix = ")"; - // } + 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()) - //{ - // if (id == Item::map_Id) - // { - // title += L" #" + _toString(auxValue); - // } - //} + 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; @@ -667,7 +848,7 @@ int ItemInstance::get4JData() } } // 4J Added - to show strength on potions -bool ItemInstance::hasPotionStrengthBar() +bool ItemInstance::hasPotionStrengthBar() { // exclude a bottle of water from this if((id==Item::potion_Id) && (auxValue !=0))// && (!MACRO_POTION_IS_AKWARD(auxValue))) 4J-PB leaving the bar on an awkward potion so we can differentiate it from a water bottle @@ -678,7 +859,7 @@ bool ItemInstance::hasPotionStrengthBar() return false; } -int ItemInstance::GetPotionStrength() +int ItemInstance::GetPotionStrength() { if(MACRO_POTION_IS_INSTANTDAMAGE(auxValue) || MACRO_POTION_IS_INSTANTHEALTH(auxValue) ) { @@ -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..cff33a97 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,12 +77,12 @@ 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); void load(CompoundTag *compoundTag); - int getMaxStackSize(); + int getMaxStackSize() const; bool isStackable(); bool isDamageableItem(); bool isStackedByData(); @@ -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 @@ -107,7 +113,7 @@ private: public: bool sameItem(shared_ptr b); bool sameItemWithTags(shared_ptr b); //4J Added - bool sameItem_not_shared(ItemInstance *b); // 4J Stu - Added this for the one time I need it + bool sameItem_not_shared(const ItemInstance *b); // 4J Stu - Added this for the one time I need it virtual unsigned int getUseDescriptionId(); // 4J Added virtual unsigned int getDescriptionId(int iData = -1); virtual ItemInstance *setDescriptionId(unsigned int id); @@ -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/JavaIntHash.h b/Minecraft.World/JavaIntHash.h index 447b8052..fe608469 100644 --- a/Minecraft.World/JavaIntHash.h +++ b/Minecraft.World/JavaIntHash.h @@ -1,13 +1,15 @@ #pragma once +#include + // Java doesn't have a default hash value for ints, however, the hashmap itself does some "supplemental" hashing, so // our ints actually get hashed by code as implemented below. std templates *do* have a standard hash for ints, but it // would appear to be a bit expensive so matching the java one for now anyway. This code implements the supplemental // hashing that happens in java so we can match what their maps are doing with ints. -typedef struct +struct IntKeyHash { - int operator() (const int &k) const + inline int operator()(const int &k) const { int h = k; h += ~(h << 9); @@ -16,62 +18,64 @@ typedef struct h ^= (((unsigned int)h) >> 10); return h; } +}; -} IntKeyHash; - -typedef struct +struct IntKeyEq { - bool operator() (const int &x, const int &y) const { return x==y; } -} IntKeyEq; - + inline bool operator()(const int &x, const int &y) const + { return x==y; } +}; // This hash functor is taken from the IntHashMap java class used by the game, so that we can use a standard std hashmap with this hash rather // than implement the class itself -typedef struct +struct IntKeyHash2 { - int operator() (const int &k) const + inline int operator()(const int &k) const { - unsigned int h = (unsigned int)k; + unsigned int h = static_cast(k); h ^= (h >> 20) ^ (h >> 12); - return (int)(h ^ (h >> 7) ^ (h >> 4)); + return static_cast(h ^ (h >> 7) ^ (h >> 4)); } -} IntKeyHash2; +}; // This hash functor is taken from the LongHashMap java class used by the game, so that we can use a standard std hashmap with this hash rather // than implement the class itself -typedef struct +struct LongKeyHash { - int hash(const int &k) const + inline int hash(const int &k) const { - unsigned int h = (unsigned int)k; + unsigned int h = static_cast(k); h ^= (h >> 20) ^ (h >> 12); - return (int)(h ^ (h >> 7) ^ (h >> 4)); + return static_cast(h ^ (h >> 7) ^ (h >> 4)); } - int operator() (const __int64 &k) const + inline int operator()(const int64_t &k) const { - return hash((int) ( k ^ (((__uint64)k) >> 32 ))); + return hash(static_cast(k ^ ((static_cast(k)) >> 32))); } -} LongKeyHash; +}; -typedef struct +struct LongKeyEq { - bool operator() (const __int64 &x, const __int64 &y) const { return x==y; } -} LongKeyEq; + inline bool operator() (const int64_t &x, const int64_t &y) const + { return x == y; } +}; -typedef struct +enum eINSTANCEOF; +struct eINSTANCEOFKeyHash { - int operator() (const eINSTANCEOF &k) const + int operator()(const eINSTANCEOF &k) const { - unsigned int h = (unsigned int)k; + unsigned int h = static_cast(k); h ^= (h >> 20) ^ (h >> 12); - return (int)(h ^ (h >> 7) ^ (h >> 4)); + return static_cast(h ^ (h >> 7) ^ (h >> 4)); } -} eINSTANCEOFKeyHash; +}; -typedef struct +struct eINSTANCEOFKeyEq { - bool operator() (const eINSTANCEOF &x, const eINSTANCEOF &y) const { return x==y; } -} eINSTANCEOFKeyEq; + inline bool operator()(const eINSTANCEOF &x, const eINSTANCEOF &y) const + { return x == y; } +}; 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; + 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) + 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; - } - } - } - } + 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 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)])); + 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) + 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 (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) + 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/Language.cpp b/Minecraft.World/Language.cpp index 73e56a47..2fdc4755 100644 --- a/Minecraft.World/Language.cpp +++ b/Minecraft.World/Language.cpp @@ -14,37 +14,12 @@ Language *Language::getInstance() return singleton; } -/* 4J Jev, creates 2 identical functions. -wstring Language::getElement(const wstring& elementId) -{ - return elementId; -} */ - -wstring Language::getElement(const wstring& elementId, ...) -{ -#ifdef __PSVITA__ // 4J - vita doesn't like having a reference type as the last parameter passed to va_start - we shouldn't need this method anyway - return L""; -#elif _MSC_VER >= 1930 // VS2022+ also disallows va_start with reference types - return elementId; -#else - va_list args; - va_start(args, elementId); - return getElement(elementId, args); -#endif -} - -wstring Language::getElement(const wstring& elementId, va_list args) -{ - // 4J TODO - return elementId; -} - -wstring Language::getElementName(const wstring& elementId) +std::wstring Language::getElementName(const std::wstring& elementId) { return elementId; } -wstring Language::getElementDescription(const wstring& elementId) +std::wstring Language::getElementDescription(const std::wstring& elementId) { return elementId; } \ No newline at end of file diff --git a/Minecraft.World/Language.h b/Minecraft.World/Language.h index 10e2951f..9c7c8524 100644 --- a/Minecraft.World/Language.h +++ b/Minecraft.World/Language.h @@ -1,5 +1,7 @@ #pragma once +#include + class Language { private: @@ -7,8 +9,11 @@ private: public: Language(); static Language *getInstance(); - wstring getElement(const wstring& elementId, ...); - wstring getElement(const wstring& elementId, va_list args); - wstring getElementName(const wstring& elementId); - wstring getElementDescription(const wstring& elementId); + template + inline std::wstring getElement(const std::wstring& elementId, Args...) + { + return elementId; + } + std::wstring getElementName(const std::wstring& elementId); + std::wstring getElementDescription(const std::wstring& elementId); }; \ 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) - { - return; - } - } - - 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 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; - - 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 (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; - - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) + 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; { - for (int zz = z0; !detectedWater && zz < z1; zz++) + 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) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + return; + } + } + + 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 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; + + 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 (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; + + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) + { + for (int zz = z0; !detectedWater && zz < z1; zz++) + { + 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; + yy = y0; + } + } + } + } + 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++) + 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; + 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; - } - } - - 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 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; - - 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 (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; - - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) { - for (int zz = z0; !detectedWater && zz < z1; zz++) + 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) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + return; + } + } + + 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 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; + + 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 (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; + + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) + { + for (int zz = z0; !detectedWater && zz < z1; zz++) + { + 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; + yy = y0; + } + } + } + } + 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++) + 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) * 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 - 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; - } - } - } - } - } + 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) + 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]; - } - return icons[fancyTextureSet][0]; + return icons[fancyTextureSet][JUNGLE_LEAF]; + } + if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF) + { + 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; } - -bool Level::setTile(int x, int y, int z, int tile) +/** +* 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) { - if (setTileNoUpdate(x, y, z, tile)) + return setTileAndData(x, y, z, 0, 0, Tile::UPDATE_ALL); +} + +/** +* 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) +{ + 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 - 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; + // 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)) + 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(float a) +int Level::getMoonPhase() { - return dimension->getMoonPhase(levelData->getTime(), a); + return dimension->getMoonPhase(levelData->getDayTime()); +} + +float Level::getMoonBrightness() +{ + 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; + tileEntity = e; + break; + } + } + LeaveCriticalSection(&m_tileEntityListCS); + } - if (!e->isRemoved() && e->x == x && e->y == y && e->z == z) - { - tileEntity = e; - break; - } - } - LeaveCriticalSection(&m_tileEntityListCS); - } - return tileEntity; - } + if (tileEntity == NULL) + { + LevelChunk *lc = getChunk(x >> 4, z >> 4); + if (lc != NULL) + { + tileEntity = lc->getTileEntity(x & 15, y, z & 15); + } + } - return nullptr; + 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; + 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 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); -} -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; + if (!dimension->hasCeiling) checkLight(LightLayer::Sky, x, y, z, force, false); + checkLight(LightLayer::Block, x, y, z, force, rootOnlyEmissive); } -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( block >= 15 ) return expected; // 4J added as optimisation - - // 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++ ) + 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) { - if( ( b[i] - block ) > expected ) expected = b[i] - block; + return propagatedOnly ? 0 : getEmissionCached(cache, 0, x, y, z); } - return expected; -} + 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 ); + for (int face = 0; face < 6; face++) + { + 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; + + if (brightness > result) result = brightness; + if (result >= MAX_BRIGHTNESS - 1) return result; + } + + 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 ); + // if( cache ) XLockL2(XLOCKL2_INDEX_TITLE, cache, 128 * 1024, XLOCKL2_LOCK_SIZE_1_WAY, 0 ); + + { + int centerCurrent = getBrightnessCached(cache, layer, xc, yc, zc); + int centerExpected = getExpectedLight(cache, xc, yc, zc, layer, false); - { - 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; - - } - -#ifdef __PSVITA__ - // AP - we only need to memset the entire array if we discover something has changed - if( ex != cc && cache ) + 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) + // If rootOnlyEmissive flag is set, then only consider the starting tile to be possibly emissive. + bool propagatedOnly = false; + if (layer == LightLayer::Block) { - 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( 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); } - -bool Level::hasDirectSignal(int x, int y, int z) +int Level::getDirectSignalTo(int x, int y, int z) { - 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; + 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::hasSignal(int x, int y, int z, int dir) +{ + 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::getTime() +__int64 Level::getGameTime() { - return levelData->getTime(); + return levelData->getGameTime(); } +__int64 Level::getDayTime() +{ + 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 height = heightmap[z << 4 | x]; + int y1 = yOld; + int y2 = height; + if (y2 < y1) { - int tmp = y1; - y1 = y2; - y2 = tmp; - } + 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->getTime() != lastSaveTime) return true; - } else { - if (lastSaveHadEntities && level->getTime() >= lastSaveTime + 20 * 30) return true; - } + if ((lastSaveHadEntities && level->getGameTime() != lastSaveTime) || m_unsaved) + { + return true; + } + } + else + { + 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(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(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, &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, &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; } - /* 4J - we don't store this anymore - if (tag->contains(L"Player")) +#ifdef _LARGE_WORLDS + // set the host option, in case it wasn't setup already + EGameHostOptionWorldSize hostOptionworldSize = e_worldSize_Unknown; + switch(m_xzSize) { - loadedPlayerTag = tag->getCompound(L"Player"); - dimension = loadedPlayerTag->getInt(L"Dimension"); - } + 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")) + { + 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; + bStronghold=false; + xStronghold = 0; + yStronghold = 0; + zStronghold = 0; - this->xStrongholdEndPortal = 0; - this->zStrongholdEndPortal = 0; - this->bStrongholdEndPortal = false; + 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; + bStronghold=copy->bStronghold; + xStronghold = copy->xStronghold; + yStronghold = copy->yStronghold; + zStronghold = copy->zStronghold; - this->xStrongholdEndPortal = copy->xStrongholdEndPortal; - this->zStrongholdEndPortal = copy->zStrongholdEndPortal; - this->bStrongholdEndPortal = copy->bStrongholdEndPortal; + 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) { - this->time = time; + gameTime = time; +} + +void LevelData::setDayTime(__int64 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 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 + 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 + +#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; + int data = level->getData(x, y, z); + if ((data & 8) == 0) return Redstone::SIGNAL_NONE; + int myDir = data & 7; - return false; + 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->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) ) - { - if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id); - } + seed = random->nextLong(); + if (!level->isClientSide && level->getGameRules()->getBoolean(GameRules::RULE_DOFIRETICK) && 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) ) + { + 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; + 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; + 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; + 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) + 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) - { - type = dis->readByte(); - int size = dis->readInt(); - list.clear(); - for (int i = 0; i < size; i++) + void load(DataInput *dis, int tagDepth) + { + if (tagDepth > MAX_DEPTH) { - Tag *tag = Tag::newTag(type, L""); - tag->load(dis); - list.push_back(tag); - } +#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++) + { + 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); +// 4J - Don't want +/* +void appendHoverText(ItemInstance itemInstance, Player player, List lines, boolean advanced) { + MapItemSavedData data = getSavedData(itemInstance, player.level); - 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; + 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..981bab3e 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 @@ -564,7 +596,14 @@ void MapItemSavedData::mergeInMapData(shared_ptr dataToAdd) void MapItemSavedData::removeItemFrameDecoration(shared_ptr item) { - AUTO_VAR(frameDecoration, nonPlayerDecorations.find( item->getFrame()->entityId ) ); + if ( !item ) + return; + + std::shared_ptr frame = item->getFrame(); + if ( !frame ) + return; + + auto frameDecoration = nonPlayerDecorations.find(frame->entityId); if ( frameDecoration != nonPlayerDecorations.end() ) { delete frameDecoration->second; 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..7ceb4745 100644 --- a/Minecraft.World/MerchantContainer.cpp +++ b/Minecraft.World/MerchantContainer.cpp @@ -90,12 +90,22 @@ void MerchantContainer::setItem(unsigned int slot, shared_ptr item } } -int MerchantContainer::getName() +wstring MerchantContainer::getName() { return merchant->getDisplayName(); } -int MerchantContainer::getMaxStackSize() +wstring MerchantContainer::getCustomName() +{ + return L""; +} + +bool MerchantContainer::hasCustomName() +{ + return false; +} + +int MerchantContainer::getMaxStackSize() const { 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..e2e63970 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(); - int getMaxStackSize(); + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); + int getMaxStackSize() const; 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}, {+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}, {+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,294 +308,23 @@ 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) + if (tile == Tile::activatorRail_Id) { - powerTrack = (data & RailTile::RAIL_DATA_BIT) != 0; - haltTrack = !powerTrack; + activateMinecart(xt, yt, zt, (data & BaseRailTile::RAIL_DATA_BIT) != 0); } - if (((RailTile *) Tile::tiles[tile])->isUsesDataBit()) - { - data &= RailTile::RAIL_DIRECTION_MASK; - } - - if (data >= 2 && data <= 5) - { - y = yt + 1; - } - - 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; - } - - double pow = sqrt(xd * xd + zd * zd); - - 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 (riderDist > 0.0001 && ownDist < 0.01) - { - xd += sharedRider->xd * 0.1; - zd += sharedRider->zd * 0.1; - - haltTrack = false; - } - } - - // on golden rails without power, stop the cart - if (haltTrack) - { - double speedLength = sqrt(xd * xd + zd * zd); - if (speedLength < 0.03) - { - xd *= 0; - yd *= 0; - zd *= 0; - } - else - { - xd *= 0.5f; - yd *= 0; - zd *= 0.5f; - } - } - - 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 < -max) xdd = -max; - if (xdd > +max) xdd = +max; - if (zdd < -max) zdd = -max; - if (zdd > +max) zdd = +max; - 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); - } - else - { - } - - 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; - - } - - 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) - { - xd = xd / pow * (pow + speed); - zd = zd / pow * (pow + speed); - } - setPos(x, newPos->y, z); - } - - int xn = Mth::floor(x); - int zn = Mth::floor(z); - if (xn != xt || zn != zt) - { - pow = sqrt(xd * xd + zd * zd); - - xd = pow * (xn - xt); - zd = pow * (zn - zt); - } - - 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 (xPush * xd + zPush * zd < 0) - { - xPush = 0; - zPush = 0; - } - else - { - xPush = xd; - zPush = zd; - } - } - } - - // if on golden rail with power, increase speed - if (powerTrack) - { - 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; - } - } - } - } - - checkInsideTiles(); } 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; - } + comeOffTrack(max); } + checkInsideTiles(); + xRot = 0; double xDiff = xo - x; double zDiff = zo - z; @@ -667,25 +343,22 @@ void Minecart::tick() } setRot(yRot, xRot); - // if (!level->isClientSide) { + vector > *entities = level->getEntities(shared_from_this(), bb->grow(0.2f, 0, 0.2f)); + if (entities != NULL && !entities->empty()) { - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); - if (entities != NULL && !entities->empty()) + AUTO_VAR(itEnd, entities->end()); + for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - 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)) { - 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()); + 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; - } + // 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; } } } @@ -701,16 +374,264 @@ void Minecart::tick() rider = weak_ptr(); } } + } +} - if (fuel > 0) +void Minecart::activateMinecart(int xt, int yt, int zt, bool state) +{ +} + +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 (!onGround) + { + xd *= 0.95f; + yd *= 0.95f; + zd *= 0.95f; + } +} + +void Minecart::moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data) +{ + fallDistance = 0; + + Vec3 *oldPos = getPos(x, y, z); + y = yt; + + 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; + } + + if (data >= 2 && data <= 5) + { + y = yt + 1; + } + + if (data == 2) xd -= slideSpeed; + if (data == 3) xd += slideSpeed; + if (data == 4) zd += slideSpeed; + if (data == 5) zd -= slideSpeed; + + int exits[2][3]; + memcpy( exits, EXITS[data], sizeof(int) * 2 * 3); + + 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; + } + + double pow = sqrt(xd * xd + zd * zd); + if (pow > 2) + { + pow = 2; + } + + xd = pow * xD / dd; + zd = pow * zD / dd; + + + if ( rider.lock() != NULL && rider.lock()->instanceof(eTYPE_LIVINGENTITY) ) + { + shared_ptr living = dynamic_pointer_cast(rider.lock()); + + double forward = living->yya; + + if (forward > 0) { - fuel--; + double riderXd = -sin(living->yRot * PI / 180); + double riderZd = cos(living->yRot * PI / 180); + + double ownDist = xd * xd + zd * zd; + + if (ownDist < 0.01) + { + xd += riderXd * 0.1; + zd += riderZd * 0.1; + + haltTrack = false; + } } - if (fuel <= 0) + } + + // on golden rails without power, stop the cart + if (haltTrack) + { + double speedLength = sqrt(xd * xd + zd * zd); + if (speedLength < .03) { - xPush = zPush = 0; + xd *= 0; + yd *= 0; + zd *= 0; } - setHasFuel(fuel > 0); + else + { + xd *= 0.5f; + yd *= 0; + zd *= 0.5f; + } + } + + 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) + { + xd = xd / pow * (pow + speed); + zd = zd / pow * (pow + speed); + } + setPos(x, newPos->y, z); + } + + int xn = Mth::floor(x); + int zn = Mth::floor(z); + if (xn != xt || zn != zt) + { + pow = sqrt(xd * xd + zd * zd); + + 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) + { + double speed = 0.06; + xd += xd / speedLength * speed; + zd += zd / speedLength * speed; + } + else + { + // if the minecart is standing still, accelerate it away from + // potential walls + if (data == BaseRailTile::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 == BaseRailTile::DIR_FLAT_Z) + { + if (level->isSolidBlockingTile(xt, yt, zt - 1)) + { + zd = .02; + } + else if (level->isSolidBlockingTile(xt, yt, zt + 1)) + { + zd = -.02; + } + } + } + } +} + +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) + if (hasCustomDisplay()) { - xPush = base->getDouble(L"PushX"); - zPush = base->getDouble(L"PushZ"); - fuel = base->getShort(L"Fuel"); + tag->putBoolean(L"CustomDisplayTile", true); + tag->putInt(L"DisplayTile", getDisplayTile() == NULL ? 0 : getDisplayTile()->id); + tag->putInt(L"DisplayData", getDisplayData()); + tag->putInt(L"DisplayOffset", getDisplayOffset()); } - else if (type == Minecart::CHEST) - { - 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) ); - } - } -} + 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,122 +897,12 @@ 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() -{ - return 9 * 3; -} - -shared_ptr Minecart::getItem(unsigned int slot) -{ - return (*items)[slot]; -} - -shared_ptr Minecart::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 Minecart::removeItemNoUpdate(int slot) -{ - if ( (*items)[slot] != NULL) - { - shared_ptr item = (*items)[slot]; - (*items)[slot] = nullptr; - return item; - } - return nullptr; -} - -void Minecart::setItem(unsigned int slot, shared_ptr item) -{ - (*items)[slot] = item; - if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); -} - -int Minecart::getName() -{ - return IDS_ITEM_MINECART; -} - -int Minecart::getMaxStackSize() -{ - return Container::LARGE_MAX_STACK_SIZE; -} - -void Minecart::setChanged() -{ -} - -bool Minecart::interact(shared_ptr player) -{ - 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; -} - -float Minecart::getLootContent() -{ - int count = 0; - for (unsigned int i = 0; i < items->length; i++) - { - if ( (*items)[i] != NULL) count++; - } - return count / (float) items->length; -} - - void Minecart::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { lx = x; @@ -1132,9 +913,9 @@ void Minecart::lerpTo(double x, double y, double z, float yRot, float xRot, int lSteps = steps + 2; - this->xd = lxd; - this->yd = lyd; - this->zd = lzd; + xd = lxd; + yd = lyd; + zd = lzd; } void Minecart::lerpMotion(double xd, double yd, double zd) @@ -1144,50 +925,14 @@ void Minecart::lerpMotion(double xd, double yd, double zd) lzd = this->zd = zd; } -bool Minecart::stillValid(shared_ptr player) -{ - if (this->removed) return false; - if (player->distanceToSqr(shared_from_this()) > 8 * 8) return false; - return true; -} - -bool Minecart::hasFuel() -{ - return (entityData->getByte(DATA_ID_FUEL) & 1) != 0; -} - -void Minecart::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)); - } -} - -void Minecart::startOpen() -{ - // TODO Auto-generated method stub - -} - -void Minecart::stopOpen() -{ - // TODO Auto-generated method stub - -} - -void Minecart::setDamage(int damage) +void Minecart::setDamage(float damage) { entityData->set(DATA_ID_DAMAGE, damage); } -int Minecart::getDamage() +float Minecart::getDamage() { - return entityData->getInteger(DATA_ID_DAMAGE); + return entityData->getFloat(DATA_ID_DAMAGE); } void Minecart::setHurtTime(int hurtTime) @@ -1208,4 +953,90 @@ void Minecart::setHurtDir(int hurtDir) int Minecart::getHurtDir() { return entityData->getInteger(DATA_ID_HURTDIR); +} + +Tile *Minecart::getDisplayTile() +{ + 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; +} + +Tile *Minecart::getDefaultDisplayTile() +{ + return NULL; +} + +int Minecart::getDisplayData() +{ + if (!hasCustomDisplay()) return getDefaultDisplayData(); + return getEntityData()->getInteger(DATA_ID_DISPLAY_TILE) >> 16; +} + +int Minecart::getDefaultDisplayData() +{ + return 0; +} + +int Minecart::getDisplayOffset() +{ + if (!hasCustomDisplay()) return getDefaultDisplayOffset(); + return getEntityData()->getInteger(DATA_ID_DISPLAY_OFFSET); +} + +int Minecart::getDefaultDisplayOffset() +{ + return 6; +} + +void Minecart::setDisplayTile(int id) +{ + getEntityData()->set(DATA_ID_DISPLAY_TILE, (id & 0xFFFF) | (getDisplayData() << 16)); + setCustomDisplay(true); +} + +void Minecart::setDisplayData(int data) +{ + Tile *tile = getDisplayTile(); + int id = tile == NULL ? 0 : tile->id; + + getEntityData()->set(DATA_ID_DISPLAY_TILE, (id & 0xFFFF) | (data << 16)); + setCustomDisplay(true); +} + +void Minecart::setDisplayOffset(int offset) +{ + getEntityData()->set(DATA_ID_DISPLAY_OFFSET, offset); + setCustomDisplay(true); +} + +bool Minecart::hasCustomDisplay() +{ + return getEntityData()->getByte(DATA_ID_CUSTOM_DISPLAY) == 1; +} + +void Minecart::setCustomDisplay(bool value) +{ + getEntityData()->set(DATA_ID_CUSTOM_DISPLAY, (byte) (value ? 1 : 0)); +} + +void Minecart::setCustomName(const wstring &name) +{ + this->name = name; +} + +wstring Minecart::getAName() +{ + if (!name.empty()) return name; + return Entity::getAName(); +} + +bool Minecart::hasCustomName() +{ + return !name.empty(); +} + +wstring Minecart::getCustomName() +{ + 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); + virtual void setDamage(float damage); + virtual float getDamage(); + virtual void setHurtTime(int hurtTime); + virtual int getHurtTime(); + virtual void setHurtDir(int hurtDir); + virtual int getHurtDir(); -public: - virtual void startOpen(); - virtual void stopOpen(); + virtual int getType() = 0; - void setDamage(int damage); - int getDamage(); - void setHurtTime(int hurtTime); - int getHurtTime(); - void setHurtDir(int hurtDir); - int getHurtDir(); + 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..20bfc4ea --- /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() const +{ + 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..c7bb7298 --- /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() const; + 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..54c97b38 --- /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() const { 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..7ab7c4ce 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -1,6 +1,10 @@  + + ContentPackage_NO_TU + ARM64EC + ContentPackage_NO_TU Durango @@ -17,6 +21,10 @@ ContentPackage_NO_TU PSVita + + ContentPackage_NO_TU + Win32 + ContentPackage_NO_TU x64 @@ -25,6 +33,10 @@ ContentPackage_NO_TU Xbox 360 + + CONTENTPACKAGE_SYMBOLS + ARM64EC + CONTENTPACKAGE_SYMBOLS Durango @@ -41,6 +53,10 @@ CONTENTPACKAGE_SYMBOLS PSVita + + CONTENTPACKAGE_SYMBOLS + Win32 + CONTENTPACKAGE_SYMBOLS x64 @@ -49,6 +65,10 @@ CONTENTPACKAGE_SYMBOLS Xbox 360 + + ContentPackage_Vita + ARM64EC + ContentPackage_Vita Durango @@ -65,6 +85,10 @@ ContentPackage_Vita PSVita + + ContentPackage_Vita + Win32 + ContentPackage_Vita x64 @@ -73,6 +97,10 @@ ContentPackage_Vita Xbox 360 + + ContentPackage + ARM64EC + ContentPackage Durango @@ -89,6 +117,10 @@ ContentPackage PSVita + + ContentPackage + Win32 + ContentPackage x64 @@ -97,6 +129,10 @@ ContentPackage Xbox 360 + + Debug + ARM64EC + Debug Durango @@ -113,6 +149,10 @@ Debug PSVita + + Debug + Win32 + Debug x64 @@ -121,6 +161,10 @@ Debug Xbox 360 + + ReleaseForArt + ARM64EC + ReleaseForArt Durango @@ -137,6 +181,10 @@ ReleaseForArt PSVita + + ReleaseForArt + Win32 + ReleaseForArt x64 @@ -145,6 +193,10 @@ ReleaseForArt Xbox 360 + + Release + ARM64EC + Release Durango @@ -161,6 +213,10 @@ Release PSVita + + Release + Win32 + Release x64 @@ -179,7 +235,6 @@ SAK SAK title - 10.0 @@ -232,7 +287,16 @@ StaticLibrary MultiByte v143 - 10.0 + + + StaticLibrary + MultiByte + v143 + + + StaticLibrary + MultiByte + v143 StaticLibrary @@ -243,13 +307,33 @@ StaticLibrary MultiByte v143 - 10.0 + true + + + StaticLibrary + MultiByte + v143 + + + StaticLibrary + MultiByte + v143 StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + + + StaticLibrary + MultiByte + v143 + StaticLibrary Unicode @@ -323,21 +407,61 @@ MultiByte v143 + + StaticLibrary + MultiByte + v143 + + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + 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 +485,7 @@ StaticLibrary MultiByte - v110 + v143 Clang @@ -424,15 +548,33 @@ + + + + + + + + + + + + + + + + + + @@ -478,15 +620,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -518,7 +684,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 +696,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 +708,18 @@ $(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) @@ -558,12 +736,36 @@ $(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)\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 +804,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 +835,68 @@ $(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)\$(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)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -995,6 +1241,51 @@ + + 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 + /FS %(AdditionalOptions) + + + 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 Level3 @@ -1026,7 +1317,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 @@ -1045,6 +1336,56 @@ + + Use + TurnOffAllWarnings + ProgramDatabase + MaxSpeed + 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 + true + true + /FS /Ob3 %(AdditionalOptions) + + + 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 Level3 @@ -1090,6 +1431,52 @@ 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 + 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 +1801,7 @@ true Level2 Branchless2 + Cpp11 true @@ -1494,6 +1882,52 @@ 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 + 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 +1951,52 @@ 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 + 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 +2020,52 @@ 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 + 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 +2089,52 @@ 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 + 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 +2342,9 @@ Document + + @@ -1780,6 +2354,7 @@ + @@ -1795,7 +2370,9 @@ + + @@ -1805,20 +2382,32 @@ - + + + + + + + + + + + + + @@ -1832,6 +2421,8 @@ + + @@ -1839,7 +2430,47 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1878,6 +2509,8 @@ + + @@ -1887,50 +2520,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 +2527,8 @@ + + @@ -1945,6 +2536,7 @@ + @@ -1978,8 +2570,11 @@ true true true + true + true + @@ -2001,9 +2596,12 @@ + + + @@ -2013,7 +2611,9 @@ + + @@ -2025,6 +2625,7 @@ + @@ -2040,7 +2641,12 @@ + + + + + @@ -2055,13 +2661,37 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -2069,6 +2699,7 @@ + @@ -2076,6 +2707,7 @@ + @@ -2084,72 +2716,107 @@ - + + - - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2162,6 +2829,8 @@ false + + @@ -2172,14 +2841,12 @@ - - @@ -2260,8 +2927,7 @@ - - + @@ -2330,7 +2996,7 @@ - + @@ -2386,9 +3052,9 @@ - + - + @@ -2457,7 +3123,7 @@ - + @@ -2477,7 +3143,7 @@ - + @@ -2542,16 +3208,73 @@ - + - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 +3307,7 @@ - + @@ -2614,7 +3337,6 @@ - @@ -2669,7 +3391,6 @@ - @@ -2709,6 +3430,7 @@ + @@ -2723,7 +3445,9 @@ + + @@ -2732,17 +3456,27 @@ - + + + + + + + + + + + @@ -2759,14 +3493,50 @@ + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2801,9 +3571,15 @@ false + false + false false false + false + false false + false + false false false @@ -2817,12 +3593,37 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2837,51 +3638,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 +3651,10 @@ + + + true true @@ -2926,21 +3685,54 @@ true true true + true + true true + true + true true + true + true true + true + true true + true + true true + true + true true + true + true + + + + + + + + + + + + + + + + + + + @@ -3044,7 +3836,7 @@ - + @@ -3057,7 +3849,7 @@ - + @@ -3066,8 +3858,8 @@ - - + + @@ -3086,7 +3878,7 @@ - + @@ -3111,6 +3903,7 @@ + @@ -3118,6 +3911,9 @@ + + + false @@ -3139,13 +3935,11 @@ - - @@ -3180,7 +3974,7 @@ - + @@ -3235,9 +4029,9 @@ - + - + @@ -3276,9 +4070,15 @@ false + false + false false false + false + false false + false + false false false @@ -3290,7 +4090,7 @@ - + @@ -3320,9 +4120,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3338,9 +4146,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3365,9 +4179,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3383,9 +4205,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3410,9 +4238,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3428,9 +4264,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3464,7 +4306,7 @@ - + @@ -3481,9 +4323,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3499,9 +4349,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3550,14 +4406,71 @@ - + - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 +4506,7 @@ - + @@ -3606,9 +4519,15 @@ false + false + false false false + false + false false + false + false false false @@ -3628,9 +4547,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3646,9 +4571,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3675,7 +4608,6 @@ - @@ -3692,9 +4624,15 @@ Create Create Create + Create + Create Create Create + Create + Create Create + Create + Create Create Create Create @@ -3710,18 +4648,32 @@ Create Create Create + Create + Create Create + Create + Create Create + Create + Create Create + Create + Create Create Create Create Create Create false + false + false false false + false + false false + false + false false false Create @@ -3796,7 +4748,6 @@ - @@ -3837,9 +4788,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3855,9 +4814,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3882,9 +4847,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3900,9 +4873,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3927,9 +4906,17 @@ true true true + true + true true + true + true true + true + true true + true + true true true true @@ -3945,9 +4932,15 @@ true true true + true + true true true + true + true true + true + true true true true @@ -3960,10 +4953,9 @@ - - + - \ No newline at end of file + 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,30 +144,6 @@ {c87ae9ac-b823-48e4-b007-39d45aff76e6} - - {bd03576a-c1b3-4c04-bc52-d67abed85da4} - - - {1bcefe01-a252-4ec6-8dab-7fcebbefda00} - - - {83228256-d4e1-447b-8102-4f824d131ff0} - - - {5c2a5df8-8116-4e7e-ae85-c688843e36bc} - - - {569feaf7-5d52-44fc-883d-87c10196ea2f} - - - {c554494b-5cc6-4251-8d1f-c70afdb4ba2d} - - - {fe68c974-acb2-44f5-b82b-2c4057194780} - - - {19721528-fc70-4673-8183-d9329e751555} - {e61b6eae-3e06-4649-86f6-ab1a6624833f} @@ -210,6 +156,84 @@ {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} + + + {1bcefe01-a252-4ec6-8dab-7fcebbefda00} + + + {83228256-d4e1-447b-8102-4f824d131ff0} + + + {569feaf7-5d52-44fc-883d-87c10196ea2f} + + + {5c2a5df8-8116-4e7e-ae85-c688843e36bc} + + + {c554494b-5cc6-4251-8d1f-c70afdb4ba2d} + + + {fe68c974-acb2-44f5-b82b-2c4057194780} + + + {19721528-fc70-4673-8183-d9329e751555} + + + {ef8aa915-dc0f-44c6-8533-1250c461b636} + + + {be58a6fd-f674-4c0d-b7e9-94dc4bab4cae} + + + {d5c9e9a6-4945-40d7-8b19-f9c53ac83815} + + + {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,15 +2729,474 @@ ConsoleHelpers\ConsoleSaveFileIO - - ConsoleHelpers\ConsoleSaveFileIO - ConsoleHelpers\ConsoleSaveFileIO ConsoleHelpers + + 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 + @@ -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 @@ -3066,12 +3478,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - - - net\minecraft\world\level\tile - 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()) - { - hurt(DamageSource::inWall, 1); - } - - if (isFireImmune() || level->isClientSide) clearFire(); - - if (isAlive() && isUnderLiquid(Material::water) && !isWaterMob() && activeEffects.find(MobEffect::waterBreathing->id) == activeEffects.end()) - { - 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(); - } - else - { - setAirSupply(TOTAL_AIR_SUPPLY); - } - - oTilt = tilt; - - if (attackTime > 0) attackTime--; - if (hurtTime > 0) hurtTime--; - if (invulnerableTime > 0) invulnerableTime--; - if (health <= 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 != 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; -} + if (xpReward > 0) + { + int result = xpReward; -bool Mob::isAlwaysExperienceDropper() -{ - return false; -} + ItemInstanceArray slots = getEquipmentSlots(); + for (int i = 0; i < slots.length; i++) + { + if (slots[i] != NULL && dropChances[i] <= 1) + { + result += 1 + random->nextInt(3); + } + } + return result; + } + else + { + return xpReward; + } +} void Mob::spawnAnim() { for (int i = 0; i < 20; i++) @@ -498,325 +222,27 @@ 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(); + LivingEntity::tick(); - if (arrowCount > 0) + if (!level->isClientSide) { - if (removeArrowTime <= 0) - { - removeArrowTime = 20 * 3; - } - removeArrowTime--; - if (removeArrowTime <= 0) - { - arrowCount--; - } + tickLeash(); } +} - 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) - { - // animStep = 0; - } - else - { - 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; - - /* - * 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; - } + return LivingEntity::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; -} - -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(); - } -} - -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() @@ -824,82 +250,9 @@ int Mob::getAmbientSound() return -1; } -int Mob::getHurtSound() +int Mob::getDeathLoot() { - 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) -{ - + return 0; } void Mob::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) @@ -917,268 +270,85 @@ 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); + LivingEntity::addAdditonalSaveData(entityTag); + entityTag->putBoolean(L"CanPickUpLoot", canPickUpLoot()); + entityTag->putBoolean(L"PersistenceRequired", persistenceRequired); - if (!activeEffects.empty()) + ListTag *gear = new ListTag(); + for (int i = 0; i < equipment.length; i++) { - ListTag *listTag = new ListTag(); + CompoundTag *tag = new CompoundTag(); + if (equipment[i] != NULL) equipment[i]->save(tag); + gear->add(tag); + } + entityTag->put(L"Equipment", gear); - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) + ListTag *dropChanceList = new ListTag(); + for (int i = 0; i < dropChances.length; i++) + { + dropChanceList->add(new FloatTag( _toString(i), dropChances[i])); + } + entityTag->put(L"DropChances", dropChanceList); + entityTag->putString(L"CustomName", getCustomName()); + entityTag->putBoolean(L"CustomNameVisible", isCustomNameVisible()); + + // leash info + entityTag->putBoolean(L"Leashed", _isLeashed); + if (leashHolder != NULL) + { + CompoundTag *leashTag = new CompoundTag(L"Leash"); + if ( leashHolder->instanceof(eTYPE_LIVINGENTITY) ) { - 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); + // a walking, talking, leash holder + leashTag->putString(L"UUID", leashHolder->getUUID()); } - entityTag->put(L"ActiveEffects", listTag); + else if ( leashHolder->instanceof(eTYPE_HANGING_ENTITY) ) + { + // 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); } } 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"); + LivingEntity::readAdditionalSaveData(tag); - if (tag->contains(L"ActiveEffects")) + 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")); + + if (tag->contains(L"Equipment")) { - 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"); + ListTag *gear = (ListTag *) tag->getList(L"Equipment"); - activeEffects.insert( unordered_map::value_type( id, new MobEffectInstance(id, duration, amplifier) ) ); + for (int i = 0; i < equipment.length; i++) + { + equipment[i] = ItemInstance::fromTag(gear->get(i)); } } -} -bool Mob::isAlive() -{ - return !removed && health > 0; -} + if (tag->contains(L"DropChances")) + { + ListTag *items = (ListTag *) tag->getList(L"DropChances"); + for (int i = 0; i < items->size(); i++) + { + dropChances[i] = items->get(i)->data; + } + } -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]); + _isLeashed = tag->getBoolean(L"Leashed"); + if (_isLeashed && tag->contains(L"Leash")) + { + leashInfoTag = (CompoundTag *)tag->getCompound(L"Leash")->copy(); + } } void Mob::setYya(float yya) @@ -1186,123 +356,99 @@ void Mob::setYya(float yya) this->yya = yya; } -void Mob::setJumping(bool jump) +void Mob::setSpeed(float speed) { - jumping = jump; + LivingEntity::setSpeed(speed); + setYya(speed); } void Mob::aiStep() { - if (noJumpDelay > 0) noJumpDelay--; - if (lSteps > 0) + LivingEntity::aiStep(); + + if (!level->isClientSide && canPickUpLoot() && !dead && level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) { - 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) + vector > *entities = level->getEntitiesOfClass(typeid(ItemEntity), bb->grow(1, 0, 1)); + for (AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - 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; - } + shared_ptr entity = dynamic_pointer_cast(*it); + if (entity->removed || entity->getItem() == NULL) continue; + shared_ptr item = entity->getItem(); + int slot = getEquipmentSlotForItem(item); - 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 (slot > -1) + { + bool replace = true; + shared_ptr current = getCarried(slot); - 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; - - float normalSpeed = walkingSpeed; - walkingSpeed *= getWalkingSpeedModifier(); - travel(xxa, yya); - walkingSpeed = normalSpeed; - - if(!level->isClientSide) - { - 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()); + 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; } } @@ -1311,38 +457,6 @@ bool Mob::useNewAi() return false; } -bool Mob::isEffectiveAI() -{ - return !level->isClientSide; -} - -bool Mob::isImmobile() -{ - return health <= 0; -} - -bool Mob::isBlocking() -{ - return false; -} - -void Mob::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; -} - bool Mob::removeWhenFarAway() { return true; @@ -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,78 +651,411 @@ 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::getCarriedItem() +{ + return equipment[SLOT_WEAPON]; +} + +shared_ptr Mob::getCarried(int slot) +{ + return equipment[slot]; } shared_ptr Mob::getArmor(int pos) { - // 4J Stu - Not implemented yet - return nullptr; - //return equipment[pos + 1]; + return equipment[pos + 1]; } -void Mob::handleEntityEvent(byte id) +void Mob::setEquippedSlot(int slot, shared_ptr item) { - if (id == EntityEvent::HURT) - { - this->walkAnimSpeed = 1.5f; + equipment[slot] = item; +} - invulnerableTime = invulnerableDuration; - hurtTime = hurtDuration = 10; - hurtDir = 0; +ItemInstanceArray Mob::getEquipmentSlots() +{ + return equipment; +} - 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) +void Mob::dropEquipment(bool byPlayer, int playerBonusLevel) +{ + for (int slot = 0; slot < getEquipmentSlots().length; slot++) { - 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); + shared_ptr item = getCarried(slot); + bool preserve = dropChances[slot] > 1; + + if (item != NULL && (byPlayer || preserve) && random->nextFloat() - playerBonusLevel * 0.01f < dropChances[slot]) + { + if (!preserve && item->isDamageableItem()) + { + 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); + } + spawnAtLocation(item, 0); } - MemSect(0); - health = 0; - die(DamageSource::genericSource); - } - else - { - Entity::handleEntityEvent(id); } } -bool Mob::isSleeping() +void Mob::populateDefaultEquipmentSlots() +{ + if (random->nextFloat() < MAX_WEARING_ARMOR_CHANCE * level->getDifficulty(x, y, z)) + { + 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--) + { + shared_ptr item = getArmor(i); + if (i < 3 && random->nextFloat() < partialChance) break; + if (item == NULL) + { + Item *equip = getEquipmentForSlot(i + 1, armorType); + if (equip != NULL) setEquippedSlot(i + 1, shared_ptr(new ItemInstance(equip))); + } + } + } +} + +int Mob::getEquipmentSlotForItem(shared_ptr item) +{ + if (item->id == Tile::pumpkin_Id || item->id == Item::skull_Id) + { + return SLOT_HELM; + } + + 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; +} + +Item *Mob::getEquipmentForSlot(int slot, int type) +{ + switch (slot) + { + 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; + } + + 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) + { + EnchantmentHelper::enchantItem(random, item, (int) (5 + difficulty * random->nextInt(18))); + } + } +} + +/** +* 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 +{ + // 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)); + + return groupData; +} + +void Mob::finalizeSpawnEggSpawn(int extraData) +{ +} + +bool Mob::canBeControlledByRider() { return false; } -Icon *Mob::getItemInHandIcon(shared_ptr item, int layer) +wstring Mob::getAName() { - return item->getIcon(); + if (hasCustomName()) return getCustomName(); + return LivingEntity::getAName(); +} + +void Mob::setPersistenceRequired() +{ + persistenceRequired = true; +} + +void Mob::setCustomName(const wstring &name) +{ + entityData->set(DATA_CUSTOM_NAME, name); +} + +wstring Mob::getCustomName() +{ + return entityData->getString(DATA_CUSTOM_NAME); +} + +bool Mob::hasCustomName() +{ + return entityData->getString(DATA_CUSTOM_NAME).length() > 0; +} + +void Mob::setCustomNameVisible(bool visible) +{ + entityData->set(DATA_CUSTOM_NAME_VISIBLE, visible ? (byte) 1 : (byte) 0); +} + +bool Mob::isCustomNameVisible() +{ + return entityData->getByte(DATA_CUSTOM_NAME_VISIBLE) == 1; +} + +bool Mob::shouldShowName() +{ + return isCustomNameVisible(); +} + +void Mob::setDropChance(int slot, float pct) +{ + dropChances[slot] = pct; +} + +bool Mob::canPickUpLoot() +{ + return _canPickUpLoot; +} + +void Mob::setCanPickUpLoot(bool canPickUpLoot) +{ + _canPickUpLoot = canPickUpLoot; +} + +bool Mob::isPersistenceRequired() +{ + return persistenceRequired; +} + +bool Mob::interact(shared_ptr player) +{ + + if (isLeashed() && getLeashHolder() == player) + { + dropLeash(true, !player->abilities.instabuild); + return true; + } + + shared_ptr itemstack = player->inventory->getSelected(); + if (itemstack != 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) + { + 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; + } + } + } + } + + if (mobInteract(player)) + { + return true; + } + + return LivingEntity::interact(player); +} + +bool Mob::mobInteract(shared_ptr player) +{ + return false; +} + +void Mob::tickLeash() +{ + if (leashInfoTag != NULL) + { + restoreLeashFromSave(); + } + if (!_isLeashed) + { + return; + } + + if (leashHolder == NULL || leashHolder->removed) + { + dropLeash(true, true); + return; + } +} + +void Mob::dropLeash(bool synch, bool createItemDrop) +{ + if (_isLeashed) + { + _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))); + } + } +} + +bool Mob::canBeLeashed() +{ + return !isLeashed() && !shared_from_this()->instanceof(eTYPE_ENEMY); +} + +bool Mob::isLeashed() +{ + return _isLeashed; +} + +shared_ptr Mob::getLeashHolder() +{ + return leashHolder; +} + +void Mob::setLeashedTo(shared_ptr holder, bool synch) +{ + _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))); + } +} + +void Mob::restoreLeashFromSave() +{ + // after being added to the world, attempt to recreate leash bond + if (_isLeashed && leashInfoTag != NULL) + { + 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; } // 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. @@ -1650,294 +1068,10 @@ bool Mob::shouldRender(Vec3 *c) return Entity::shouldRender(c); } -void Mob::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; - } - } - if(!removed) - { - ++it; - } - } - if (effectsDirty) - { - if (!level->isClientSide) - { - if (activeEffects.empty()) - { - entityData->set(DATA_EFFECT_COLOR_ID, (int) 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); - values.clear(); - entityData->set(DATA_EFFECT_COLOR_ID, colorValue); - setInvisible(hasEffect(MobEffect::invisibility->id)); - setWeakened(hasEffect(MobEffect::weakness->id)); - } - } - effectsDirty = false; - } - if (random->nextBoolean()) - { - 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(eParticleType_mobSpell, x + (random->nextDouble() - 0.5) * bbWidth, y + random->nextDouble() * bbHeight - heightOffset, z + (random->nextDouble() - 0.5) * bbWidth, red, green, blue); - } - } -} - -void Mob::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 *Mob::getActiveEffects() -{ - vector *active = new vector(); - - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) - { - active->push_back(it->second); - } - - return active; -} - -bool Mob::hasEffect(int id) -{ - return activeEffects.find(id) != activeEffects.end();; -} - -bool Mob::hasEffect(MobEffect *effect) -{ - return activeEffects.find(effect->id) != activeEffects.end(); -} - -MobEffectInstance *Mob::getEffect(MobEffect *effect) -{ - MobEffectInstance *effectInst = NULL; - - AUTO_VAR(it, activeEffects.find(effect->id)); - if(it != activeEffects.end() ) effectInst = it->second; - - return effectInst; -} - -void Mob::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); - } - else - { - activeEffects.insert( unordered_map::value_type( newEffect->getId(), newEffect ) ); - onEffectAdded(newEffect); - } -} - -// 4J Added -void Mob::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 Mob::canBeAffected(MobEffectInstance *newEffect) -{ - if (getMobType() == UNDEAD) - { - int id = newEffect->getId(); - if (id == MobEffect::regeneration->id || id == MobEffect::poison->id) - { - return false; - } - } - - return true; -} - -bool Mob::isInvertedHealAndHarm() -{ - return getMobType() == UNDEAD; -} - -void Mob::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 Mob::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 Mob::onEffectAdded(MobEffectInstance *effect) -{ - effectsDirty = true; -} - -void Mob::onEffectUpdated(MobEffectInstance *effect) -{ - effectsDirty = true; -} - -void Mob::onEffectRemoved(MobEffectInstance *effect) -{ - effectsDirty = true; -} - -float Mob::getWalkingSpeedModifier() -{ - float speed = 1.0f; - if (hasEffect(MobEffect::movementSpeed)) - { - speed *= 1.0f + .2f * (getEffect(MobEffect::movementSpeed)->getAmplifier() + 1); - } - if (hasEffect(MobEffect::movementSlowdown)) - { - speed *= 1.0f - .15f * (getEffect(MobEffect::movementSlowdown)->getAmplifier() + 1); - } - return speed; -} - -void Mob::teleportTo(double x, double y, double z) -{ - moveTo(x, y, z, yRot, xRot); -} - -bool Mob::isBaby() -{ - return false; -} - -MobType Mob::getMobType() -{ - return UNDEFINED; -} - -void Mob::breakItem(shared_ptr itemInstance) -{ - level->playSound(shared_from_this(), 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); - } -} - -bool Mob::isInvulnerable() -{ - // 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; -} - void Mob::setLevel(Level *level) { Entity::setLevel(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 void setEquippedSlot(int slot, shared_ptr item); + virtual ItemInstanceArray getEquipmentSlots(); + +protected: + virtual void dropEquipment(bool byPlayer, int playerBonusLevel); + virtual void populateDefaultEquipmentSlots(); + +public: + static int getEquipmentSlotForItem(shared_ptr item); + static Item *getEquipmentForSlot(int slot, int type); + +protected: + virtual void populateDefaultEquipmentEnchantments(); + +public: + /** + * 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); + +protected: + virtual bool mobInteract(shared_ptr player); + + // roper / leash methods + +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); -protected: - void tickEffects(); 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); - -protected: - virtual void onEffectAdded(MobEffectInstance *effect); - virtual void onEffectUpdated(MobEffectInstance *effect); - virtual void onEffectRemoved(MobEffectInstance *effect); - -public: - virtual float getWalkingSpeedModifier(); - - // 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); - - virtual bool isInvulnerable(); - - virtual void finalizeMobSpawn(); - virtual bool canBeControlledByRider(); // 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; + 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; + 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 this->id == obj->id && this->amplifier == obj->amplifier && this->duration == obj->duration; + 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 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,172 +428,8 @@ 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) { // 4J - not for our version. Creates a few too many mobs. @@ -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); - - 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; - - entity->load(data); - } + return m_parent->z; } -void MobSpawnerTileEntity::delay() +void MobSpawnerTileEntity::TileEntityMobSpawner::setNextSpawnData(BaseMobSpawner::SpawnData *nextSpawnData) { - spawnDelay = minSpawnDelay + level->random->nextInt(maxSpawnDelay - minSpawnDelay); + BaseMobSpawner::setNextSpawnData(nextSpawnData); + if (getLevel() != NULL) getLevel()->sendTileUpdated(m_parent->x, m_parent->y, m_parent->z); +} + +MobSpawnerTileEntity::MobSpawnerTileEntity() +{ + spawner = new TileEntityMobSpawner(this); +} + +MobSpawnerTileEntity::~MobSpawnerTileEntity() +{ + 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)) + float dmg = (float) getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->getValue(); + int knockback = 0; + + + if ( target->instanceof(eTYPE_LIVINGENTITY) ) { - dmg += (3 << getEffect(MobEffect::damageBoost)->getAmplifier()); - } - if (hasEffect(MobEffect::weakness)) - { - 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)) + double within = getFollowDistance(); + + vector > *entities = mob->level->getEntitiesOfClass(targetType, mob->bb->grow(within, 4, within), selector); + + bool result = false; + if(entities != NULL && !entities->empty() ) { - shared_ptr potentialTarget = mob->level->getNearestAttackablePlayer(mob->shared_from_this(), within); - if (canAttack(potentialTarget, false)) - { - target = weak_ptr(potentialTarget); - return true; - } - } - else - { - 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); - - vector *pendingChildren = &start->pendingChildren; - while (!pendingChildren->empty()) - { - int pos = random->nextInt((int)pendingChildren->size()); - AUTO_VAR(it, pendingChildren->begin() + pos); - StructurePiece *structurePiece = *it; - pendingChildren->erase(it); - structurePiece->addChildren(start, &pieces, random); - } - - calculateBoundingBox(); - moveInsideHeights(level, random, 48, 70); + // 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()) + { + int pos = random->nextInt((int)pendingChildren->size()); + AUTO_VAR(it, pendingChildren->begin() + pos); + StructurePiece *structurePiece = *it; + pendingChildren->erase(it); + structurePiece->addChildren(start, &pieces, random); + } + + 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; + 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(); - }; + 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 - { - 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 - { - private: - static const int width = 13; - static const int height = 14; - static const int depth = 13; + 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(); + 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; + + 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); - }; + 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 + /** + * + * + */ + 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); - }; + 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 + /** + * + * + */ + 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); - /** - * - * - */ - class CastleSmallCorridorLeftTurnPiece : public NetherBridgePiece + 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 { + 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; + 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); - } - } - } - } + 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) + 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); - } + 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")); + // Do nothing + } + else +#endif + { + 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() ) { - double xx = x0 + (x1 - x0) * d / count; - double yy = y0 + (y1 - y0) * d / count; - double zz = z0 + (z1 - z0) * d / count; + 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 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; - 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); + double halfR = r/2; + double halfHR = halfR; //hr/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( earlyReject ) continue; - - for (int x2 = xt0; x2 <= xt1; x2++) + if( doEarlyRejectTest ) { - double xd = ((x2 + 0.5) - xx) / (r / 2); - if (xd * xd < 1) + 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); + + double halfRSq = halfR * halfR; + + double xd = xd0; + for (int x2 = xt0; x2 <= xt1; x2++, xd++) + { + 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..f1630db5 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); @@ -161,9 +169,9 @@ Packet::Packet() : createTime( System::currentTimeMillis() ) unordered_map Packet::idToCreateMap; -unordered_set Packet::clientReceivedPackets = unordered_set(); -unordered_set Packet::serverReceivedPackets = unordered_set(); -unordered_set Packet::sendToAnyClientPackets = unordered_set(); +unordered_set Packet::clientReceivedPackets; +unordered_set Packet::serverReceivedPackets; +unordered_set Packet::sendToAnyClientPackets; // 4J Added unordered_map Packet::outgoingStatistics = unordered_map(); @@ -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; - // 4J Added - __int64 countSamples[512]; - __int64 sizeSamples[512]; - int samplesPos; - __int64 firstSampleTime; + static const int TOTAL_TICKS = 100; + // 4J Added + __int64 countSamples[TOTAL_TICKS]; + __int64 sizeSamples[TOTAL_TICKS]; + __int64 timeSamples[TOTAL_TICKS]; + int samplesPos; 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); - } - } - } - } + y->f = y->g + y->h; + openSet.insert(y); + } + } + } + } - if (closest == from) return NULL; - return reconstruct_path(from, closest); + 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; - } + count++; + n = n->cameFrom; + } - NodeArray nodes = NodeArray(count); - n = to; - nodes.data[--count] = n; - while (n->cameFrom != NULL) + 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() { - return 10; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); +} + +void Pig::newServerAiStep() +{ + 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) { - if(!Animal::interact(player)) + playSound(eSoundType_MOB_PIG_STEP, 0.15f, 1); +} + +bool Pig::mobInteract(shared_ptr 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 + _init(); - // 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(); + fireImmune = 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 - health = getMaxHealth(); +void PigZombie::registerAttributes() +{ + Zombie::registerAttributes(); - _init(); - - 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) { - if (--playAngrySoundIn == 0) + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_ATTACKING); + + if (attackTarget != NULL) { - level->playSound(shared_from_this(), eSoundType_MOB_ZOMBIEPIG_ZPIGANGRY, getSoundVolume() * 2, ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) * 1.8f); - } - } - Zombie::tick(); + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_ATTACKING)); + } + } + lastAttackTarget = attackTarget; + + if (playAngrySoundIn > 0) + { + if (--playAngrySoundIn == 0) + { + 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(); + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::sword_gold)) ); +} + +MobGroupData *PigZombie::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param +{ + Zombie::finalizeMobSpawn(groupData); setVillager(false); -} - -shared_ptr PigZombie::getCarriedItem() -{ - // TODO 4J - could be of const shared_ptr type. - return (shared_ptr ) sword; -} + 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 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->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; + // 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; + 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) + if (!level->isClientSide) { - level->setDataNoUpdate(x, y, z, facing | EXTENDED_BIT); - } - else - { - 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]; + } - while (cx != sx || cy != sy || cz != sz) + 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) { - 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; + } - return true; + cx = ex; + cy = ey; + cz = ez; + count = 0; + + 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..e0fa26ad 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->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+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); } 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,8 @@ void Player::ride(shared_ptr e) return; } - Mob::ride(e); + this->abilities.flying = false; + LivingEntity::ride(e); } void Player::setPlayerDefaultSkin(EDefaultSkins skin) @@ -927,10 +947,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 +985,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 +1001,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 +1039,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 +1073,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 +1101,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 +1115,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 +1154,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 +1167,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 +1211,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 +1244,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 +1261,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 +1282,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 +1300,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 +1329,27 @@ void Player::addAdditonalSaveData(CompoundTag *entityTag) } -Pos *Player::getRespawnPosition(Level *level, CompoundTag *entityTag) -{ - 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(); -} - bool Player::openContainer(shared_ptr container) { return true; } -bool Player::startEnchanting(int x, int y, int z) +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, const wstring &name) { return true; } @@ -1310,8 +1364,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 +1380,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 +1406,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; + return true; } -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; - -} - -void Player::hurtArmor(int damage) +void Player::hurtArmor(float damage) { inventory->hurtArmor(damage); } @@ -1450,29 +1451,36 @@ 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); - causeFoodExhaustion(source->getFoodExhaustion()); - //this->Mob::actuallyHurt(source, dmg); - health -= dmg; -} + float originalDamage = dmg; + dmg = max(dmg - getAbsorptionAmount(), 0.0f); + setAbsorptionAmount(getAbsorptionAmount() - (originalDamage - dmg)); + if (dmg == 0) return; + + causeFoodExhaustion(source->getFoodExhaustion()); + float oldHealth = getHealth(); + setHealth(getHealth() - dmg); + getCombatTracker()->recordDamage(source, oldHealth, dmg); +} bool Player::openFurnace(shared_ptr container) { @@ -1484,7 +1492,7 @@ bool Player::openTrap(shared_ptr container) return true; } -void Player::openTextEdit(shared_ptr sign) +void Player::openTextEdit(shared_ptr sign) { } @@ -1493,7 +1501,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 +1522,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 +1581,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 +1588,22 @@ void Player::attack(shared_ptr entity) return; } - int dmg = inventory->getAttackDamage(entity); + if (entity->skipAttackInteraction(shared_from_this())) + { + return; + } - if (hasEffect(MobEffect::damageBoost)) - { - dmg += (3 << getEffect(MobEffect::damageBoost)->getAmplifier()); - } - if (hasEffect(MobEffect::weakness)) - { - dmg -= (2 << getEffect(MobEffect::weakness)->getAmplifier()); - } + 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 +1612,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 +1657,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() ) ); + shared_ptr multiMob = dynamic_pointer_cast((dynamic_pointer_cast(entity))->parentMob.lock()); + if ( (multiMob != NULL) && multiMob->instanceof(eTYPE_LIVINGENTITY) ) + { + hurtTarget = dynamic_pointer_cast( multiMob ); + } + } + if ( (item != NULL) && hurtTarget->instanceof(eTYPE_LIVINGENTITY) ) + { + item->hurtEnemy(dynamic_pointer_cast(hurtTarget), dynamic_pointer_cast( shared_from_this() ) ); if (item->count <= 0) { removeSelectedItem(); } } - if (dynamic_pointer_cast( entity ) != NULL) + if ( entity->instanceof(eTYPE_LIVINGENTITY) ) { - if (entity->isAlive()) - { - directAllTameWolvesOnTarget(dynamic_pointer_cast(entity), true); - } - // 4J Stu - Brought forward wasHurt check to Fix 66140 - Bug: Fire Aspect bypasses "Player v Player" being Disabled + //awardStat(Stats.damageDealt, (int) Math.round(dmg * 10)); + if (fireAspect > 0 && wasHurt) { entity->setOnFire(fireAspect * 4); @@ -1670,6 +1699,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 +1741,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 +1751,7 @@ void Player::remove() bool Player::isInWall() { - return !m_isSleeping && this->Mob::isInWall(); + return !m_isSleeping && LivingEntity::isInWall(); } bool Player::isLocalPlayer() @@ -1759,6 +1793,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 +1813,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 +1935,7 @@ void Player::stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool save } if (saveRespawnPoint) { - setRespawnPosition(bedPosition); + setRespawnPosition(bedPosition, false); } } @@ -1909,7 +1946,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 +1958,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 +2051,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 +2081,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 +2103,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 +2199,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 +2246,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 +2256,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 +2285,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 +2339,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 +2379,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 +2392,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 +2429,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 +2487,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 +2549,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 +2560,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 +2602,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 +2713,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 +2922,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 c323bf05..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; @@ -539,13 +542,15 @@ private: #endif }; -typedef struct +struct PlayerKeyHash { - int operator() (const shared_ptr k) const { return Player::hash_fnct (k); } + inline int operator() (const shared_ptr k) const + { return Player::hash_fnct (k); } +}; -} PlayerKeyHash; - -typedef struct +struct PlayerKeyEq { - bool operator() (const shared_ptr x, const shared_ptr y) const { return Player::eq_test (x, y); } -} PlayerKeyEq; + inline bool operator() (const shared_ptr x, const shared_ptr y) const + { return Player::eq_test (x, y); } +}; + diff --git a/Minecraft.World/PlayerAbilitiesPacket.cpp b/Minecraft.World/PlayerAbilitiesPacket.cpp index 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; } - -void PortalForcer::force(Level *level, shared_ptr e) +PortalForcer::PortalForcer(ServerLevel *level) { - if (level->dimension->id == 1) + this->level = level; + random = new Random(level->getSeed()); +} + +PortalForcer::~PortalForcer() +{ + for(AUTO_VAR(it,cachedPortals.begin()); it != cachedPortals.end(); ++it) { - int x = Mth::floor(e->x); - int y = Mth::floor(e->y) - 1; - int z = Mth::floor(e->z); + delete it->second; + } +} - int xa = 1; - int za = 0; - for (int b = -2; b <= 2; b++) +void PortalForcer::force(shared_ptr e, double xOriginal, double yOriginal, double zOriginal, float yRotOriginal) +{ + 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 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++) - { - double xd = (x + 0.5) - e->x; - for (int z = zc - r; z <= zc + r; z++) - { - double zd = (z + 0.5) - e->z; - for (int y = level->getHeight() - 1; y >= 0; y--) - { - if (level->getTile(x, y, z) == Tile::portalTile_Id) - { - while (level->getTile(x, y - 1, z) == Tile::portalTile_Id) - { - y--; - } + long hash = ChunkPos::hashCode(xc, zc); + bool updateCache = true; - double yd = (y + 0.5) - e->y; - double dist = xd * xd + yd * yd + zd * zd; - if (closest < 0 || dist < closest) + 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 + { + for (int x = xc - r; x <= xc + r; x++) + { + double xd = (x + 0.5) - e->x; + for (int z = zc - r; z <= zc + r; z++) + { + double zd = (z + 0.5) - e->z; + for (int y = level->getHeight() - 1; y >= 0; y--) + { + if (level->getTile(x, y, z) == Tile::portalTile_Id) { - closest = dist; - xTarget = x; - yTarget = y; - zTarget = z; + 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; + } } } } @@ -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 { +public: + class PortalPosition : public Pos + { + public: + __int64 lastUsed; + + PortalPosition(int x, int y, int z, __int64 time); + }; + private: + ServerLevel *level; Random *random; + unordered_map<__int64, PortalPosition *> cachedPortals; + vector<__int64> cachedPortalKeys; public: - // 4J Stu Added - Java has no ctor, but we need to initialise random - PortalForcer(); + PortalForcer(ServerLevel *level); + ~PortalForcer(); - void force(Level *level, shared_ptr e); - -public: - bool findPortal(Level *level, shared_ptr e); - -public: - bool createPortal(Level *level, shared_ptr e); + 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; - } + 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)// - )) + 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; -} + vector< shared_ptr > *entities = NULL; -bool PressurePlateTile::blocksLight() -{ - return false; -} + 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. -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) + if (entities != NULL && !entities->empty()) { - 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; + 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; + } + } } - 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); - - 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 ) - { - delete entities; - } -} - -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: + +public: 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); -}; + +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) -{ - if (level->isClientSide) return; - Rail *rail = new Rail(level, x, y, z); - rail->place(level->hasNeighborSignal(x, y, z), first); - delete rail; -} - -bool RailTile::findGoldenRailSignal(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 (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) + BaseRailTile::registerIcons(iconRegister); + iconTurn = iconRegister->registerIcon(getIconName() + L"_turned"); +} + +void RailTile::updateState(Level *level, int x, int y, int z, int data, int dir, int type) +{ + if (type > 0 && Tile::tiles[type]->isSignalSource()) { - iconTurn = iconRegister->registerIcon(L"goldenRail_powered"); - } - else - { - iconTurn = iconRegister->registerIcon(L"rail_turn"); + if (Rail(level, x, y, z).countPotentialConnections() == 3) + { + updateDir(level, x, y, z, false); + } } } \ 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 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; + 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++) + 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; + } - s0 += s0a; - s1 += s1a; - s2 += s2a; - s3 += s3a; - } - } - } - } + 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; - } + 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; - } + 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(); +} + +RandomScatteredLargeFeature::RandomScatteredLargeFeature(unordered_map options) +{ + _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 featureSpacing = 32; - int minFeatureSeparation = 8; - 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(Level *level, Random *random, int chunkX, int chunkZ) +RandomScatteredLargeFeature::ScatteredFeatureStart::ScatteredFeatureStart() { - if (level->getBiome(chunkX * 16 + 8, chunkZ * 16 + 8) == Biome::jungle) + // for reflection +} + +RandomScatteredLargeFeature::ScatteredFeatureStart::ScatteredFeatureStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) +{ + 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) { - Recipy *r = *it; //recipies->at(i); - if (r->matches(craftSlots, level)) return r->assemble(craftSlots); + if (recipesClass->matches(craftSlots, level)) return recipesClass->assemble(craftSlots); + } + else + { + 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]; + eMinecraftColour color = getRarity(shared_ptr())->color; - swprintf(formatted, 256, L"%ls",colour,L"C418 - ", recording.c_str()); + wchar_t text[256]; + swprintf(text, 256, L"%ls %ls", L"C418 -", recording.c_str()); - lines->push_back(formatted); - - 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); - if (neighborSignal) + shouldSignal = false; + int neighborSignal = level->getBestNeighborSignal(x, y, z); + shouldSignal = true; + + 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; + level->setData(x, y, z, target, Tile::UPDATE_CLIENTS); - 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++; - - 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..8c85d0c3 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,10 +55,10 @@ shared_ptr ResultContainer::removeItemNoUpdate(int slot) void ResultContainer::setItem(unsigned int slot, shared_ptr item) { - (*items)[0] = item; + items[0] = item; } -int ResultContainer::getMaxStackSize() +int ResultContainer::getMaxStackSize() const { return Container::LARGE_MAX_STACK_SIZE; } @@ -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..53d80403 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 int getMaxStackSize() const; 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..a5f551e2 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,28 +85,46 @@ unsigned int SimpleContainer::getContainerSize() return size; } -int SimpleContainer::getName() +wstring SimpleContainer::getName() { - return name; + return stringName.empty() ? app.GetString(name) : stringName; } -int SimpleContainer::getMaxStackSize() +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() const { return Container::LARGE_MAX_STACK_SIZE; } 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..bb22d141 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() const; + 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,31 +22,48 @@ #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(); +} + +Skeleton::~Skeleton() +{ + 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); } bool Skeleton::useNewAi() @@ -48,31 +71,37 @@ bool Skeleton::useNewAi() return true; } -int Skeleton::getMaxHealth() -{ - return 20; -} - 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; - -shared_ptr Skeleton::getCarriedItem() +void Skeleton::playStepSound(int xt, int yt, int zt, int t) { - return bow; + playSound(eSoundType_MOB_SKELETON_STEP, 0.15f, 1); +} + +bool Skeleton::doHurtTarget(shared_ptr target) +{ + 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) - { - 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); + } + } + } + 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) { - shared_ptr bow = shared_ptr( new ItemInstance(Item::bow) ); - EnchantmentHelper::enchantItem(random, bow, 5); - spawnAtLocation(bow, 0); - } - else - { - spawnAtLocation(Item::bow_Id, 1); + spawnAtLocation( shared_ptr( new ItemInstance(Item::skull_Id, 1, SkullTileEntity::TYPE_WITHER) ), 0); } } -void Skeleton::staticCtor() +void Skeleton::populateDefaultEquipmentSlots() { - Skeleton::bow = shared_ptr( new ItemInstance(Item::bow, 1) ); + 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) + { + goalSelector.addGoal(4, bowGoal, false); + } + else + { + goalSelector.addGoal(4, meleeGoal, false); + } +} + +void Skeleton::performRangedAttack(shared_ptr target, float power) +{ + 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); } - Skeleton(Level *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) { + if (placedSkull->getSkullType() == SkullTileEntity::TYPE_WITHER && y >= 2 && level->difficulty > Difficulty::PEACEFUL && !level->isClientSide) + { + // Check wither boss spawn + int ss = Tile::soulsand_Id; - // check wither boss spawn - - final int ss = Tile.hellSand.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->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); - 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); + // 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); + } - 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(eParticleType_snowballpoof, x + level->random->nextDouble(), y - 2 + level->random->nextDouble() * 3.9, z + zo + 1 + level->random->nextDouble(), 0, 0, 0); + } - 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); - 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; + 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->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); + 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); - 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); - } + // 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); - 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); - } + 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); + } - 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); + 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); + } - return; + 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..a5a53a48 100644 --- a/Minecraft.World/Slot.cpp +++ b/Minecraft.World/Slot.cpp @@ -91,7 +91,7 @@ void Slot::setChanged() container->setChanged(); } -int Slot::getMaxStackSize() +int Slot::getMaxStackSize() const { return container->getMaxStackSize(); } @@ -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..70f9a3c3 100644 --- a/Minecraft.World/Slot.h +++ b/Minecraft.World/Slot.h @@ -31,11 +31,12 @@ public: virtual bool hasItem(); virtual void set(shared_ptr item); virtual void setChanged(); - virtual int getMaxStackSize(); + virtual int getMaxStackSize() const; virtual Icon *getNoItemIcon(); 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() +void Spider::registerAttributes() { - return 16; -} + Monster::registerAttributes(); -double Spider::getRideHeight() -{ - return bbHeight * 0.75 - 0.5f; -} - -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; - } + 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->setTile(x, y + hh, z, Tile::unbreakable_Id); + 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; + 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; + 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++; + 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::stoneBrickSmooth->getTexture(face); - } - return Tile::rock->getTexture(face); + return Tile::cobblestone->getTexture(face); + } + if (data == HOST_STONEBRICK) + { + 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 +} - StrongholdPieces::StartPiece *startRoom = new StrongholdPieces::StartPiece(0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2, level); - pieces.push_back(startRoom); - startRoom->addChildren(startRoom, &pieces, random); +StrongholdFeature::StrongholdStart::StrongholdStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) +{ + StrongholdPieces::resetPieces(); - vector *pendingChildren = &startRoom->pendingChildren; - while (!pendingChildren->empty()) + 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()) { - 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) + 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; - } + 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) + 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; - } + 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); - - if (collisionPiece == NULL) + StructurePiece *collisionPiece = StructurePiece::findCollisionPiece(pieces, box); + + 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++) + // 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++) + // 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(int genDepth, Random *random, int west, int north) : StrongholdPiece(genDepth), isSource(true), entryDoor(OPENING) +StrongholdPieces::StairsDown::StairsDown() { - orientation = random->nextInt(4); + // for reflection +} - switch (orientation) +StrongholdPieces::StairsDown::StairsDown(int genDepth, Random *random, int west, int north) : StrongholdPiece(genDepth), isSource(true) +{ + orientation = random->nextInt(4); + entryDoor = OPENING; + + 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(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), - entryDoor(randomSmallDoor(random)), - leftChild(random->nextInt(2) == 0), - rightChild(random->nextInt(2) == 0) +StrongholdPieces::Straight::Straight() { - orientation = direction; - boundingBox = stairsBox; + // for reflection +} + +StrongholdPieces::Straight::Straight(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), + 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) +{ + 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() { - orientation = direction; - boundingBox = stairsBox; + // for reflection +} + +StrongholdPieces::StraightStairsDown::StraightStairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) +{ + 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; + return true; } - -StrongholdPieces::RoomCrossing::RoomCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)), type(random->nextInt(5)) +StrongholdPieces::RoomCrossing::RoomCrossing() { - orientation = direction; - boundingBox = stairsBox; + // for reflection +} + +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); +} + +void StrongholdPieces::RoomCrossing::readAdditonalSaveData(CompoundTag *tag) +{ + 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)) + 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, 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); + // 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) + 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: + 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(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) +StrongholdPieces::PrisonHall::PrisonHall() { - orientation = direction; - boundingBox = stairsBox; + // for reflection +} + +StrongholdPieces::PrisonHall::PrisonHall(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) +{ + 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); + // 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); + // 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); + // 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); - return true; + return true; } -StrongholdPieces::Library::Library(int genDepth, Random *random, BoundingBox *roomBox, int direction) : StrongholdPiece(genDepth), - entryDoor(randomSmallDoor(random)), - isTall(roomBox->getYSpan() > height) +StrongholdPieces::Library::Library() { - orientation = direction; - boundingBox = roomBox; + isTall = false; + // for reflection +} + +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); +} + +void StrongholdPieces::Library::readAdditonalSaveData(CompoundTag *tag) +{ + 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); - } - } - } + 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) + // 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); - } + 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) + 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); + // 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); + 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); + // 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); + // 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); + // 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::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); - } + 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) + // 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)); - } + 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; + return true; } -StrongholdPieces::FiveCrossing::FiveCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) +StrongholdPieces::FiveCrossing::FiveCrossing() { - orientation = direction; - boundingBox = stairsBox; + leftLow = leftHigh = rightLow = rightHigh = false; + // for reflection +} - leftLow = random->nextBoolean(); - leftHigh = random->nextBoolean(); - rightLow = random->nextBoolean(); - rightHigh = random->nextInt(3) > 0; +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; - } + 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); + // 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); + // 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); + // 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); + // 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); + // 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. - * - */ + static bool isOkBox(BoundingBox *box, StartPiece *startRoom); // 4J added startRoom param + }; + + /** + * 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); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + 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; - public: - 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); - }; + int type; - /** - * - * - */ + public: + RoomCrossing(); + RoomCrossing(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 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); - class PortalRoom : public StrongholdPiece + 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 { + 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++ ) + + for( int i = 0; i <= MAX_ID_VALUE; i++ ) { - shared_ptr dataItem = (*it).second; - - size += 1; - - // write value - switch (dataItem->getType()) + 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 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; + 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++) + 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 { - } + tileId = Tile::endStone_Id; + } else { + } - blocks[offs] = (byte) tileId; - offs += step; - val += vala; - } - _s0 += _s0a; - _s1 += _s1a; - } + blocks[offs] = (byte) tileId; + offs += step; + val += vala; + } + _s0 += _s0a; + _s1 += _s1a; + } - s0 += s0a; - s1 += s1a; - s2 += s2a; - s3 += s3a; - } - } - } - } + 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; - } + top = 0; + material = (byte) Tile::endStone_Id; + } - run = runDepth; - if (y >= 0) blocks[offs] = top; - else blocks[offs] = material; - } + 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 95cab285..277be1f8 100644 --- a/Minecraft.World/TickNextTickData.cpp +++ b/Minecraft.World/TickNextTickData.cpp @@ -1,8 +1,8 @@ #include "stdafx.h" - +#include "net.minecraft.world.level.tile.h" #include "TickNextTickData.h" -__int64 TickNextTickData::C = 0; +int64_t TickNextTickData::C = 0; TickNextTickData::TickNextTickData(int x, int y, int z, int tileId) { @@ -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 l) +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 41ee99da..04d9ed5e 100644 --- a/Minecraft.World/TickNextTickData.h +++ b/Minecraft.World/TickNextTickData.h @@ -1,46 +1,53 @@ #pragma once +#include + // 4J Stu - In Java TickNextTickData implements Comparable // We don't need to do that as it is only as helper for the java sdk sorting operations class TickNextTickData { private: - static __int64 C; + static int64_t C; public: int x, y, z, tileId; __int64 m_delay; + int priorityTilt; private: - __int64 c; + int64_t c; 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 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); }; -typedef struct +struct TickNextTickDataKeyHash { - int operator() (const TickNextTickData &k) const { return TickNextTickData::hash_fnct (k); } + int operator() (const TickNextTickData &k) const + { return TickNextTickData::hash_fnct (k); } +}; -} TickNextTickDataKeyHash; - -typedef struct +struct TickNextTickDataKeyEq { - bool operator() (const TickNextTickData &x, const TickNextTickData &y) const { return TickNextTickData::eq_test (x, y); } -} TickNextTickDataKeyEq; + bool operator() (const TickNextTickData &x, const TickNextTickData &y) const + { return TickNextTickData::eq_test (x, y); } +}; -typedef struct +struct TickNextTickDataKeyCompare { - bool operator() (const TickNextTickData &x, const TickNextTickData &y) const { return TickNextTickData::compare_fnct (x, y); } + bool operator() (const TickNextTickData &x, const TickNextTickData &y) const + { return TickNextTickData::compare_fnct (x, y); } -} TickNextTickDataKeyCompare; \ No newline at end of file +}; \ No newline at end of file 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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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); + 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); - // 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::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::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::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::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::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::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::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::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) +int Tile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - return false; -} - -bool 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,13 +1358,67 @@ 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) { } +bool Tile::useOwnCloneData() +{ + return false; +} + +bool Tile::canInstantlyTick() +{ + return true; +} + +bool Tile::dropFromExplosion(Explosion *explosion) +{ + 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::setIconName(const wstring &iconName) +{ + 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(m_textureName); + icon = iconRegister->registerIcon(getIconName()); } wstring Tile::getTileItemIconName() @@ -1347,12 +1426,6 @@ wstring Tile::getTileItemIconName() return L""; } -Tile *Tile::setTextureName(const wstring &name) -{ - m_textureName = name; - return this; -} - 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 const int clayHardened_Id = 172; + static const int coalBlock_Id = 173; - 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 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_STRING_NAMES[ TreeTile::TREE_NAMES_LENGTH] = {L"oak", L"spruce", L"birch", L"jungle"}; + const wstring TreeTile::TREE_TEXTURES[] = {L"tree_side", L"tree_spruce", L"tree_birch", L"tree_jungle"}; -TreeTile::TreeTile(int id) : Tile(id, Material::wood) +TreeTile::TreeTile(int id) : RotatedPillarTile(id, Material::wood) { - icons = NULL; - iconTop = NULL; -} - -int TreeTile::getRenderShape() -{ - 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; } +VillageFeature::VillageFeature(int iXZSize) +{ + _init(iXZSize); +} + +VillageFeature::VillageFeature(unordered_map options, int iXZSize) +{ + _init(iXZSize); + + for (AUTO_VAR(it,options.begin()); it != options.end(); ++it) + { + 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); + } + } +} + +wstring VillageFeature::getFeatureName() +{ + return L"Village"; +} + bool VillageFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) { - int townSpacing; + int townSpacing = this->townSpacing; + if(!bIsSuperflat #ifdef _LARGE_WORLDS - if(level->dimension->getXZSize() > 128) - { - townSpacing = 32; - } - else + && level->dimension->getXZSize() < 128 #endif - if(bIsSuperflat) - { - townSpacing= 32; - } - else - { - townSpacing= 16;// 4J change 32; - } - - 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 ) - { - forcePlacement = levelGenOptions->isFeatureChunk(x,z,eFeature_Village); - } - - 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; - } - } + townSpacing= 16;// 4J change 32; + } - return false; + 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 ) + { + forcePlacement = levelGenOptions->isFeatureChunk(x,z,eFeature_Village); + } + + 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; - int heightPosition; - const bool lowCeiling; - const int tablePlacement; + private: + static const int width = 4; + static const int height = 6; + static const int depth = 5; - 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); - }; + bool lowCeiling; + int tablePlacement; + + public: + SmallHut(); + SmallHut(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + 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; - } - } - } - } - } + newFacings &= ~facing; + } + } + } + } + } - if (newFacings == 0) + 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; + // 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]))) + // 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::getTierDamage() +{ + return tier->getAttackDamageBonus(); } float WeaponItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { - if (tile->id == Tile::web_Id) + if (tile->id == Tile::web_Id) { - // swords can quickly cut web - return 15; - } - return 1.5f; + // 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::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool WeaponItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { - itemInstance->hurt(1, attacker); - return true; -} - -bool WeaponItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) -{ - // Don't damage weapons if the tile can be destroyed in one hit. - if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurt(2, owner); + 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); + +protected: + virtual void registerAttributes(); + +public: virtual bool useNewAi(); - virtual void setTarget(shared_ptr target); + virtual void setTarget(shared_ptr target); protected: virtual void serverAiMobStep(); - -public: - virtual int getMaxHealth(); - -protected: 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,52 +3,65 @@ #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::registerAttributes() +{ + Monster::registerAttributes(); + + // 4J Stu - Don't make it so far! + //getAttribute(SharedMonsterAttributes::FOLLOW_RANGE)->setBaseValue(40); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.23f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(3); + + getAttributes()->registerAttribute(SPAWN_REINFORCEMENTS_CHANCE)->setBaseValue(random->nextDouble() * 0.10f); } void Zombie::defineSynchedData() @@ -60,24 +73,11 @@ void Zombie::defineSynchedData() getEntityData()->define(DATA_CONVERTING_ID, (byte) 0); } -float Zombie::getWalkingSpeedModifier() -{ - return Monster::getWalkingSpeedModifier() * (isBaby() ? 1.5f : 1.0f); -} - -int Zombie::getTexture() -{ - return isVillager() ? TN_MOB_ZOMBIE_VILLAGER : TN_MOB_ZOMBIE; -} - -int Zombie::getMaxHealth() -{ - return 20; -} - 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); - if (level->random->nextFloat() < 0.05f) + setCanPickUpLoot(random->nextFloat() < MAX_PICKUP_LOOT_CHANCE * difficulty); + + if (groupData == NULL) { - setVillager(true); + groupData = new ZombieGroupData(level->random->nextFloat() < 0.05f, level->random->nextFloat() < 0.05f); + } + + if ( dynamic_cast( groupData ) != NULL) + { + 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 72727e20..b6dd56d9 100644 --- a/Minecraft.World/system.cpp +++ b/Minecraft.World/system.cpp @@ -52,7 +52,22 @@ void System::arraycopy(arrayWithLength src, unsigned int srcPos, arrayWithL //The current value of the system timer, in nanoseconds. __int64 System::nanoTime() { +#if defined _WINDOWS64 || defined _XBOX || defined _WIN32 + static LARGE_INTEGER s_frequency = { 0 }; + if (s_frequency.QuadPart == 0) + { + QueryPerformanceFrequency(&s_frequency); + } + + LARGE_INTEGER counter; + QueryPerformanceCounter(&counter); + + // Using double to avoid 64-bit overflow during multiplication for long uptime + // Precision is sufficient for ~100 days of uptime. + return (__int64)((double)counter.QuadPart * 1000000000.0 / (double)s_frequency.QuadPart); +#else return GetTickCount() * 1000000LL; +#endif } //Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, @@ -109,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..b89998ac 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; @@ -215,10 +215,17 @@ public: int GetUserIndex(); void SetCustomDataValue(ULONG_PTR ulpCustomDataValue); ULONG_PTR GetCustomDataValue(); + + BYTE m_smallId; + bool m_isRemote; + bool m_isHostPlayer; + wchar_t m_gamertag[32]; private: ULONG_PTR m_customData; }; +void Win64_SetupRemoteQNetPlayer(IQNetPlayer* player, BYTE smallId, bool isHost, bool isLocal); + const int QNET_GETSENDQUEUESIZE_SECONDARY_TYPE = 0; const int QNET_GETSENDQUEUESIZE_MESSAGES = 0; const int QNET_GETSENDQUEUESIZE_BYTES = 0; @@ -309,9 +316,12 @@ public: bool IsHost(); HRESULT JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO *pInviteInfo); void HostGame(); - void EndGame(); + void ClientJoinGame(); + void EndGame(); - static IQNetPlayer m_player[4]; + static IQNetPlayer m_player[MINECRAFT_NET_MAX_PLAYERS]; + static DWORD s_playerCount; + static bool s_isHosting; }; #ifdef _DURANGO @@ -332,6 +342,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 +571,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/MinecraftConsoles.sln b/MinecraftConsoles.sln index 59897afe..1ce39567 100644 --- a/MinecraftConsoles.sln +++ b/MinecraftConsoles.sln @@ -1,6 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.37012.4 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minecraft.World", "Minecraft.World\Minecraft.World.vcxproj", "{F046C3CE-9749-4823-B32B-D9CC10B1A2C8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minecraft.Client", "Minecraft.Client\Minecraft.Client.vcxproj", "{1B9A8C38-DD48-448C-AA24-E1A35E0089A3}" @@ -10,36 +12,42 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minecraft.Client", "Minecra EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + ContentPackage_NO_TU|ARM64EC = ContentPackage_NO_TU|ARM64EC ContentPackage_NO_TU|Durango = ContentPackage_NO_TU|Durango ContentPackage_NO_TU|ORBIS = ContentPackage_NO_TU|ORBIS ContentPackage_NO_TU|PS3 = ContentPackage_NO_TU|PS3 ContentPackage_NO_TU|PSVita = ContentPackage_NO_TU|PSVita ContentPackage_NO_TU|Windows64 = ContentPackage_NO_TU|Windows64 ContentPackage_NO_TU|Xbox 360 = ContentPackage_NO_TU|Xbox 360 + CONTENTPACKAGE_SYMBOLS|ARM64EC = CONTENTPACKAGE_SYMBOLS|ARM64EC CONTENTPACKAGE_SYMBOLS|Durango = CONTENTPACKAGE_SYMBOLS|Durango CONTENTPACKAGE_SYMBOLS|ORBIS = CONTENTPACKAGE_SYMBOLS|ORBIS CONTENTPACKAGE_SYMBOLS|PS3 = CONTENTPACKAGE_SYMBOLS|PS3 CONTENTPACKAGE_SYMBOLS|PSVita = CONTENTPACKAGE_SYMBOLS|PSVita CONTENTPACKAGE_SYMBOLS|Windows64 = CONTENTPACKAGE_SYMBOLS|Windows64 CONTENTPACKAGE_SYMBOLS|Xbox 360 = CONTENTPACKAGE_SYMBOLS|Xbox 360 + ContentPackage|ARM64EC = ContentPackage|ARM64EC ContentPackage|Durango = ContentPackage|Durango ContentPackage|ORBIS = ContentPackage|ORBIS ContentPackage|PS3 = ContentPackage|PS3 ContentPackage|PSVita = ContentPackage|PSVita ContentPackage|Windows64 = ContentPackage|Windows64 ContentPackage|Xbox 360 = ContentPackage|Xbox 360 + Debug|ARM64EC = Debug|ARM64EC Debug|Durango = Debug|Durango Debug|ORBIS = Debug|ORBIS Debug|PS3 = Debug|PS3 Debug|PSVita = Debug|PSVita Debug|Windows64 = Debug|Windows64 Debug|Xbox 360 = Debug|Xbox 360 + Release|ARM64EC = Release|ARM64EC Release|Durango = Release|Durango Release|ORBIS = Release|ORBIS Release|PS3 = Release|PS3 Release|PSVita = Release|PSVita Release|Windows64 = Release|Windows64 Release|Xbox 360 = Release|Xbox 360 + ReleaseForArt|ARM64EC = ReleaseForArt|ARM64EC ReleaseForArt|Durango = ReleaseForArt|Durango ReleaseForArt|ORBIS = ReleaseForArt|ORBIS ReleaseForArt|PS3 = ReleaseForArt|PS3 @@ -48,6 +56,8 @@ Global ReleaseForArt|Xbox 360 = ReleaseForArt|Xbox 360 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|ARM64EC.ActiveCfg = ContentPackage_Vita|ARM64EC + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|ARM64EC.Build.0 = ContentPackage_Vita|ARM64EC {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|Durango.ActiveCfg = ContentPackage_NO_TU|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|Durango.Build.0 = ContentPackage_NO_TU|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|ORBIS.ActiveCfg = ContentPackage_NO_TU|ORBIS @@ -60,6 +70,8 @@ Global {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|Xbox 360.ActiveCfg = ContentPackage_NO_TU|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|Xbox 360.Build.0 = ContentPackage_NO_TU|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage_NO_TU|Xbox 360.Deploy.0 = ContentPackage_NO_TU|Xbox 360 + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|ARM64EC.ActiveCfg = CONTENTPACKAGE_SYMBOLS|ARM64EC + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|ARM64EC.Build.0 = CONTENTPACKAGE_SYMBOLS|ARM64EC {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|Durango.ActiveCfg = CONTENTPACKAGE_SYMBOLS|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|Durango.Build.0 = CONTENTPACKAGE_SYMBOLS|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|ORBIS.ActiveCfg = CONTENTPACKAGE_SYMBOLS|ORBIS @@ -70,6 +82,8 @@ Global {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|Windows64.ActiveCfg = CONTENTPACKAGE_SYMBOLS|x64 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|Xbox 360.ActiveCfg = CONTENTPACKAGE_SYMBOLS|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.CONTENTPACKAGE_SYMBOLS|Xbox 360.Build.0 = CONTENTPACKAGE_SYMBOLS|Xbox 360 + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|ARM64EC.ActiveCfg = ContentPackage|ARM64EC + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|ARM64EC.Build.0 = ContentPackage|ARM64EC {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|Durango.ActiveCfg = ContentPackage|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|Durango.Build.0 = ContentPackage|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|ORBIS.ActiveCfg = ContentPackage|ORBIS @@ -83,6 +97,8 @@ Global {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|Xbox 360.ActiveCfg = ContentPackage|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|Xbox 360.Build.0 = ContentPackage|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ContentPackage|Xbox 360.Deploy.0 = ContentPackage|Xbox 360 + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|Durango.ActiveCfg = Debug|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|Durango.Build.0 = Debug|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|Durango.Deploy.0 = Debug|Durango @@ -97,6 +113,8 @@ Global {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|ARM64EC.Build.0 = Release|ARM64EC {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|Durango.ActiveCfg = Release|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|Durango.Build.0 = Release|Durango {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|ORBIS.ActiveCfg = Release|ORBIS @@ -109,6 +127,8 @@ Global {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|Windows64.Build.0 = Release|x64 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.Release|Xbox 360.Build.0 = Release|Xbox 360 + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|ARM64EC.ActiveCfg = ReleaseForArt|ARM64EC + {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|ARM64EC.Build.0 = ReleaseForArt|ARM64EC {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|Durango.ActiveCfg = ReleaseForArt|x64 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|ORBIS.ActiveCfg = ReleaseForArt|ORBIS {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|ORBIS.Build.0 = ReleaseForArt|ORBIS @@ -118,6 +138,8 @@ Global {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|Windows64.ActiveCfg = ReleaseForArt|x64 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|Xbox 360.ActiveCfg = ReleaseForArt|Xbox 360 {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}.ReleaseForArt|Xbox 360.Build.0 = ReleaseForArt|Xbox 360 + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|ARM64EC.ActiveCfg = ContentPackage_Vita|ARM64EC + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|ARM64EC.Build.0 = ContentPackage_Vita|ARM64EC {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|Durango.ActiveCfg = ContentPackage_NO_TU|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|Durango.Build.0 = ContentPackage_NO_TU|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|ORBIS.ActiveCfg = ContentPackage_NO_TU|ORBIS @@ -130,6 +152,8 @@ Global {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|Xbox 360.ActiveCfg = ContentPackage_NO_TU|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|Xbox 360.Build.0 = ContentPackage_NO_TU|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage_NO_TU|Xbox 360.Deploy.0 = ContentPackage_NO_TU|Xbox 360 + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|ARM64EC.ActiveCfg = CONTENTPACKAGE_SYMBOLS|ARM64EC + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|ARM64EC.Build.0 = CONTENTPACKAGE_SYMBOLS|ARM64EC {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|Durango.ActiveCfg = CONTENTPACKAGE_SYMBOLS|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|Durango.Build.0 = CONTENTPACKAGE_SYMBOLS|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|ORBIS.ActiveCfg = CONTENTPACKAGE_SYMBOLS|ORBIS @@ -140,6 +164,8 @@ Global {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|Windows64.ActiveCfg = CONTENTPACKAGE_SYMBOLS|x64 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|Xbox 360.ActiveCfg = CONTENTPACKAGE_SYMBOLS|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.CONTENTPACKAGE_SYMBOLS|Xbox 360.Build.0 = CONTENTPACKAGE_SYMBOLS|Xbox 360 + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|ARM64EC.ActiveCfg = ContentPackage|ARM64EC + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|ARM64EC.Build.0 = ContentPackage|ARM64EC {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|Durango.ActiveCfg = ContentPackage|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|Durango.Build.0 = ContentPackage|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|ORBIS.ActiveCfg = ContentPackage|ORBIS @@ -153,6 +179,8 @@ Global {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|Xbox 360.ActiveCfg = ContentPackage|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|Xbox 360.Build.0 = ContentPackage|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ContentPackage|Xbox 360.Deploy.0 = ContentPackage|Xbox 360 + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|Durango.ActiveCfg = Debug|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|Durango.Build.0 = Debug|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|Durango.Deploy.0 = Debug|Durango @@ -168,6 +196,8 @@ Global {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|ARM64EC.Build.0 = Release|ARM64EC {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|Durango.ActiveCfg = Release|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|Durango.Build.0 = Release|Durango {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|Durango.Deploy.0 = Release|Durango @@ -182,6 +212,8 @@ Global {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|Windows64.Deploy.0 = Release|x64 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.Release|Xbox 360.Build.0 = Release|Xbox 360 + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|ARM64EC.ActiveCfg = ReleaseForArt|ARM64EC + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|ARM64EC.Build.0 = ReleaseForArt|ARM64EC {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Durango.ActiveCfg = ReleaseForArt|x64 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|ORBIS.ActiveCfg = ReleaseForArt|ORBIS {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|ORBIS.Build.0 = ReleaseForArt|ORBIS @@ -195,4 +227,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CD5AC2E4-C1D3-45C3-AC34-06D43B233179} + EndGlobalSection EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 00000000..23cfc253 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# MinecraftConsoles + +[![Discord](https://img.shields.io/badge/Discord-Join%20Server-5865F2?logo=discord&logoColor=white)](https://discord.gg/jrum7HhegA) + +![Tutorial World](.github/TutorialWorld.png) + +## Introduction + +This project contains the source code of Minecraft Legacy Console Edition v1.6.0560.0 (TU19) from https://archive.org/details/minecraft-legacy-console-edition-source-code, with some fixes and improvements applied + +[Nightly Build](https://github.com/smartcmd/MinecraftConsoles/releases/tag/nightly) + +## Platform Support + +- **Windows**: Supported for building and running the project +- **macOS / Linux**: The Windows nightly build may run through Wine or CrossOver based on community reports, but this is unofficial and not currently tested by the maintainers + +## Features + +- Fixed compilation and execution in both Debug and Release mode on Windows using Visual Studio 2022 +- Added support for keyboard and mouse input +- Added fullscreen mode support (toggle using F11) +- (WIP) Disabled V-Sync for better performance +- Added a high-resolution timer path on Windows for smoother high-FPS gameplay timing +- Device's screen resolution will be used as the game resolution instead of using a fixed resolution (1920x1080) +- LAN Multiplayer & Discovery + +## Multiplayer + +Basic LAN multiplayer is available on the Windows build + +- Hosting a multiplayer world automatically advertises it on the local network +- Other players on the same LAN can discover the session from the in-game Join Game menu +- Game connections use TCP port `25565` by default +- LAN discovery uses UDP port `25566` + +This feature is based on [LCEMP](https://github.com/LCEMP/LCEMP/) + +### Launch Arguments + +| Argument | Description | +|--------------------|-----------------------------------------------------------------------------------------------------| +| `-name ` | Sets your in-game username | +| `-server` | Launches a headless server instead of the client | +| `-ip
` | Client mode: manually connect to an IP. Server mode: override the bind IP from `server.properties` | +| `-port ` | Client mode: override the join port. Server mode: override the listen port from `server.properties` | + +Example: +``` +Minecraft.Client.exe -name Steve -ip 192.168.0.25 -port 25565 +``` + +Headless server example: +``` +Minecraft.Client.exe -server -ip 0.0.0.0 -port 25565 +``` + +The headless server also reads and writes `server.properties` in the working directory. If `-ip` / `-port` are omitted in `-server` mode, it falls back to `server-ip` / `server-port` from that file. Dedicated-server host options such as `trust-players`, `pvp`, `fire-spreads`, `tnt`, `difficulty`, `gamemode`, `spawn-animals`, and `spawn-npcs` are persisted there as well. + +## Controls (Keyboard & Mouse) + +- **Movement**: `W` `A` `S` `D` +- **Jump / Fly (Up)**: `Space` +- **Sneak / Fly (Down)**: `Shift` (Hold) +- **Sprint**: `Ctrl` (Hold) or Double-tap `W` +- **Inventory**: `E` +- **Drop Item**: `Q` +- **Crafting**: `C` Use `Q` and `E` to move through tabs (cycles Left/Right) +- **Toggle View (FPS/TPS)**: `F5` +- **Fullscreen**: `F11` +- **Pause Menu**: `Esc` +- **Toggle Mouse Capture**: `Left Alt` (for debugging) +- **Attack / Destroy**: `Left Click` +- **Use / Place**: `Right Click` +- **Select Item**: `Mouse Wheel` or keys `1` to `9` +- **Accept or Decline Tutorial hints**: `Enter` to accept and `B` to decline +- **Game Info (Player list and Host Options)**: `TAB` +- **Toggle HUD**: `F1` +- **Toggle Debug Info**: `F3` +- **Open Debug Overlay**: `F4` +- **Toggle Debug Console**: `F6` + +## Build & Run + +1. Install Visual Studio 2022 +2. Clone the repository +3. Open the project by double-clicking `MinecraftConsoles.sln` +4. Make sure `Minecraft.Client` is set as the Startup Project +5. Set the build configuration to **Debug** (Release is also OK but has some bugs) and the target platform to **Windows64**, then build and run + +### CMake (Windows x64) + +```powershell +cmake -S . -B build -G "Visual Studio 17 2022" -A x64 +cmake --build build --config Debug --target MinecraftClient +``` + +For more information, see [COMPILE.md](COMPILE.md) + +## Known Issues + +- Native builds for platforms other than Windows have not been tested and are most likely non-functional. The Windows nightly build may still run on macOS and Linux through Wine or CrossOver, but that path is unofficial and not currently supported + +## 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..c75b3bf3 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_HelpAndOptionsMenu.cpp" - "Common/UI/UIScene_HowToPlayMenu.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_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,25 @@ 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" + "Windows64/Network/WinsockNetLayer.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/CopyAssets.cmake b/cmake/CopyAssets.cmake index 47b19ca7..a0252f73 100644 --- a/cmake/CopyAssets.cmake +++ b/cmake/CopyAssets.cmake @@ -12,9 +12,28 @@ set(_project_dir "${PROJECT_SOURCE_DIR}/Minecraft.Client") function(copy_tree_if_exists src_rel dst_rel) set(_src "${_project_dir}/${src_rel}") set(_dst "${OUTPUT_DIR}/${dst_rel}") + if(EXISTS "${_src}") file(MAKE_DIRECTORY "${_dst}") - execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_directory "${_src}" "${_dst}") + file(GLOB_RECURSE _files RELATIVE "${_src}" "${_src}/*") + + foreach(_file IN LISTS _files) # if not a source file + if(NOT _file MATCHES "\\.(cpp|c|h|hpp|xml|lang)$") + set(_full_src "${_src}/${_file}") + set(_full_dst "${_dst}/${_file}") + + if(IS_DIRECTORY "${_full_src}") + file(MAKE_DIRECTORY "${_full_dst}") + else() + get_filename_component(_dst_dir "${_full_dst}" DIRECTORY) + file(MAKE_DIRECTORY "${_dst_dir}") + execute_process( + COMMAND "${CMAKE_COMMAND}" -E copy_if_different + "${_full_src}" "${_full_dst}" + ) + endif() + endif() + endforeach() endif() endfunction() @@ -25,10 +44,15 @@ endfunction() function(copy_file_if_exists src_rel dst_rel) set(_src "${PROJECT_SOURCE_DIR}/${src_rel}") set(_dst "${OUTPUT_DIR}/${dst_rel}") + + get_filename_component(_dst_dir "${_dst}" DIRECTORY) + file(MAKE_DIRECTORY "${_dst_dir}") + if(EXISTS "${_src}") - get_filename_component(_dst_dir "${_dst}" DIRECTORY) - file(MAKE_DIRECTORY "${_dst_dir}") - execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${_src}" "${_dst}") + execute_process( + COMMAND "${CMAKE_COMMAND}" -E copy_if_different + "${_src}" "${_dst}" + ) endif() endfunction() @@ -46,24 +70,24 @@ function(copy_first_existing dst_rel) endif() endfunction() -if(CONFIGURATION STREQUAL "Debug") - copy_tree_if_exists("Durango/Sound" "Durango/Sound") - copy_tree_if_exists("music" "music") - copy_tree_if_exists("Windows64/GameHDD" "Windows64/GameHDD") - copy_tree_if_exists("Common/Media" "Common/Media") - copy_tree_if_exists("Common/res" "Common/res") - copy_tree_if_exists("Common/Trial" "Common/Trial") - copy_tree_if_exists("Common/Tutorial" "Common/Tutorial") -else() - copy_tree_if_exists("music" "music") - copy_tree_if_exists("Windows64/GameHDD" "Windows64/GameHDD") - copy_tree_if_exists("Common/Media" "Common/Media") - copy_tree_if_exists("Common/res" "Common/res") - copy_tree_if_exists("Common/Trial" "Common/Trial") - copy_tree_if_exists("Common/Tutorial" "Common/Tutorial") - copy_tree_if_exists("DurangoMedia" "Windows64Media") - copy_tree_if_exists("Windows64Media" "Windows64Media") -endif() +function(remove_directory_if_exists rel_path) + set(_dir "${OUTPUT_DIR}/${rel_path}") + if(EXISTS "${_dir}") + file(REMOVE_RECURSE "${_dir}") + endif() +endfunction() + +copy_tree_if_exists("Durango/Sound" "Windows64/Sound") +copy_tree_if_exists("music" "music") +copy_tree_if_exists("Windows64/GameHDD" "Windows64/GameHDD") +copy_file_if_exists("Minecraft.Client/Common/Media/MediaWindows64.arc" "Common/Media/MediaWindows64.arc") +copy_tree_if_exists("Common/res" "Common/res") +copy_tree_if_exists("Common/Trial" "Common/Trial") +copy_tree_if_exists("Common/Tutorial" "Common/Tutorial") +copy_tree_if_exists("DurangoMedia" "Windows64Media") +copy_tree_if_exists("Windows64Media" "Windows64Media") + +remove_directory_if_exists("Windows64Media/Layout") # Some runtime code asserts if this directory tree is missing. ensure_dir("Windows64/GameHDD") 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" - "WeighedRandom.cpp" - "Wolf.cpp" - "TreeTile.cpp" "WebTile.cpp" + "WeighedRandom.cpp" + "WeighedTreasure.cpp" + "WeightedPressurePlateTile.cpp" + "Witch.cpp" + "WitherBoss.cpp" + "WitherSkull.cpp" + "Wolf.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" )